From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/cp/ChangeLog | 1562 +++ gcc/cp/ChangeLog-1993 | 613 ++ gcc/cp/ChangeLog-1994 | 5412 ++++++++++ gcc/cp/ChangeLog-1995 | 3797 +++++++ gcc/cp/ChangeLog-1996 | 4053 +++++++ gcc/cp/ChangeLog-1997 | 2614 +++++ gcc/cp/ChangeLog-1998 | 6894 ++++++++++++ gcc/cp/ChangeLog-1999 | 6794 ++++++++++++ gcc/cp/ChangeLog-2000 | 7281 +++++++++++++ gcc/cp/ChangeLog-2001 | 3901 +++++++ gcc/cp/ChangeLog-2002 | 4581 ++++++++ gcc/cp/ChangeLog-2003 | 6912 ++++++++++++ gcc/cp/ChangeLog-2004 | 6884 ++++++++++++ gcc/cp/ChangeLog-2005 | 3528 ++++++ gcc/cp/ChangeLog-2006 | 3502 ++++++ gcc/cp/ChangeLog-2007 | 3343 ++++++ gcc/cp/ChangeLog-2008 | 3263 ++++++ gcc/cp/ChangeLog-2009 | 3746 +++++++ gcc/cp/ChangeLog-2010 | 4064 +++++++ gcc/cp/ChangeLog.ptr | 75 + gcc/cp/ChangeLog.tree-ssa | 573 + gcc/cp/Make-lang.in | 328 + gcc/cp/NEWS | 409 + gcc/cp/call.c | 8458 +++++++++++++++ gcc/cp/cfns.gperf | 247 + gcc/cp/cfns.h | 365 + gcc/cp/class.c | 8472 +++++++++++++++ gcc/cp/config-lang.in | 33 + gcc/cp/cp-gimplify.c | 1465 +++ gcc/cp/cp-lang.c | 242 + gcc/cp/cp-objcp-common.c | 226 + gcc/cp/cp-objcp-common.h | 156 + gcc/cp/cp-tree.def | 466 + gcc/cp/cp-tree.h | 5660 ++++++++++ gcc/cp/cvt.c | 1680 +++ gcc/cp/cxx-pretty-print.c | 2426 +++++ gcc/cp/cxx-pretty-print.h | 78 + gcc/cp/decl.c | 13532 +++++++++++++++++++++++ gcc/cp/decl.h | 51 + gcc/cp/decl2.c | 4328 ++++++++ gcc/cp/dump.c | 489 + gcc/cp/error.c | 3242 ++++++ gcc/cp/except.c | 1225 +++ gcc/cp/expr.c | 149 + gcc/cp/friend.c | 592 ++ gcc/cp/g++spec.c | 374 + gcc/cp/init.c | 3692 +++++++ gcc/cp/lang-specs.h | 68 + gcc/cp/lex.c | 713 ++ gcc/cp/mangle.c | 3489 ++++++ gcc/cp/method.c | 1782 ++++ gcc/cp/name-lookup.c | 5684 ++++++++++ gcc/cp/name-lookup.h | 375 + gcc/cp/operators.def | 155 + gcc/cp/optimize.c | 437 + gcc/cp/parser.c | 25324 ++++++++++++++++++++++++++++++++++++++++++++ gcc/cp/pt.c | 19385 +++++++++++++++++++++++++++++++++ gcc/cp/ptree.c | 222 + gcc/cp/repo.c | 377 + gcc/cp/rtti.c | 1588 +++ gcc/cp/search.c | 2624 +++++ gcc/cp/semantics.c | 8656 +++++++++++++++ gcc/cp/tree.c | 3463 ++++++ gcc/cp/typeck.c | 8293 +++++++++++++++ gcc/cp/typeck2.c | 1748 +++ 65 files changed, 226160 insertions(+) create mode 100644 gcc/cp/ChangeLog create mode 100644 gcc/cp/ChangeLog-1993 create mode 100644 gcc/cp/ChangeLog-1994 create mode 100644 gcc/cp/ChangeLog-1995 create mode 100644 gcc/cp/ChangeLog-1996 create mode 100644 gcc/cp/ChangeLog-1997 create mode 100644 gcc/cp/ChangeLog-1998 create mode 100644 gcc/cp/ChangeLog-1999 create mode 100644 gcc/cp/ChangeLog-2000 create mode 100644 gcc/cp/ChangeLog-2001 create mode 100644 gcc/cp/ChangeLog-2002 create mode 100644 gcc/cp/ChangeLog-2003 create mode 100644 gcc/cp/ChangeLog-2004 create mode 100644 gcc/cp/ChangeLog-2005 create mode 100644 gcc/cp/ChangeLog-2006 create mode 100644 gcc/cp/ChangeLog-2007 create mode 100644 gcc/cp/ChangeLog-2008 create mode 100644 gcc/cp/ChangeLog-2009 create mode 100644 gcc/cp/ChangeLog-2010 create mode 100644 gcc/cp/ChangeLog.ptr create mode 100644 gcc/cp/ChangeLog.tree-ssa create mode 100644 gcc/cp/Make-lang.in create mode 100644 gcc/cp/NEWS create mode 100644 gcc/cp/call.c create mode 100644 gcc/cp/cfns.gperf create mode 100644 gcc/cp/cfns.h create mode 100644 gcc/cp/class.c create mode 100644 gcc/cp/config-lang.in create mode 100644 gcc/cp/cp-gimplify.c create mode 100644 gcc/cp/cp-lang.c create mode 100644 gcc/cp/cp-objcp-common.c create mode 100644 gcc/cp/cp-objcp-common.h create mode 100644 gcc/cp/cp-tree.def create mode 100644 gcc/cp/cp-tree.h create mode 100644 gcc/cp/cvt.c create mode 100644 gcc/cp/cxx-pretty-print.c create mode 100644 gcc/cp/cxx-pretty-print.h create mode 100644 gcc/cp/decl.c create mode 100644 gcc/cp/decl.h create mode 100644 gcc/cp/decl2.c create mode 100644 gcc/cp/dump.c create mode 100644 gcc/cp/error.c create mode 100644 gcc/cp/except.c create mode 100644 gcc/cp/expr.c create mode 100644 gcc/cp/friend.c create mode 100644 gcc/cp/g++spec.c create mode 100644 gcc/cp/init.c create mode 100644 gcc/cp/lang-specs.h create mode 100644 gcc/cp/lex.c create mode 100644 gcc/cp/mangle.c create mode 100644 gcc/cp/method.c create mode 100644 gcc/cp/name-lookup.c create mode 100644 gcc/cp/name-lookup.h create mode 100644 gcc/cp/operators.def create mode 100644 gcc/cp/optimize.c create mode 100644 gcc/cp/parser.c create mode 100644 gcc/cp/pt.c create mode 100644 gcc/cp/ptree.c create mode 100644 gcc/cp/repo.c create mode 100644 gcc/cp/rtti.c create mode 100644 gcc/cp/search.c create mode 100644 gcc/cp/semantics.c create mode 100644 gcc/cp/tree.c create mode 100644 gcc/cp/typeck.c create mode 100644 gcc/cp/typeck2.c (limited to 'gcc/cp') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog new file mode 100644 index 000000000..f5ef3234f --- /dev/null +++ b/gcc/cp/ChangeLog @@ -0,0 +1,1562 @@ +2013-04-12 Release Manager + + * GCC 4.6.4 released. + +2013-04-03 Jakub Jelinek + + Backported from mainline + 2013-02-07 Jakub Jelinek + + PR c++/56239 + * parser.c (cp_parser_token_starts_cast_expression): Renamed to... + (cp_parser_tokens_start_cast_expression): ... this. Change parameter + to cp_parser *, call cp_lexer_peek_token first. For CPP_OPEN_PAREN, + return true only if 2nd token isn't CPP_CLOSE_PAREN. + (cp_parser_cast_expression): Adjust caller. + + 2012-10-08 Jakub Jelinek + + PR c++/54858 + * tree.c (cp_tree_equal): Handle FIELD_DECL. + +2013-03-14 Jakub Jelinek + + PR c++/56403 + * init.c (build_zero_init_1): Use RECORD_OR_UNION_CODE_P instead + of CLASS_TYPE_P. + +2013-02-09 Jason Merrill + + PR c++/56247 + * pt.c (eq_specializations): Set comparing_specializations. + * tree.c (cp_tree_equal): Check it. + * cp-tree.h: Declare it. + +2013-01-04 Jason Merrill + + PR c++/55877 + * decl.c (reset_type_linkage, bt_reset_linkage): New. + (grokdeclarator): Use reset_type_linkage. + * name-lookup.c (binding_table_foreach): Handle null table. + * tree.c (decl_anon_ns_mem_p): Check TYPE_MAIN_DECL, not TYPE_NAME. + +2013-01-02 Jason Merrill + + PR c++/55032 + PR c++/55245 + * tree.c (build_cplus_array_type): Copy layout information + to main variant if necessary. + +2012-12-11 Jason Merrill + + PR c++/54883 + * decl2.c (min_vis_r): Handle anon visibility for enums. + +2012-12-06 Jason Merrill + + PR c++/55249 + * tree.c (build_vec_init_elt): Use the type of the initializer. + +2012-11-29 Jason Merrill + + PR c++/53862 + * pt.c (tsubst_arg_types): Add "end" parameter. + (check_undeduced_parms): Use it. + + PR c++/51662 + * method.c (process_subob_fn): Increment function_depth around call to + instantiate_decl. + +2012-11-29 Kai Tietz + + PR target/53912 + * class.c (dump_class_hierarchy_r): Cast from pointer via uintptr_t. + (dump_vtable): Likewise. + +2012-09-13 Jason Merrill + + PR c++/54511 + * pt.c (tsubst_decl) [VAR_DECL]: Handle DECL_ANON_UNION_VAR_P. + +2012-06-25 Jason Merrill + + PR c++/52988 + * typeck.c (decay_conversion): Don't discard side-effects from + expressions of nullptr_t. + +2012-04-04 Steve Ellcey + + Backported from mainline. + * decl.c (cxx_init_decl_processing): Use ptr_mode instead of Pmode. + +2012-04-03 Jason Merrill + + PR c++/52796 + * pt.c (tsubst_initializer_list): A pack expansion with no elements + means value-initialization. + +2012-03-01 Release Manager + + * GCC 4.6.3 released. + +2012-02-14 Jakub Jelinek + + Backported from mainline + 2012-02-14 Jakub Jelinek + + PR c++/52247 + * pt.c (tsubst_copy_asm_operands): For LABEL_DECL values call + lookup_label on label's name and set TREE_USED. + + PR c/52181 + * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than + newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits. + +2012-02-09 Jakub Jelinek + + Backported from mainline + 2012-01-03 Jakub Jelinek + + PR c++/51669 + * semantics.c (finish_omp_clauses): Call fold_build_cleanup_point_expr + on OMP_CLAUSE_{IF,NUM_THREADS,SCHEDULE_CHUNK}_EXPR. + + 2011-12-15 Jakub Jelinek + + PR c/51360 + * semantics.c (finish_omp_clauses): For OMP_CLAUSE_NUM_THREADS_EXPR + and OMP_CLAUSE_SCHEDULE_CHUNK_EXPR call mark_rvalue_use. + +2012-01-19 Kai Tietz + + PR c++/51344 + * decl2.c (save_template_attributes): Use merge_attributes + instead of chaining up via TREE_CHAIN. + +2012-01-16 Jakub Jelinek + + PR c++/51854 + * mangle.c (write_template_arg_literal): Sorry instead of aborting. + +2012-01-16 Jason Merrill + + PR c++/51868 + * typeck.c (build_static_cast_1): Handle bit-fields properly. + +2011-12-20 Dodji Seketeli + + PR debug/49951 + * decl.c (cxx_maybe_build_cleanup): Don't set location of the call + to the destructor. + +2011-12-16 Jason Merrill + + PR c++/51416 + * init.c (build_value_init_noctor): Check for incomplete type. + +2011-12-16 Jason Merrill + + PR c++/51331 + * class.c (convert_to_base_statically): Just call + build_simple_base_path. + (build_simple_base_path): Check field offset. + +2011-12-14 Jason Merrill + + PR c++/51248 + * decl.c (copy_type_enum): Also update variants. + (finish_enum): Allow variants of complete enums. + +2011-12-13 Jason Merrill + + PR c++/51406 + PR c++/51161 + * typeck.c (build_static_cast_1): Fix cast of lvalue to + base rvalue reference. + +2011-11-22 Paolo Carlini + + PR c++/51265 + * semantics.c (finish_decltype_type): Handle PTRMEM_CST. + +2011-11-18 Paolo Carlini + + PR c++/51150 + * pt.c (tsubst_copy_and_build): Handle FIX_TRUNC_EXPR. + +2011-11-07 Jason Merrill + + PR c++/50870 + * pt.c (tsubst_copy): Handle NAMESPACE_DECL. + (tsubst_copy_and_build) [COMPONENT_REF]: Handle a still-dependent + object. + +2011-11-04 Eric Botcazou + + PR c++/50608 + * semantics.c (finish_offsetof): Adjust call to fold_offsetof. + * typeck.c (cp_build_addr_expr_1): Call fold_offsetof_1. + +2011-10-29 Paolo Carlini + + PR c++/50901 + * call.c (build_new_op_1): Handle ABS_EXPR together with the + other unary EXPR. + +2011-10-26 Release Manager + + * GCC 4.6.2 released. + +2011-10-19 Jason Merrill + + PR c++/50793 + * tree.c (bot_manip): Propagate AGGR_INIT_ZERO_FIRST. + +2011-10-19 Jason Merrill + + PR c++/50787 + * parser.c (cp_parser_initializer_clause): Don't call + maybe_constant_value here. + +2011-10-18 Jason Merrill + + PR c++/50531 + * pt.c (instantiate_decl): Recognize when a function defaulted + outside the class is already instantiated. + +2011-10-15 Nicola Pero + + Backport from mainline + 2011-06-06 Nicola Pero , + + PR obj-c++/48275 + * parser.c (cp_parser_objc_at_property_declaration): Allow setter + and getter names to use all the allowed method names. + +2011-10-13 Jason Merrill + + PR c++/50618 + * init.c (expand_aggr_init_1): Don't zero-initialize virtual + bases of a base subobject. + +2011-10-11 Jason Merrill + + PR c++/49216 + * init.c (build_vec_init): Avoid crash on new int[1]{}. + + PR c++/49855 + PR c++/49896 + * call.c (perform_implicit_conversion_flags): Do perform + scalar conversions in templates. + * pt.c (tsubst_copy, tsubst_copy_and_build): Handle CONVERT_EXPR. + +2011-10-11 Janis Johnson + + PR c++/44473 + * mangle.c (write_type): Handle CV qualifiers for decimal classes. + +2011-10-11 Paolo Carlini + + PR c++/50611 + * pt.c (tsubst_copy_and_build): If (complain & tf_error) is false + do not call unqualified_name_lookup_error. + +2011-10-09 Jakub Jelinek + Diego Novillo + + * pt.c (reregister_specialization): Use htab_find instead of + htab_find_slot with INSERT. + +2011-09-26 Jason Merrill + + PR c++/46105 + * typeck.c (structural_comptypes): Ignore cv-quals on typename scope. + + PR c++/50508 + * semantics.c (cxx_eval_logical_expression): Use tree_int_cst_equal + rather than ==. + +2011-09-23 Jason Merrill + + Core 253 - allow const objects with no initializer or + user-provided default constructor if the defaulted constructor + initializes all the subobjects. + PR c++/20039 + PR c++/42844 + * class.c (default_init_uninitialized_part): New. + * cp-tree.h: Declare it. + * decl.c (check_for_uninitialized_const_var): Use it. + * init.c (perform_member_init): Likewise. + (build_new_1): Likewise. + * method.c (walk_field_subobs): Likewise. + +2011-09-22 Paolo Carlini + + PR c++/50491 + * semantics.c (potential_constant_expression_1): Handle USING_DECL. + +2011-09-17 Jason Merrill + + PR c++/50442 + Revert: + PR c++/49267 + * call.c (compare_ics): rvaluedness_matches_p can differ + based on the source type, not just target. + +2011-09-16 Jason Merrill + + PR c++/50424 + * tree.c (bot_manip): Set cp_function_chain->can_throw. + +2011-09-13 Dodji Seketeli + + PR c++/48320 + * pt.c (template_parameter_pack_p): Support TEMPLATE_PARM_INDEX + nodes. Add a comment. + (arg_from_parm_pack_p): New static function, factorized out from + tsubst_pack_expansion and extended to support non-type parameter + packs represented with TEMPLATE_PARM_INDEX nodes. + (tsubst_pack_expansion): Use arg_from_parm_pack_p. + +2011-09-08 Jakub Jelinek + + PR c++/50255 + * method.c (use_thunk): If emitting thunk into the same section + as function, use the same DECL_COMDAT_GROUP as well. + +2011-09-07 Paolo Carlini + + PR c++/50309 + * decl.c (grokdeclarator): Check u.function.exception_specification + for error_mark_node. + +2011-09-04 Jason Merrill + + PR c++/49267 + * call.c (compare_ics): rvaluedness_matches_p can differ + based on the source type, not just target. + +2011-08-29 Jakub Jelinek + Jason Merrill + + PR c++/50207 + * class.c (finish_struct_1): Complain if the first field is + artificial. + +2011-08-30 Jason Merrill + + PR c++/50089 + * semantics.c (finish_id_expression): Use + current_nonlambda_class_type for qualified-ids. + + PR c++/50220 + * semantics.c (add_capture): Call complete_type for copy. + + PR c++/50234 + * semantics.c (cxx_eval_component_reference): Handle + value-initialization for omitted initializers. + +2011-08-29 Jason Merrill + + PR c++/50224 + * semantics.c (finish_id_expression): Mark captured variables used. + +2011-08-25 Jason Merrill + + PR c++/50157 + * call.c (convert_like_real): Exit early if bad and !tf_error. + +2011-08-23 Jason Merrill + + PR c++/50024 + * semantics.c (maybe_constant_value): Don't try to fold { }. + * pt.c (build_non_dependent_expr): Don't wrap { }. + * init.c (build_value_init): Allow scalar value-init in templates. + +2011-08-23 Jakub Jelinek + + PR c++/46862 + * class.c (finish_struct_1): If TYPE_TRANSPARENT_AGGR is set on a type + which doesn't have any fields, clear it and diagnose. + +2011-08-16 Jason Merrill + + PR c++/50086 + * pt.c (unify_pack_expansion): Correct overloaded unification + logic. + + PR c++/50054 + * typeck2.c (cxx_incomplete_type_diagnostic): Handle + init_list_type_node. + +2011-08-12 David Li + + * class.c (update_vtable_entry_for_fn): Set + LOST_PRIMARY bit properly. + +2011-08-05 Jason Merrill + + PR c++/48993 + * semantics.c (potential_constant_expression_1) [CALL_EXPR]: Sorry + on 'this' in a constructor. + + PR c++/49921 + * semantics.c (finish_decltype_type): Call invalid_nonstatic_memfn_p. + + PR c++/49669 + * init.c (perform_member_init): Handle invalid array initializer. + + PR c++/49988 + * semantics.c (cxx_eval_array_reference): Handle failure to + reduce the array operand to something we can work with. + +2011-08-02 Jason Merrill + + PR c++/43886 + * parser.c (cp_parser_lambda_body): Clear local_variables_forbidden_p. + + PR c++/49593 + * pt.c (find_parameter_packs_r): Handle CONSTRUCTOR. + + PR c++/49803 + * init.c (sort_mem_initializers): Initialize uses_unions_p here. + (build_field_list): Not here. + + PR c++/49924 + * semantics.c (cxx_eval_vec_init_1): Fix logic. + + PR c++/49260 + * call.c (build_call_a): Set cp_function_chain->can_throw here. + (build_cxx_call): Not here. + +2011-07-27 Jeffrey Yasskin + + * pt.c (build_template_decl): Copy the function_decl's + source location to the new template_decl. + +2011-07-19 Jason Merrill + + PR c++/49785 + * pt.c (coerce_template_parms): Handle non-pack after pack. + +2011-07-11 Jason Merrill + + PR c++/49672 + * pt.c (extract_fnparm_pack): Split out from... + (make_fnparm_pack): ...here. + (instantiate_decl): Handle non-pack parms after a pack. + * semantics.c (maybe_add_lambda_conv_op): Don't in a template. + +2011-07-09 Jason Merrill + + * tree.c (build_vec_init_elt): Strip TARGET_EXPR. + + * tree.c (build_vec_init_expr): Don't add TARGET_EXPR. + * typeck2.c (digest_init_r): Handle VEC_INIT_EXPR. + * semantics.c (cxx_eval_vec_init_1): Correct type. + +2011-07-07 Jason Merrill + + PR c++/48157 + * pt.c (tsubst_qualified_id): Preserve TEMPLATE_ID_EXPR in + partial instantiation. + +2011-07-07 Jakub Jelinek + + PR c/49644 + * typeck.c (cp_build_binary_op): For MULT_EXPR and TRUNC_DIV_EXPR with + one non-complex and one complex argument, call save_expr on both + operands. + +2011-07-05 Jason Merrill + + PR c++/49598 + * semantics.c (finish_id_expression): convert_from_reference. + + * error.c (type_to_string): Avoid redundant akas. + +2011-06-27 Jason Merrill + + PR c++/49528 + * semantics.c (potential_constant_expression_1): A TARGET_EXPR + of non-literal type isn't constant. + (cxx_eval_constant_expression): Likewise. + * init.c (expand_default_init): Use maybe_constant_init. + + PR c++/49440 + * class.c (set_linkage_according_to_type): Hand off to + determine_visibility. + + PR c++/49418 + * call.c (cxx_type_promotes_to): Don't strip cv-quals. + * semantics.c (lambda_return_type): Strip them here. + +2011-06-27 Release Manager + + * GCC 4.6.1 released. + +2011-06-23 Jason Merrill + + PR c++/49507 + * decl2.c (mark_used): Don't call synthesize_method for + functions defaulted outside the class. + +2011-06-21 Jason Merrill + + PR c++/49482 + * semantics.c (maybe_add_lambda_conv_op): Call mark_exp_read for + static fn parameters. + +2011-06-16 Jason Merrill + + PR c++/49229 + * pt.c (tsubst_decl) [FUNCTION_DECL]: Handle substitution failure. + + PR c++/49251 + * semantics.c (finish_id_expression): Mark even dependent + variables as used. + +2011-06-14 Jason Merrill + + * error.c (type_to_string): Print typedef-stripped version too. + + PR c++/49117 + * call.c (perform_implicit_conversion_flags): Print source type as + well as expression. + + PR c++/49369 + * class.c (build_base_path): Fix cv-quals in unevaluated context. + + PR c++/49290 + * semantics.c (cxx_eval_indirect_ref): Remove assert. + +2011-06-09 Jason Merrill + + * semantics.c (finish_compound_literal): Set TREE_HAS_CONSTRUCTOR. + +2011-06-08 Jason Merrill + + * semantics.c (potential_constant_expression_1): Handle destructor + call. + +2011-06-07 Jason Merrill + + PR c++/48780 + * typeck.c (perform_integral_promotions): Don't promote scoped enums. + * call.c (convert_arg_to_ellipsis): Promote them here in old ABI. + +2011-06-06 Jason Merrill + + PR c++/49298 + * semantics.c (potential_constant_expression_1): Handle FIELD_DECL. + + PR c++/49134 + * tree.c (build_target_expr): Deal with ARM ABI tweaks. + +2011-06-03 Jakub Jelinek + + PR c++/49276 + * mangle.c (write_nested_name): Use CP_DECL_CONTEXT instead of + DECL_CONTEXT. + +2011-05-30 Jakub Jelinek + + PR c++/49223 + * semantics.c (finish_omp_clauses): Call require_complete_type + even for copyin/copyprivate clauses. Only call + cxx_omp_create_clause_info if inner_type is COMPLETE_TYPE_P. + +2011-05-27 Jason Merrill + + PR c++/47049 + * semantics.c (maybe_add_lambda_conv_op): Fix COMDAT sharing. + * decl.c (start_preparsed_function): Don't call comdat_linkage for + a template. + + PR c++/47277 + * parser.c (cp_parser_unqualified_id): Don't check + constructor_name_p for enums. + + PR c++/48284 + * error.c (dump_expr) [COMPONENT_REF]: Use pp_cxx_dot + with INDIRECT_REF of REFERENCE_TYPE. + + PR c++/48657 + PR c++/49176 + * decl.c (cp_finish_decl): Simplify template handling. + +2011-05-26 Jason Merrill + + PR c++/48424 + * decl.c (grokparms): Function parameter packs don't need to + go at the end. + * pt.c (type_unification_real): But they aren't deduced otherwise. + +2011-05-25 Jason Merrill + + PR c++/44994 + PR c++/49156 + * error.c (dump_template_bindings): Set processing_template_decl + for a partial instantiation. + + PR c++/45401 + * decl.c (grokdeclarator): Don't change type when adding rvalue ref + to another reference type. + +2011-05-26 Fabien ChĂȘne + * init.c (diagnose_uninitialized_cst_or_ref_member_1): Use + permerror instead of error, adjust the error count. + +2011-05-25 Jason Merrill + + PR c++/44311 + * decl.c (case_conversion): New. + (finish_case_label): Use it. + + PR c++/45698 + * pt.c (dependent_template_arg_p): See through ARGUMENT_PACK_SELECT. + + PR c++/46005 + * decl.c (grokdeclarator): Complain about auto typedef. + + PR c++/46245 + * decl.c (grokdeclarator): Complain later for auto parameter. + * pt.c (splice_late_return_type): Handle use in a template + type-parameter. + + PR c++/46696 + * typeck.c (cp_build_modify_expr): Check DECL_DEFAULTED_FN. + + PR c++/47184 + * parser.c (cp_parser_parameter_declaration): Recognize + list-initialization. + (cp_parser_direct_declarator): Check for the closing + paren before parsing definitely. + + PR c++/48935 + * parser.c (cp_parser_constructor_declarator_p): Don't check + constructor_name_p for enums. + (cp_parser_diagnose_invalid_type_name): Correct error message. + +2011-05-25 Jason Merrill + + PR c++/45418 + * init.c (perform_member_init): Handle list-initialization + of array of non-trivial class type. + + PR c++/45080 + * pt.c (instantiate_class_template_1): Call maybe_add_lambda_conv_op. + * semantics.c (lambda_function): Check COMPLETE_OR_OPEN_TYPE_P. + + PR c++/48292 + * pt.c (tsubst_decl) [PARM_DECL]: Handle partial instantiation of + function parameter pack. + (tsubst_pack_expansion): Likewise. + +2011-05-25 Jakub Jelinek + + PR c++/49136 + * semantics.c (cxx_eval_bit_field_ref): Handle the + case when BIT_FIELD_REF doesn't cover only a single field. + +2011-05-24 Jason Merrill + + PR c++/49042 + * pt.c (get_mostly_instantiated_function_type): Use + push_deferring_access_checks rather than set flag_access_control. + + PR c++/48884 + * pt.c (fn_type_unification): Disable access control during + substitution. + + PR c++/49105 + * typeck.c (build_const_cast_1): Handle rvalue references. + + PR c++/47263 + * decl.c (use_eh_spec_block): Do use an EH spec block for a + lambda op(). + + PR c++/47336 + * error.c (dump_template_bindings): Suppress access control. + + PR c++/47544 + * pt.c (instantiate_decl): Handle =default. + + PR c++/48617 + * pt.c (invalid_nontype_parm_type_p): Allow DECLTYPE_TYPE. + +2011-05-22 Jason Merrill + + PR c++/48647 + * typeck.c (composite_pointer_type_r): Return error_mark_node + on error in SFINAE context. + +2011-05-20 Jason Merrill + + PR c++/48945 + * decl.c (revert_static_member_fn): Ignore const on constexpr fn. + + PR c++/48780 + * cvt.c (type_promotes_to): Warn about promoting scoped enums. + + PR c++/49066 + * decl.c (duplicate_decls): Preserve DECL_DELETED_FN. + + DR 1073 + PR c++/49082 + * typeck.c (comp_except_specs): noexcept(false) is not compatible + with throw(type-list). + * typeck2.c (merge_exception_specifiers): noexcept(false) + beats any more limited specification. + + PR c++/48948 + * class.c (finalize_literal_type_property): Only check + for constexpr member functions of non-literal class. + * decl.c (cp_finish_decl): Don't call validate_constexpr_fundecl. + * semantics.c (literal_type_p): Call complete_type. + + * semantics.c (validate_constexpr_fundecl): Check DECL_TEMPLATE_INFO + rather than DECL_TEMPLATE_INSTANTIATION. + (cxx_eval_call_expression): Likewise. + + * semantics.c (register_constexpr_fundef): Add to hash table here. + (validate_constexpr_fundecl): Not here. + + PR c++/48745 + * pt.c (value_dependent_expr_p): Handle CONSTRUCTOR. + + PR c++/48736 + * pt.c (tsubst_copy_and_build): Handle substitution of a pack + expansion producing another expansion. + + PR c++/48873 + * tree.c (stabilize_expr): Don't make gratuitous copies of classes. + +2011-05-19 Jakub Jelinek + + PR c++/49043 + * decl.c (check_omp_return): Stop searching on sk_function_parms. + + PR c++/48869 + * method.c (get_dtor, get_copy_ctor): Add COMPLAIN argument, + pass it down to locate_fn_flags. + * cp-tree.h (get_dtor, get_copy_ctor): Adjust prototypes. + * semantics.c (cxx_omp_create_clause_info): Adjust callers. + * cp-gimplify.c: Include splay-tree.h. + (splay_tree_compare_decl_uid, omp_var_to_track, + omp_cxx_notice_variable): New functions. + (struct cp_genericize_omp_taskreg): New type. + (struct cp_genericize_data): Add omp_ctx field. + (cp_genericize_r): Attempt to determine implicitly determined + firstprivate class type variables. + (cp_genericize): Clear omp_ctx. + * Make-lang.in (cp/cp-gimplify.o): Depend on $(SPLAY_TREE_H). + +2011-05-11 Jason Merrill + + * pt.c (build_non_dependent_expr): Don't check null_ptr_cst_p. + +2011-05-11 Fabien ChĂȘne + + PR c++/48859 + * init.c (diagnose_uninitialized_cst_or_ref_member_1): stop the + recursion if there is user defined constructor. + +2011-05-09 Dodji Seketeli + + PR c++/48574 + * class.c (fixed_type_or_null): Use type_dependent_p_push to test + if the instance has a dependent initializer. + +2011-05-06 Jason Merrill + + PR c++/48909 + * semantics.c (cxx_eval_conditional_expression): Check + integer_zerop instead. + (potential_constant_expression_1): Likewise. + + PR c++/48911 + * semantics.c (cxx_eval_array_reference): Handle implicit + initializers. + + PR c++/48446 + * decl.c (stabilize_save_expr_r, stabilize_vla_size): New. + (grokdeclarator): Use stabilize_vla_size. + * init.c (get_temp_regvar): No longer static. + * cp-tree.h: Declare it. + + PR c++/48089 + * semantics.c (potential_constant_expression_1): Don't allow *this + in a constructor. + (register_constexpr_fundef): Use potential_rvalue_constant_expression. + +2011-05-06 Dodji Seketeli + + PR c++/48838 + * cp-tree.h (non_static_member_function_p): Declare new function. + * tree.c (non_static_member_function_p): Define it. + * semantics.c (finish_call_expr): Use it. + +2011-05-04 Jason Merrill + + PR c++/48749 + * class.c (resolves_to_fixed_type_p): Don't look closely + in templates. + +2011-04-28 Dodji Seketeli + + PR c++/48656 + * semantics.c (finish_call_expr): Don't forget BASELINK nodes when + considering call expressions involving a member function. + +2011-04-27 Jason Merrill + + PR c++/48046 + * parser.c (cp_parser_diagnose_invalid_type_name): Commit + to tentative parse sooner. + +2011-04-26 Jason Merrill + + PR c++/42687 + * parser.c (cp_parser_primary_expression): Set *idk to + CP_ID_KIND_NONE for a parenthesized identifier. + +2011-04-26 Jason Merrill + + PR c++/48726 + * call.c (convert_like_real): Correct TREE_CONSTANT on CONSTRUCTOR. + * decl.c (reshape_init_array_1): Likewise. + +2011-04-25 Jason Merrill + + PR c++/48707 + * pt.c (value_dependent_expression_p): Handle type-dependent + expression. + +2011-04-20 Jason Merrill + + * semantics.c (finish_compound_literal): Don't put an array + with a dtor in a static variable. + +2011-04-20 Jason Merrill + + PR c++/48594 + * decl2.c (build_offset_ref_call_from_tree): Move + non-dependency of object outside condition. + + PR c++/48657 + * decl.c (cp_finish_decl): Handle non-member constant variables + in templates, too. + +2011-04-19 Jason Merrill + + PR c++/46304 + * typeck.c (cp_build_binary_op): Fold COMPLEX_EXPR. + +2011-04-18 Jason Merrill + + PR c++/48537 + * init.c (build_value_init): Handle UNION_TYPE the same. + +2011-04-18 Jakub Jelinek + + PR c++/48632 + * parser.c (cp_parser_omp_for_loop): Don't use cp_parser_omp_for_incr + for type dependent pointers. + +2011-04-13 Jason Merrill + + PR c++/48594 + * decl2.c (build_offset_ref_call_from_tree): Fix calling a functor + or pointer to (non-member) function. + +2011-04-13 Jakub Jelinek + + PR c++/48570 + * semantics.c (cxx_eval_array_reference): Handle reading from + wchar_t, char16_t and char32_t STRING_CST. + +2011-04-13 Dodji Seketeli + + PR c++/48574 + * class.c (fixed_type_or_null): We cannot determine the dynamic + type of a reference variable if its initializer is dependent. + +2011-04-11 Jason Merrill + + PR c++/48534 + * cvt.c (ocp_convert): Use build_nop to convert to underlying type + of scoped enum. + + PR c++/48523 + * tree.c (maybe_dummy_object): Use build_x_indirect_ref rather + than cp_build_indirect_ref. + +2011-04-07 Jason Merrill + + PR c++/48500 + * semantics.c (potential_constant_expression_1) [CALL_EXPR]: Check + arguments even if we don't know the function. + + PR c++/48468 + * except.c (build_noexcept_spec): Propagate error_mark_node. + (finish_noexcept_expr): Likewise. + + PR c++/48452 + * typeck.c (build_x_compound_expr_from_list): Return error_mark_node + in SFINAE context. + + * semantics.c (finish_decltype_type): Add complain parm. + * cp-tree.h: Adjust. + * parser.c (cp_parser_decltype): Adjust. + * pt.c (tsubst): Adjust. + + PR c++/48450 + * cvt.c (ocp_convert): Handle converting scoped enum to bool. + +2011-03-31 Jason Merrill + + PR c++/48280 + * method.c (defaultable_fn_check): Templates are not defaultable. + +2011-03-30 Jason Merrill + + PR c++/48212 + * semantics.c (non_const_var_error): Just return if DECL_INITIAL + is error_mark_node. + + PR c++/48369 + * semantics.c (potential_constant_expression_1): Handle + UNORDERED_EXPR and ORDERED_EXPR. + + PR c++/48281 + * semantics.c (finish_compound_literal): Do put static/constant + arrays in static variables. + +2011-03-29 Jason Merrill + + PR c++/48265 + * pt.c (value_dependent_expression_p) [VAR_DECL]: Make sure + the variable is constant before looking at its initializer. + + PR c++/48319 + * pt.c (value_dependent_expression_p): Handle TEMPLATE_ID_EXPR. + +2011-03-29 Jason Merrill + + PR c++/48166 + * decl.c (revert_static_member_fn): Strip function-cv-quals. + + PR c++/48296 + * decl.c (cp_finish_decl): Defer validation of constexpr member + functions. + * class.c (finalize_literal_type_property): Validate them here. + * semantics.c (is_valid_constexpr_fn): Don't check completeness. + + * semantics.c (is_valid_constexpr_fn): Specify input location. + + Core 1232 + * call.c (build_array_conv): New. + (implicit_conversion): Use it. + + * call.c (reference_binding): Allow direct binding to an array + rvalue. + + PR c++/48289 + * pt.c (build_non_dependent_expr): Keep dereferences outside the + NON_DEPENDENT_EXPR. + + PR c++/47999 + * semantics.c (finish_call_expr): Preserve reference semantics + in templates. + + PR c++/48313 + * pt.c (maybe_adjust_types_for_deduction): Handle T&& deduction + from overloaded function. + + Core 1148 + * typeck.c (check_return_expr): Fix conditions for setting + LOOKUP_PREFER_RVALUE. + +2011-03-29 Rodrigo Rivas Costa + + * decl2.c (cp_check_const_attributes): New. + (cplus_decl_attributes): Call cp_check_const_attributes. + +2011-03-29 Jason Merrill + + * semantics.c (push_cx_call_context): Return bool. + (cxx_eval_call_expression): Handle excess depth. + + * except.c (build_noexcept_spec): Call cxx_constant_value after + converting to bool. + + PR c++/47504 + * semantics.c (cxx_eval_constant_expression) [NOP_EXPR]: Don't let + the conversion set TREE_OVERFLOW. + + PR c++/47570 + * semantics.c (cxx_eval_constant_expression) [COMPOUND_EXPR]: Don't + use the generic binary expression handling. + +2011-03-25 Release Manager + + * GCC 4.6.0 released. + +2011-03-16 Jason Merrill + + PR c++/48132 + * decl.c (check_array_designated_initializer): Allow integer index. + (reshape_init_array_1): Set index on the elements. + +2011-03-16 Jason Merrill + + PR c++/48113 + * typeck.c (convert_for_initialization): Use + perform_implicit_conversion_flags. + * call.c (standard_conversion): If LOOKUP_PREFER_RVALUE, set + rvaluedness_matches_p on ck_rvalue. + (convert_like_real) [ck_rvalue]: And restore it here. + +2011-03-16 Jason Merrill + + PR c++/48115 + * call.c (convert_arg_to_ellipsis): Handle incomplete type. + +2011-03-11 Dodji Seketeli + + * call.c (add_builtin_candidate): The type of + the argument of the indirection operator should not be dependent. + Fix the comment. + +2011-03-11 Jason Merrill + + PR c++/47125 + * pt.c (tsubst) [TYPENAME_TYPE]: Only give errors if tf_error. + + PR c++/47144 + * parser.c (cp_parser_template_type_arg): Set + type_definition_forbidden_message. + + PR c++/47808 + * decl.c (compute_array_index_type): Discard folding + if it didn't produce a constant. + +2011-03-11 Jakub Jelinek + + PR c++/48035 + * init.c (build_zero_init_1): Extracted from build_zero_init. + Add FIELD_SIZE argument, if non-NULL and field bit_position + as not smaller than that, don't add that field's initializer. + Pass DECL_SIZE as last argument to build_zero_init_1 + for DECL_FIELD_IS_BASE fields. + (build_zero_init): Use build_zero_init_1. + +2011-03-10 Jason Merrill + + PR c++/48029 + * pt.c (iterative_hash_template_arg): Remove special case for + ARRAY_TYPE. + + PR c++/47198 + * parser.c (cp_parser_single_declaration): Just return if + cp_parser_parse_and_diagnose_invalid_type_name complained. + +2011-03-09 Jason Merrill + + PR c++/44629 + * pt.c (unify): An unresolved overload is a nondeduced context. + +2011-03-09 Martin Jambor + + PR tree-optimization/47714 + * method.c (use_thunk): Clear addressable flag of thunk arguments. + +2011-03-08 Dodji Seketeli + + PR c++/47705 + * pt.c (convert_nontype_argument): Only call decay_conversion on + arrays. + +2011-03-08 Jason Merrill + + PR c++/47488 + * mangle.c (write_template_arg_literal) [STRING_CST]: Sorry. + + PR c++/47705 + * pt.c (convert_nontype_argument): Don't crash on non-pointer + argument to pointer parameter. + + PR c++/45651 + * pt.c (instantiate_decl): Don't clear DECL_INTERFACE_KNOWN on + !TREE_PUBLIC decls. + +2011-03-08 Dodji Seketeli + + PR c++/47957 + * name-lookup.c (binding_to_template_parms_of_scope_p): Only + consider scopes of primary template definitions. Adjust comments. + +2011-03-07 Jason Merrill + + PR c++/48003 + * pt.c (convert_nontype_argument): Fix -fpermissive allowing + integer overflow. + * semantics.c (potential_constant_expression_1): Check TREE_OVERFLOW. + + PR c++/48015 + * init.c (constant_value_1): Always require init to be TREE_CONSTANT. + + PR c++/48008 + * mangle.c (write_type): Strip cv-quals from FUNCTION_TYPE here. + (write_CV_qualifiers_for_type): Not here. + +2011-03-06 Joseph Myers + + * lang-specs.h: Match -save-temps* instead of -save-temps. + +2011-03-05 Jason Merrill + + * mangle.c (write_expression): Change ABI v6 to v5. + (write_type): Likewise. + +2011-03-04 Jan Hubicka + + PR lto/47497 + * optimize.c (maybe_clone_body): Update call of cgraph_same_body_alias + and cgraph_add_thunk. + * method.c (make_alias_for_thunk, use_thunk): Likewise. + * mangle.c (mangle_decl): Likewise. + +2011-03-04 Jason Merrill + + PR c++/47971 + * pt.c (tsubst_copy_and_build) [PSEUDO_DTOR_EXPR]: Use tsubst for type. + (tsubst_copy) [default]: Just return t if !ENABLE_CHECKING. + + PR c++/46220 + * search.c (check_final_overrider): Allow pointer to same incomplete + class type with different cv-quals. + +2011-03-03 Paolo Carlini + + PR c++/47974 + * pt.c (tsubst_template_args): Check argument t for error_mark_node. + +2011-03-03 Jason Merrill + + PR c++/47950 + * pt.c (tsubst_copy_and_build) [TARGET_EXPR]: Retain TREE_CONSTANT. + +2011-03-02 Jason Merrill + + PR c++/47950 + * parser.c (cp_parser_condition): Don't fold_non_dependent_expr here. + + PR c++/47774 + * tree.c (build_vec_init_elt): Split out from... + (build_vec_init_expr): ...here. + (diagnose_non_constexpr_vec_init): New fn. + * semantics.c (potential_constant_expression_1): Use it. + * cp-tree.h: Declare it. + +2011-03-01 Jason Merrill + + PR c++/46159 + * parser.c (cp_parser_primary_expression): Don't warn about a + failed tentative parse. + + PR c++/47200 + * semantics.c (cxx_bind_parameters_in_call): Don't call + adjust_temp_type on non-constant args. + + PR c++/47851 + * call.c (standard_conversion): Provide requested cv-quals on + class rvalue conversion. + + PR c++/46282 + * decl2.c (grokbitfield): Handle type-dependent width. + +2011-02-28 Jason Merrill + + PR c++/47873 + * class.c (update_vtable_entry_for_fn): Check BINFO_LOST_PRIMARY_P + after checking for a non-thunk. + +2011-02-26 Jason Merrill + + PR c++/47904 + * tree.c (cp_tree_equal): Compare DECL_PARM_LEVEL. + * pt.c (iterative_hash_template_arg): And hash it. + + PR c++/47897 + * semantics.c (non_const_var_error): Split out from... + (cxx_eval_constant_expression): ...here. + (potential_constant_expression_1) [VAR_DECL]: Use it. + Allow dependent variables. + +2011-02-24 Jason Merrill + + * parser.c (cp_parser_constant_expression): Set + non_integral_constant_expression correctly for C++0x too. + (cp_parser_static_assert): Allow non-constant expression. + (cp_parser_direct_declarator): Expect non_constant_p to be set + properly for C++0x. + * pt.c (value_dependent_expression_p): Handle TYPEID_EXPR. + * semantics.c (maybe_constant_value): Check type_unknown_p too. + (potential_rvalue_constant_expression): New. + (require_potential_rvalue_constant_expression): New. + +2011-02-23 Jason Merrill + + * cp-tree.h (DECL_PARM_LEVEL): New. + (struct lang_decl_parm): Add level field. + * name-lookup.c (function_parm_depth): New fn. + * name-lookup.h: Declare it. + * parser.c (cp_parser_parameter_declaration_list): Use it. + * mangle.c (struct globals): Add parm_depth field. + (write_bare_function_type): Adjust it. + (write_expression): Include the level delta in PARM_DECL mangling + for abi >= 6. + + * semantics.c (finish_decltype_type): Remove shortcut for decltype + of id-expression. + * mangle.c (write_type) [DECLTYPE_TYPE]: Strip it here for abi < 6. + +2011-02-23 Nathan Froyd + + PR c++/46868 + * parser.c (cp_parser_class_specifier): Require a closing brace + to attempt error recovery. + +2011-02-23 Jakub Jelinek + + PR c++/47833 + * pt.c (struct pending_template): Add chain_next GTY option. + * decl.c (struct named_label_use_entry): Likewise. + +2011-02-22 Paolo Carlini + + PR c++/47242 + * semantics.c (build_lambda_object): Bail out if a field is + error_mark_node. + +2011-02-22 Dodji Seketeli + + PR c++/47666 + * class.c (dfs_declare_virt_assop_and_dtor) + (declare_virt_assop_and_dtor): New static functions. + (add_implicitly_declared_members): Use + declare_virt_assop_and_dtor. + +2011-02-21 Jason Merrill + + PR c++/47207 + * decl2.c (decl_constant_var_p): A constexpr var needs an + initializer to be constant. + * semantics.c (cxx_eval_constant_expression): Complain about + constexpr var used in its own initializer. + * call.c (set_up_extended_ref_temp): Set + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P too. + +2011-02-20 Jason Merrill + + PR c++/47199 + * semantics.c (cxx_eval_call_expression): Call + cxx_eval_constant_expression in trivial shortcut. + + PR c++/46831 + * call.c (convert_class_to_reference): Don't try to set up a + second conv sequence for non-viable candidates. + + PR c++/47703 + * error.c (location_of): Handle non-tagged types. + + PR c++/46472 + * method.c (process_subob_fn): Instantiate constexpr templates. + * optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P. + +2011-02-20 Dodji Seketeli + + PR c++/46394 + * pt.c (tsubst_pack_expansion): do not use + cp_tree_equal/same_type_p to detect an expansion of a parameter + pack. + +2011-02-19 Jason Merrill + + PR c++/47503 + * semantics.c (cxx_eval_call_expression): Shortcut trivial copy. + +2011-02-18 Paolo Carlini + + PR c++/47795 + * semantics.c (finish_non_static_data_member): Early return if + object is error_mark_node. + +2011-02-18 Dodji Seketeli + + PR c++/47208 + * pt.c (do_auto_deduction): Do not mention error_mark_node in + diagnostics. + * semantics.c (finish_id_expression): Do not pass erroneous decl + to decl_constant_var_p. + +2011-02-17 Jakub Jelinek + + PR c++/47783 + * cvt.c (convert_from_reference): Call mark_exp_read. + +2011-02-11 Dodji Seketeli + + PR c++/47172 + * pt.c (finish_call_expr): Consider a call expression that has a + dependent "this" pointer as being dependent. Add comments. + (dependent_type_p, type_dependent_expression_p): Update comments. + +2011-02-16 Dodji Seketeli + + PR c++/47326 + * pt.c (tsubst_copy): Ensure that even pack + expansion arguments are not evaluated. + +2011-02-16 Jakub Jelinek + + PR c++/47704 + * cp-tree.h (ENUM_FIXED_UNDERLYING_TYPE_P): Use TYPE_LANG_FLAG_5 + instead of TYPE_LANG_FLAG_3. + * pt.c (lookup_template_class): Copy over + ENUM_FIXED_UNDERLYING_TYPE_P. + +2011-02-15 Jason Merrill + + PR c++/46807 + * method.c (synthesized_method_walk): Always exit early for + trivial fn in C++98 mode. + +2011-02-14 Jason Merrill + + PR c++/47482 + * parser.c (cp_parser_enumerator_definition): Call + fold_non_dependent_expr. + +2011-02-09 Jason Merrill + + * decl.c (cp_make_fname_decl): Set DECL_THIS_STATIC at toplevel. + * semantics.c (finish_fname): Only return the name if we're in + a function. + + * decl.c (build_enumerator): Don't perform integral promotions on + non-integral constants. + + * cvt.c (convert_to_void): Handle null op1. + + * class.c (type_has_constexpr_default_constructor): Make sure the + caller stripped an enclosing array. + * init.c (perform_member_init): Strip arrays before calling it. + + PR c++/47511 + * semantics.c (potential_constant_expression_1): Handle TEMPLATE_DECL. + +2011-02-03 Dodji Seketeli + + PR c++/47398 + * tree.c (cp_tree_equal): Take the number of + template parameters in account. + +2011-02-03 Nathan Froyd + + PR c++/46890 + * parser.c (cp_parser_class_specifier): Fix setting of + want_semicolon. + +2011-01-31 Jakub Jelinek + + PR c++/47416 + * semantics.c (build_data_member_initialization): Handle + STATEMENT_LIST always instead of just for CLEANUP_BODY. + +2011-01-31 Rainer Orth + + * g++spec.c (lang_specific_driver) [HAVE_LD_STATIC_DYNAMIC] Use + LD_STATIC_OPTION, LD_DYNAMIC_OPTION. + +2011-01-29 Dodji Seketeli + + PR c++/47311 + * cp-tree.h (fixup_template_parms): Declare. + * pt.c (end_template_parm_list): Do not fixup template parms here. + (fixup_template_parms): Remove static. Fix typo in the + comments. Remove useless code statement. + (fixup_template_parm): For a template template parameter, fixup + its attributes before fixing up its type. + * parser.c + (cp_parser_template_declaration_after_export): After parsing + template parameters fixup their types. + +2011-01-26 Jakub Jelinek + + PR c++/47476 + * semantics.c (potential_constant_expression_1): Handle + TRUTH_XOR_EXPR. + +2011-01-26 Dave Korn + + PR c++/43601 + * semantics.c (expand_or_defer_fn_1): Handle it. + * decl2.c (decl_needed_p): Likewise. + +2011-01-21 Jason Merrill + + PR c++/47041 + * semantics.c (build_constexpr_constructor_member_initializers): + Handle trivial copy. + +2011-01-21 Jakub Jelinek + + PR c++/47388 + * semantics.c (begin_for_stmt): If -fno-for-scope, don't + assume init must be NULL if scope is NULL. + (begin_range_for_stmt): Likewise. + +2011-01-21 Jason Merrill + + PR c++/46552 + * semantics.c (cxx_eval_constant_expression): Handle OFFSET_REF. + + PR c++/46977 + * semantics.c (potential_constant_expression_1): Split out from + potential_constant_expression. Add want_rval parm. Handle + template expression forms. Don't enforce restriction on address + of automatic variable here. Add a couple of diagnostics that + had been missing. + (require_potential_constant_expression): New entry point. + (build_data_member_initialization, register_constexpr_fundef): Adjust. + (maybe_constant_value): Check potential_constant_expression. + * pt.c (fold_non_dependent_expr_sfinae): Likewise. + * tree.c (build_vec_init_expr): Adjust. + +2011-01-19 Jakub Jelinek + + PR c++/47303 + * decl2.c (finish_anon_union): Only call mangle_decl if TREE_STATIC + or DECL_EXTERNAL. + +2011-01-17 Jason Merrill + + PR c++/47067 + * semantics.c (base_field_constructor_elt): New fn. + (cxx_eval_bare_aggregate): Use it. + (build_data_member_initialization): Leave COMPONENT_REF for + vfield inits. + +2011-01-14 Rodrigo Rivas Costa + + * parser.c (cp_parser_range_for): Remove the "unused variable" warning + workaround. + +2011-01-15 Giovanni Funchal + Jonathan Wakely + + PR c++/33558 + * decl.c (grokdeclarator): Reject mutable reference members. + +2011-01-14 Jason Merrill + + PR c++/47289 + * pt.c (coerce_template_parms): Fix error recovery. + + PR c++/46903 + * typeck2.c (check_narrowing): Only check arithmetic types. + + PR c++/46688 + * tree.c (build_vec_init_expr): Handle flexible array + properly. + +2011-01-13 Kai Tietz + + PR c++/47213 + * cp-tree.h (CLASSTYPE_VISIBILITY): Use + TYPE_MAIN_DECL instead of TYPE_NAME. + (CLASSTYPE_VISIBILITY_SPECIFIED): Likewise. + * decl2.c (determine_visibility): Add check + of CLASS_TYPE_P for underlying_type. + +2011-01-12 Rodrigo Rivas Costa + + * cp-tree.h (begin_for_scope): New prototype. + (begin_for_stmt): Update prototype. + (begin_range_for_stmt): Update prototype. + * init.c (build_vec_init): Update call to begin_for_stmt. + * parser.c (cp_parser_for): New. + (cp_parser_c_for): Add three new parameters. + (cp_parser_range_for): Likewise. Most parsing code removed. + (cp_parser_iteration_statement): Call cp_parser_for instead of + cp_parser_c_for and cp_parser_range_for. + (cp_parser_for_init_statement): Add new parameter and return type. + (cp_parser_block_declaration): Update call to + cp_parser_simple_declaration. + (cp_parser_simple_declaration): Add new parameter. + Update call to cp_parser_init_declarator. + (cp_parser_init_declarator): Add new parameter. + * pt.c (tsubst_expr): Update call to begin_for_stmt. + * semantics.c (begin_for_scope): New. + (begin_for_stmt): Add two new parameters. + (begin_range_for_stmt): Likewise. + +2011-01-12 Nicola Pero + + * parser.c (cp_parser_objc_at_property_declaration): Improved + error message. + +2011-01-11 Dodji Seketeli + + PR debug/46955 + * cp-lang.c (get_template_innermost_arguments_folded) + (get_template_argument_pack_elems_folded) + (template_arg_needs_folding, fold_cplus_constants): New static + functions. + (LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS): Set this hook to + get_template_innermost_arguments_folded. + (LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS): Set this hook to + get_template_argument_pack_elems_folded. + +2011-01-11 Jason Merrill + + PR c++/46658 + * init.c (build_new_1): Handle value-init in templates differently. + + PR c++/45520 + * tree.c (maybe_dummy_object): Check current_class_ref against + context, not current_class_type. + +2011-01-08 Nicola Pero + + PR objc/47078 + * parser.c (cp_parser_objc_typename): If the type is unknown, for + error recovery purposes behave as if it was not specified so that + the default type is used. + +2011-01-07 Jakub Jelinek + + PR c++/47022 + * pt.c (tsubst_copy_and_build): Use tsubst instead of tsubst_copy + for the second build_x_va_arg argument. + +2011-01-05 Tom Tromey + + * typeck.c (cp_build_addr_expr_1): Update call to lvalue_error. + (lvalue_or_else): Likewise. + +2011-01-01 Kai Tietz + + PR target/38662 + * tree.c (cxx_type_hash_eq): + Allow METHOD_TYPE, too. + + +Copyright (C) 2011 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1993 b/gcc/cp/ChangeLog-1993 new file mode 100644 index 000000000..45ca571fa --- /dev/null +++ b/gcc/cp/ChangeLog-1993 @@ -0,0 +1,613 @@ +Tue Dec 28 21:10:03 1993 Mike Stump + + * cp-init.c (expand_vec_init): Remove comptypes test, as it is too + harsh here. + +Tue Dec 28 13:42:22 1993 Mike Stump + + * cp-pt.c (do_pending_expansions): Decide to expand a template + member function, based upon it's class type, not the class type of + the first place it was declared. + +Tue Dec 28 05:42:31 1993 Mike Stump + + * cp-class.c (is_normal): New routine, use to determine when the + given binfo is the normal one. (The one that should have the simple + vtable name.) + * cp-class.c (modify_other_vtable_entries): Use DECL_ASSEMBLER_NAME + to check if two fndecls are `the same'. Sometimes this routine can + modify the main vtable, and normal should be 1, in that case, so use + is_normal() to determine if this is the main vtable for the class. + Don't recurse down virtual bases, as they are shared, and we take + care of them elsewhere. + * cp-class.c (modify_vtable_entries): If we have already updated the + vtable with the new virtual, don't do it again. + * cp-class.c (finish_struct): Set CLASSTYPE_VFIELD_PARENT as + appropriate. Do virtual function overriding in virtual bases, after + normal overriding, so that the base function list in DECL_VINDEX is + not overridden, before we have a chance to run through the list. + Use DECL_ASSEMBLER_NAME to check if two fndecls are `the same'. + Make sure we pass the right address into modify_vtable_entries. + * cp-tree.h (CLASSTYPE_VFIELD_PARENT): New field to indicate which + binfo is the one that has the vtable that we based our vtable on. + +Fri Dec 24 09:40:52 1993 Michael Tiemann + + * cp-typeck.c (c_expand_start_case): Use default_conversion to + convert expression from reference type if necessary. + +Wed Dec 22 17:58:43 1993 Jason Merrill + + * cp-typeck.c (build_unary_op): Make sure that it's a TREE_LIST before + trying to read its TREE_VALUE. + + * cp-class.c (finish_struct_methods): Clear DECL_IN_AGGR_P here. + (finish_struct): Instead of here. + +Tue Dec 21 14:34:25 1993 Brendan Kehoe + + * cp-tree.c (list_hash_lookup_or_cons): Make sure the type doesn't + have TYPE_PTRMEMFUNC_P set before we try to build its + CLASSTYPE_ID_AS_LIST. + (get_decl_list): Likewise, when trying to read it. + + * cp-tree.h (VTABLE_NAME): No def with NO_{DOLLAR,DOT} defined. + (VTABLE_NAME_P): Use it instead of VTABLE_NAME_FORMAT. + +Mon Dec 20 13:35:03 1993 Brendan Kehoe + + * cp-typeck.c (rationalize_conditional_expr): New function. + (unary_complex_lvalue): Use it. + (build_modify_expr): Use it, since trying to do an ADDR_EXPR of it + with build_unary_op won't cut it. Don't wrap the COND_EXPR with a + SAVE_EXPR either. + + * cp-decl2.c (explicit_warn_return_type): Deleted variable. + (lang_decode_option): Set warn_return_type, not explicit_*, for + -Wreturn-type and -Wall. This is what rest_of_compilation uses to + decide if it should go into jump_optimize or not. + * cp-tree.h (explicit_warn_return_type): Deleted. + * cp-decl.c (grokdeclarator): Use warn_return_type, not explicit_*. + (finish_function): Also complain about no return in a non-void fn if + we're being pedantic (don't rely on use of -Wreturn-type). + +Fri Dec 17 15:45:46 1993 Brendan Kehoe + + * cp-decl.c (grokdeclarator): Forbid declaration of a function as + static if it's being done inside another function. + + * cp-search.c (compute_visibility): Check for friendship both ways. + +Fri Dec 17 14:28:25 1993 Jason Merrill + + * cp-cvt.c (build_default_binary_type_conversion): Make error + messages more helpful. + + * cp-error.c (op_as_string): New function, returns "operator ==" + given EQ_EXPR or suchlike. + +Fri Dec 17 13:28:11 1993 Brendan Kehoe + + * cp-call.c (print_n_candidates): New function. + (build_overload_call_real): Use it when we complain about a call + being ambiguous. + +Fri Dec 17 12:41:17 1993 Jason Merrill + + * cp-call.c (build_method_call): Fix checking for static call + context. + + * cp-method.c (build_opfncall): Call build_indirect_ref on argument + to operator new. + + * cp-init.c (build_new): Don't mess with rval when building + indirect ref. + +Thu Dec 16 16:48:05 1993 Kung Hsu + + * cp-lex.c (default_assign_ref_body): Add check when TYPE_NESTED_ + NAME(type) may not be exist. It's not a problem for old compiler. + +Thu Dec 16 14:46:06 1993 Brendan Kehoe + + * cp-tree.h (CLASSTYPE_ALTERS_VISIBILITIES_P): Delete macro, it's + never used for anything. + (struct lang_type, member type_flags): Delete field + `alters_visibility', and up `dummy' by 1. + * cp-class.c (finish_base_struct): Delete code that copies the + setting of CLASSTYPE_ALTERS_VISIBILITIES_P. + (finish_struct): Delete code that sets it. + +Thu Dec 16 14:44:39 1993 Jason Merrill + + * cp-decl.c, cp-init.c, cp-typeck.c: Fix arguments to + build_method_call that I messed up before. + + * cp-search.c (get_base_distance): If protect > 1, allow immediate + private base. + + * cp-class.c (finish_base_struct): Set cant_synth_* correctly. + (finish_struct): Likewise. Well, nigh-correctly; it won't deal + properly with the case where a class contains an object of an + ambiguous base class which has a protected op=. Should be fixed + when the access control code gets overhauled. + (finish_struct_methods): Set TYPE_HAS_NONPUBLIC_* correctly. + +Thu Dec 16 12:17:06 1993 Brendan Kehoe + + * cp-lex.c (real_yylex): Turn the code back on that deals with + __FUNCTION__ and __PRETTY_FUNCTION__. Don't use lookup_name, to + avoid the ambiguity problems that led to it being turned off in the + first place. + + * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P + to see if something is a method. + +Wed Dec 15 18:35:58 1993 Mike Stump + + * cp-typeck.c (build_modify_expr): Avoid error messages on small + enum bit fields. + * cp-typeck.c (convert_for_assignment): Add missing argument to + cp_warning and cp_pedwarn calls. + +Wed Dec 15 18:25:32 1993 Jason Merrill + + * cp-parse.y (member_init): ANSI C++ doesn't forbid old-style base + initializers; it's just anachronistic. + + * cp-decl.c (finish_decl): Don't require external-linkage arrays + to have a complete type at declaration time when pedantic. + +Tue Dec 14 11:37:23 1993 Jason Merrill + + * cp-decl.c (pushdecl): Don't set DECL_CONTEXT if it's already set. + + * cp-call.c (build_method_call): Don't dereference pointer given + as instance. + + * cp-decl.c (finish_function): Don't pass pointer to + build_method_call. + (finish_function): Likewise. + + * cp-typeck.c (build_x_function_call): Likewise. + + * cp-method.c (build_component_type_expr): Likewise. + + * cp-init.c (build_member_call): Likewise. + (build_new): Likewise. + +Mon Dec 13 18:04:33 1993 Kung Hsu + + * cp-decl.c (xref_tag): Fix regression created by changes made + in Dec. 7 1993. + * cp-decl.c (xref_defn_tag): Fix parallel nested class problem. + +Fri Dec 10 12:40:25 1993 Brendan Kehoe + + * cp-call.c (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print + out the final evaluation of the function, so we can see if ELLIPSIS, + USER, and EVIL were set at the end. + + * cp-call.c (convert_harshness_ansi): When the parm isn't an lvalue, + only go for setting TRIVIAL_CODE if we are dealing with types that + are compatible. + +Thu Dec 9 18:27:22 1993 Mike Stump + + * cp-decl.c (flag_huge_objects): New flag to allow large objects. + * toplev.c (lang_options): Likewise. + * cp-decl2.c (flag_huge_objects, lang_f_options): Likewise. + * cp-decl.c (delta_type_node): New type for delta entries. + * cp-tree.h (delta_type_node): Likewise. + * cp-decl.c (init_decl_processing): Setup delta_type_node. + * cp-decl.c (init_decl_processing, build_ptrmemfunc_type): Use + delta_type_node instead of short_integer_type_node. + * cp-class.c (build_vtable_entry): Likewise. + +Thu Dec 9 16:19:05 1993 Brendan Kehoe + + * cp-tree.h (OPERATOR_TYPENAME_P): Define outside of + NO_{DOLLAR,DOT} macro checks, so it always gets defined. + (VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL. + +Wed Dec 8 17:38:06 1993 Mike Stump + + * cp-decl.c (finish_decl): Make sure things that can go into + "common", do go into common, if -fcommon is given. + +Wed Dec 8 13:01:54 1993 Brendan Kehoe + + * cp-call.c (print_harshness) [DEBUG_MATCHING]: New function. + (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print out + argument matching diagnostics to make instantly clear what the + compiler is doing. + + * cp-call.c (convert_harshness_ansi): If the parm isn't an lvalue, + then check to see if the penalty was increased due to + signed/unsigned mismatch, and use a TRIVIAL_CODE if it wasn't. + +Tue Dec 7 18:29:14 1993 Kung Hsu + + * cp-decl.c (xref_tag, pushtag): Fix nested class search/resolution + problem. + +Tue Dec 7 16:09:34 1993 Jason Merrill + + * cp-class.c (finish_struct): Before synthesizing methods, if no + methods have yet been declared then set nonprivate_method. Don't + set non_private method after synthesizing a method. + + * cp-lex.c (extract_interface_info): If flag_alt_external_templates + is set, tie emitted code to the location of template instantiation, + rather than definition. + + * cp-tree.h: Declare flag_alt_external_templates. + + * cp-decl2.c (lang_decode_option): Support -falt-external-templates. + + * toplev.c (lang_options): Likewise. + +Mon Oct 4 12:50:02 1993 Chip Salzenberg + + [changes propagated from 930810 snapshot] + * cp-decl.c (init_decl_processing): Make long long available for use + as SIZE_TYPE and PTRDIFF_TYPE. + (finish_decl): Allow file-scope static incomplete array. + (grokdeclarator): Don't pass on const and volatile fron function + value type to function type. + Warn here for volatile fn returning non-void type. + * cp-parse.y (attrib): Accept attributes `volatile' with alias + `noreturn', and `const'. + * cp-typeck.c (default_conversion): Don't lose const and volatile. + (build_binary_op_nodefault): Generate pedantic warning for comparison + of complete pointer type with incomplete pointer type. + (build_c_cast): Be careful that null pointer constant be INTEGER_CST. + +Tue Dec 7 10:46:48 1993 Jason Merrill + + * cp-init.c (expand_vec_init): When creating a temporary for copying + arrays, use the type of the source, not the target. + + * cp-cvt.c (convert): Pass an argument for errtype to + convert_to_reference. + + * cp-error.c (dump_expr, COMPONENT_REF & CALL_EXPR): Deal with + methods, -> and `this'. + +Mon Dec 6 17:12:33 1993 Jason Merrill + + * cp-error.c (parm_as_string): New function; returns `this' or arg + number. Corresponds to %P. + (dump_expr): Deal with method calls. + + * cp-cvt.c (convert_to_reference): Stop using warn_for_assignment. + * cp-typeck.c (convert_for_assignment): Likewise. + (warn_for_assignment): Lose. + +Mon Dec 6 11:33:35 1993 Brendan Kehoe + + * cp-call.c (ideal_candidate_ansi): Delete code that was never + doing anything useful. Instead, sort once, and DO NOT wipe + out any codes with EVIL_CODE, since that's what we use as a + marker for the end of the list of candidates. + + * cp-cvt.c (convert_to_aggr): Make sure to always set H_LEN. + +Mon Dec 6 12:49:17 1993 Jason Merrill + + * cp-init.c (get_aggr_from_typedef): New function, like + is_aggr_typedef but returns the _TYPE. + + * cp-call.c, cp-init.c, cp-method.c: Eradicate err_name. + +Sun Dec 5 18:12:48 1993 Brendan Kehoe + + * cp-lex.c (readescape): Pedwarn when a hex escape is out of range. + +Thu Nov 25 23:50:19 1993 Chip Salzenberg + + Delay language context change until beginning of next decl. + + * cp-lex.h (c_header_level): Removed. + (pending_lang_change): Declared. + * cp-lex.c (c_header_level): Renamed from in_c_header, made static. + (pending_lang_change): Defined. + (check_newline): Rework code that recognizes line number and + filename changes. Instead of pushing and popping lang context, + increment and decrement pending_lang_change. + (do_pending_lang_change): Push and pop lang context according + to value of pending_lang_change. + * cp-parse.y (extdefs): Use lang_extdef instead of extdef. + (extdef): Same as extdef, but call do_pending_lang_change() first. + +Mon Nov 15 15:39:15 1993 Chip Salzenberg + + * cp-typeck.c (build_binary_op_nodefault): Warn for ordered + compare of ptr with 0 only if pedantic in both cases. + +Thu Nov 25 13:31:37 1993 Chip Salzenberg + + Reinstate the below patch, which got lost in the Cygnus merge: + Tue Nov 23 13:59:24 1993 Hallvard B Furuseth (hbf@durin.uio.no) + * cp-parse.y (maybe_type_qual): Don't fail to set $$. + +Wed Nov 17 19:03:30 1993 Chip Salzenberg + + * cp-parse.y (attrib): Allow "ident(ident)" like the C front end. + +Fri Oct 22 20:43:37 1993 Paul Eggert + + * cp-lex.c (real_yylex): Diagnose floating point constants + that are too large. + +Wed Nov 17 19:10:37 1993 Chip Salzenberg + + * cp-type2.c (build_functional_cast): ARM page 16: When a class + and an object, function or enumerator are declared in the same + scope with the same name, the class name is hidden. + +Wed Nov 17 19:07:18 1993 Chip Salzenberg + + * cp-call.c (convert_harshness_ansi): Distinguish float, double, + and long double from each other when overloading. + (compute_conversion_costs_{ansi,old}, build_method_call, + build_overlay_call_real, convert_to_aggr): Always set and + always use H_LEN member of candidate structure. + +Mon Oct 11 23:10:53 1993 Chip Salzenberg + + * cp-decl.c (duplicate_decls): Note redeclarations of library + functions, and generate distinct warnings for them. + +Mon Oct 4 12:26:49 1993 Chip Salzenberg + + Support format warnings in G++. + + * cp-tree.h: Protect against multiple inclusion. + Declare all public functions in c-common.c (copy from c-tree.h). + (STDIO_PROTO): Define. + (warn_format): Declare. + (record_format_info): Remove declaration. + * cp-decl.c (init_decl_processing): Call init_function_format_info. + * cp-decl2.c (lang_decode_option): Make "-Wall" include warn_format. + * cp-typeck.c (build_function_call_real): Call check_function_format. + (record_format_info): Remove -- obsolete stub. + +Sat Jul 24 12:04:29 1993 Chip Salzenberg + + * cp-decl.c (duplicate_decls): Don't warn for non-extern var decl + following an extern one (for -Wredundant-decls). + * cp-parse.y (primary): In statement expression case, if compstmt + returns something other than a BLOCK, return it unchanged. + +Thu Dec 2 20:44:58 1993 Chip Salzenberg + + * cp-decl.c (warn_extern_redeclared_static): New function made + from code extracted from pushdecl. + (duplicate_decls, pushdecl): Call new function. + (lookup_name_current_level): Allow for IDENTIFIER_GLOBAL_VALUE + to be a TREE_LIST when function is declared in 'extern "C" {}'. + +Fri Dec 3 16:01:10 1993 Jason Merrill + + * cp-class.c (duplicate_tag_error): Use cp_error. + (finish_base_struct): Check for ambiguity with direct base, and don't + generate op= or copy ctor if it exists. + +Fri Dec 3 15:32:34 1993 Kung Hsu + + * cp-init.c (expand_member_init): When initializer name is null, + don't try to build it now because emit_base_init will handle it. + +Fri Dec 3 12:28:59 1993 Jason Merrill + + * cp-lex.c (init_lex): Initialize input_filename to "" for + code such as ExceptionHandler::operator=. + +Fri Dec 3 10:32:08 1993 Jason Merrill + + * cp-decl.c (grokdeclarator): Don't try to print out dname when + complaining about arrays of references if decl_context==TYPENAME, + since it will be null. + + * cp-decl2.c: Default to flag_ansi_overloading. + +Thu Dec 2 18:05:56 1993 Kung Hsu + + * cp-call.c (build_method_call): Use binfo from instance if it's + different from binfo (basetype_path) passed from above. + +Wed Nov 17 19:14:29 1993 Chip Salzenberg + + cp-error.c (dump_expr): Use unsigned chars to output a + TREE_REAL_CST in hex. + +Thu Dec 2 11:05:48 1993 Jason Merrill + + * cp-class.c (finish_struct): Fix typo in setting + cant_synth_asn_ref. + + * cp-tree.h (TYPE_NESTED_NAME): New macro, does + DECL_NESTED_TYPENAME (TYPE_NAME (NODE)). + + * cp-lex.c (default_copy_constructor_body): Change + DECL_NAME (TYPE_NAME (btype)) to TYPE_NESTED_NAME (btype). + (default_assign_ref_body): Likewise. + (default_copy_constructor_body): Call operator= explicitly for + base classes that have no constructor. + +Thu Dec 2 10:47:15 1993 Michael Tiemann + + * cp-call.c (build_method_call): If the instance variable is + converted to error_mark_node when we're trying to convert it to the + base type of a method we're looking up, return error_mark_node. + +Thu Dec 2 10:41:16 1993 Torbjorn Granlund + + * cp-typeck.c (build_binary_op_nodefault): In *_DIV_EXPR *_MOD_EXPR + cases, tests for unsigned operands by peeking inside a NOP_EXPR. + +Wed Dec 1 13:33:34 1993 Brendan Kehoe + + * cp-call.c (compute_conversion_costs_ansi): Use the size of struct + harshness_code, not the size of short, for clearing out the + ansi_harshness. + + * cp-call.c (print_candidates): New function. + (build_method_call): When we had some candidates, but didn't get a + usable match, don't report that we got an error with the first + candidate. Instead, say there were no matches, and list the + candidates with print_candidates. In the second pass, make sure we + clear out ever_seen, so we can accurately count the number of + functions that qualified. + +Wed Dec 1 09:53:59 1993 Torbjorn Granlund + + * cp-typeck.c (build_binary_op_nodefault): Shorten for *_MOD_EXPR + only if op1 is known to be != -1. + (build_binary_op_nodefault): Handle *_DIV_EXPR likewise. + +Tue Nov 30 14:07:26 1993 Brendan Kehoe + + * cp-method.c (hack_identifier): If the field itself is private, and + not from a private base class, say so. + +Mon Nov 29 03:00:56 1993 Jason Merrill + + * cp-decl.c (grokdeclarator): Always warn on initialization of + const member. + +Wed Nov 24 00:49:35 1993 Jason Merrill + + * cp-class.c (finish_struct): Set TYPE_GETS_CONST_* properly. + (finish_base_struct): Set cant_synth_asn_ref properly. + + * cp-lex.c (cons_up_default_function): Add section for operator=. + (default_assign_ref_body): New function, mostly cribbed from + default_copy_constructor_body. + + * cp-class.c (base_info): Add members cant_synth_copy_ctor, + cant_synth_asn_ref, no_const_asn_ref. + (finish_base_struct): Update no_const_asn_ref, note that you should + update cant_synth_*, propagate TYPE_GETS_ASSIGN_REF. + (finish_struct): Add decls for cant_synth_*, no_const_asn_ref, and + initialize them properly. Set no_const_asn_ref properly. Set + cant_synth_* in some of the situations where they should be set. + Propagate TYPE_GETS_ASSIGN_REF. Use cant_synth_copy_ctor. Add call + to cons_up_default_function for operator=. + +Tue Nov 23 20:24:58 1993 Mike Stump + + * cp-cvt.c (convert_force): Add code to perform casting of pointer + to member function types. + * cp-typeck.c (build_ptrmemfunc): Add FORCE parameter to indicate + when the conversion should be done, regardless. + * cp-tree.h (build_ptrmemfunc): Likewise. + * cp-type2.c (digest_init): Likewise. + * cp-typeck.c (convert_for_assignment): Likewise. + +Tue Nov 23 18:06:58 1993 Jason Merrill + + * cp-error.c (dump_expr): Do the right thing for variables of + reference type. + + * cp-decl.c (grok_op_properties): Set TYPE_HAS_ASSIGN_REF + and its kin properly. + (xref_tag): Propagate TYPE_GETS_ASSIGN_REF. + +Tue Nov 23 12:26:13 1993 Mike Stump + + * cp-method.c (build_opfncall): Don't count pointer to member + functions as aggregates here, as we don't want to look up methods in + them. The compiler would core dump if we did, as they don't have + normal names. + * cp-typeck.c (build_indirect_ref): Improve wording on error + message. + +Mon Nov 22 14:22:23 1993 Jason Merrill + + * cp-decl.c (grok_op_properties): Allow operator?: with pedwarn + (since it's supported in other compiler bits). + + * cp-method.c (report_type_mismatch): Use cp_error; ignore err_name + argument. + + * cp-error.c (dump_function_decl): Don't print return type for + constructors and destructors. + + * cp-cvt.c (cp_convert_to_pointer): Import code from + convert_to_pointer so we can return error_mark_node in the case of an + error, and to allow more meaningful error messages. + (build_type_conversion): Don't go through void* when trying + to convert to a pointer type. + + * cp-decl.c (grokfndecl): Move call to grok_op_properties back + after grokclassfn so that it's dealing with the right decl. + (grok_op_properties): Don't assert !methodp for op new and op delete. + + * cp-init.c (build_delete): Don't use TYPE_BUILT_IN (there are now + no uses of it in the compiler). + + * cp-call.c (build_scoped_method_call): Fix for destructors of simple + types. + (build_method_call): Likewise. + +Fri Nov 19 12:59:38 1993 Jason Merrill + + * cp-tree.c (count_functions): Abstraction function. + + * cp-call.c (build_overload_call_real): Deal with new overloading + properly, remove dead code. + + * gcc.c (default_compilers): Generate and use .ii files in the + intermediate stage of compiling C++ source. + +Fri Nov 19 11:26:09 1993 Jim Wilson + + * cp-expr.c (cplus_expand_expr): Make call_target a valid memory + address before using it, so it can be later safely compared. + +Fri Nov 12 15:30:27 1993 Jason Merrill + + * cp-pt.c (tsubst): Deal with new overloading. + + * cp-typeck.c (fntype_p): Is the arg function type? + (comp_target_parms): pedwarn on conversion from (anything) to (...). + (build_x_function_call): Deal with new overloading. + + * cp-tree.c (decl_list_length): Deal with new overloading. + (decl_value_member): Like value_member, but for DECL_CHAINs. + + * cp-decl.c (duplicate_decls): Deal with new overloading. + (start_decl): Likewise. + + * cp-class.c (instantiate_type): Deal with new overloading. + + * cp-call.c (convert_harshness_ansi): Deal with new overloading. + (convert_harshness_old): Deal with new overloading. + (build_overload_call_real): Likewise. + +Mon Nov 8 13:50:49 1993 Jason Merrill + + * cp-tree.c (get_unique_fn): New function; returns FUNCTION_DECL + if unambiguous, NULL_TREE otherwise. + (get_first_fn): Returns the first appropriate FUNCTION_DECL. + (is_overloaded_fn): Returns whether or not the passed tree is + a function or list of functions. + + * cp-init.c (init_init_processing): Use `get_first_fn' to find + the FUNCTION_DEFN for new and delete. + + * cp-decl.c (push_overloaded_decl): Use new overloading strategy, cut + code size in half (I spit on special cases). + +Tue Sep 7 20:03:33 1993 Jason Merrill + + * cp-decl.c: Allow references and template type parameters as well + + +Copyright (C) 1993 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1994 b/gcc/cp/ChangeLog-1994 new file mode 100644 index 000000000..8ff502f63 --- /dev/null +++ b/gcc/cp/ChangeLog-1994 @@ -0,0 +1,5412 @@ +Fri Dec 30 17:57:30 1994 Mike Stump + + * gc.c (build_bltn_desc): Handle bool as a built-in type. + +Fri Dec 30 14:20:21 1994 Mike Stump + + * tree.c (layout_vbasetypes): Ensure that we don't loose alignment + on the complete type because of small virtual bases. + +Fri Dec 30 12:22:29 1994 Mike Stump + + * decl.c (n_incomplete): Bump n_incomplete up to int to match C + front end. + (pushdecl): Also count decls pushed that are of a type being defined + as incomplete things. + * class.c (finish_struct): Move hack_incomplete_structures up to + just after we set it as not being defined, so that the decls we + build for RTTI don't count as incomplete. + +Thu Dec 29 18:20:57 1994 Mike Stump + + * pt.c (tsubst): Fix problem with defining constructors in templated + classes with virtual bases. + +Wed Dec 28 08:31:00 1994 Mike Stump + + * parse.y (TYPEID): Strip top-level cv-qualifiers on typeid + expressions. + * gc.c (build_typeid): Likewise. + +Thu Dec 22 17:26:33 1994 Mike Stump + + * cvt.c (build_up_reference): Fix breakage introduced on Nov 29, + don't assert on complex AGGR inits. + +Thu Dec 22 14:32:31 1994 Mike Stump + + * method.c (build_overload_value): Handle pointer to members as + template arguments. + +Thu Dec 22 13:09:07 1994 Mike Stump + + * typeck.c (unary_complex_lvalue): Don't call sorry if we know how + to do take the address of a data member for a pointer to data + member. + +Thu Dec 22 10:04:19 1994 Mike Stump + + * decl.c (grokdeclarator): Use the typedef name for linkage if the + type doesn't otherwise have a name. + + * decl2.c (grokfield): Likewise. + + * class.c (finish_struct): Since we reuse the TYPE_DECL for the + DECL_NAME of enums, structs and classes, we have to avoid trying to + put it in the TYPE_FIELDS again. + +Wed Dec 21 11:07:05 1994 Mike Stump + + * decl2.c (check_classfn): Ignore this parameter on static functions + when checking to see if we match. + +Tue Dec 20 17:47:02 1994 Mike Stump + + * typeck.c (unary_complex_lvalue): Handle address of non-left most + pointers to members by calling get_delta_difference. + +Mon Dec 19 22:40:53 1994 Mike Stump + + * decl2.c (check_classfn): Don't use decls_match yet, as it modifies + static functions to early. + +Thu Dec 19 22:37:48 1994 Mike Stump + + * method.c (make_thunk): Handle encoding of positive thunk offsets. + +Sat Dec 17 13:29:50 1994 Doug Evans + + * Make-lang.in (.PHONY): Tell GNU make C++ and c++ are phony targets. + +Thu Dec 15 16:32:12 1994 Mike Stump + + * decl2.c (check_classfn): Use decls_match to check if this has + already been declared, as the DECL_ASSEMBLER_NAME may have been + changed via asm("new_name"). + * decl.c (decls_match): Make public. + +Thu Dec 15 15:17:55 1994 Mike Stump + + * *.[chy] (expand_aggr_init): Add fourth argument to handle + distinction between = init and (init) style of initializations. + * *.[chy] (finish_decl): Add fifth argument to handle + distinction between = init and (init) style of initializations. + +Tue Dec 13 19:16:05 1994 Mike Stump + + Fix some random `explicit' bugs. + + * cvt.c (convert_to_reference): Add third parameter to + convert_force. + (convert_force): Likewise. + * call.c (build_method_call): Likewise. + * decl2.c (setup_vtbl_ptr): Likewise. + * init.c (expand_virtual_init): Likewise. + (build_member_call): Likewise. + (build_delete): Likewise. + (build_vbase_delete): Likewise. + * typeck.c (build_component_addr): Likewise. + (build_c_cast): Likewise. + (build_modify_expr): Likewise. + * cp-tree.h (CONV_NONCONVERTING): Likewise. Add so that we can + distinguish the context in which the conversion appears. Add thrid + argument to build_c_cast. + * cvt.c (cp_convert): Pass whether or not we want to consider + non-converting constructors down to build_method_call. + * decl2.c (reparse_absdcl_as_casts): Add third argument to + build_c_cast. + * gc.c (build_m_desc): Likewise. + * init.c (build_new): Likewise. + * parse.y (expr_no_commas): Likewise. + (primary): Likewise. + * typeck.c (build_x_function_call): Likewise. + (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (build_c_cast): Likewise. + (build_ptrmemfunc): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * init.c (expand_aggr_init): Added LOOKUP_ONLYCONVERTING to + expand_aggr_init_1 as inits are converted to the destination type. + +Tue Dec 13 16:18:57 1994 Jason Merrill + + * Make-lang.in (cc1plus): Depends on c-pragma.o. + + * Makefile.in (OBJ{DEP,}S): Add ../c-pragma.o. + + * lex.c (check_newline): If the #pragma is not recognized by g++, + try machine-specific ones too. + (handle_sysv_pragma): Copied from c-lex.c. + +Mon Dec 12 23:53:06 1994 Mike Stump + + * except.c (expand_throw): Fix Dec 6th change, build_new likes a + reference better. + +Mon Dec 12 18:01:00 1994 Jason Merrill + + * typeck.c (build_binary_op): Lose checks on TYPE_PTRMEMFUNC_P with + IS_AGGR_TYPE, since now they will not both be set on the same type. + + * pt.c (do_pending_expansions): Don't clear TREE_PUBLIC on + instantiations controlled by -fexternal-templates. + + * decl.c (duplicate_decls): Don't complain about different values of + __attribute__ ((const)) and ((noreturn)). + +Fri Dec 9 18:17:37 1994 Doug Evans + + * Makefile.in (BISONFLAGS): Delete --yacc. + (PARSE_H): Depend on $(PARSE_C), for parallel makes. + (PARSE_C): Undo last patch. + +Fri Dec 2 10:44:36 1994 Mike Stump + + * Makefile.in (BISONFLAGS): Add --yacc so that output winds up in + y.tab.c. + +Thu Dec 8 17:39:46 1994 Jason Merrill + + * decl.c (finish_decl): Don't call obscure_complex_init for decls + of indeterminate size. + +Wed Dec 7 16:49:22 1994 Jason Merrill + + * decl.c (obscure_complex_init): Function to tweak the decl to + prevent expand_decl from tring to initialize it. + (finish_decl): Use it rather than writing the same code in three + different places. + + * parse.y (bad_parm): Stop trying to support parms without types. + +Wed Dec 7 12:06:56 1994 Mike Stump + + * decl2.c (grokfield): Make asm specs on static member functions + work. + +Tue Dec 6 15:43:20 1994 Mike Stump + + * except.c (expand_throw): Make a copy of the thrown object. + +Tue Dec 6 14:16:34 1994 Jason Merrill + + * parse.y: : Has lower precedence than =. + +Tue Dec 6 12:46:17 1994 Mike Stump + + * decl.c (pushdecl): Use DECL_NAME of VAR_DECLs to avoid namespace + manglings. + (grokvardecl): Add namespace into variable name. + +Tue Dec 6 11:26:55 1994 Mike Stump + + * decl2.c (current_namespace_id): New routine to transform a simple + name into a name in a namespace. + * decl.c (grokdeclarator): Use it. + * decl2.c (get_namespace_id): Find the name of the current + namespace. + (push_namespace, pop_namespace): Complete out missing + functionality. + +Mon Dec 5 17:11:51 1994 Jason Merrill + + * class.c (finish_struct): Don't use LONG_LONG_TYPE_SIZE, as it may + not be defined. Fix warning message for enums and restore warning + for non-enums. + + * decl2.c (push_namespace): Dummy function. + (pop_namespace): Likewise. + (do_namespace_alias): Likewise. + (do_using_decl): Likewise. + (do_using_directive): Likewise. + + * parse.y: New token NSNAME for namespace names. + (extdef): Add namespace, using definitions. + (using_decl): New rule for using declarations. + (any_id): New rule for identifiers with any degree of scoping. + (identifier): Add NSNAME. + (notype_identifier): Likewise. + (component_decl): Add using_decl. + (nested_name_specifier): Add NSNAME SCOPE. + + * typeck.c (convert_for_assignment): Handle conversions between + enums and bool. + + * decl.c (duplicate_decls): Only propagate DECL_MAIN_VARIANT on + FUNCTION_DECLs. + +Mon Dec 5 13:03:16 1994 Mike Stump + + * class.c (finish_struct): Give an error if one tries to declare a + bit-field's size greater than a long long, as the backend will dump. + It is not an error to declare an enum bit-field greater than its + precision. Warn if an enum bit-field is too small to hold all + its values. + +Mon Dec 5 11:41:50 1994 Mike Stump + + * typeck.c (convert_for_assignment): Use cp_convert instead of + convert so that we don't get static casts. + +Sun Dec 4 11:59:01 1994 Mike Stump + + * cvt.c (cp_convert): Don't complain about int->enum conversion if + we are doing static casts. + +Fri Dec 2 18:32:41 1994 Mike Stump + + * error.c (dump_expr): Do something more intelligent with SAVE_EXPRs + when dumping expressions in error messages. + +Fri Dec 2 17:04:27 1994 Mike Stump + + * gc.c (build_dynamic_cast): Change interface to libg++, ensure that + the return type is the right type, and make references work. + +Fri Dec 2 16:36:43 1994 Jason Merrill + + * decl.c (poplevel): Don't be confused by function-scope + declarations of non-nested functions. + (duplicate_decls): Propagate DECL_MAIN_VARIANT. + (pushdecl): Use duplicate_decls to copy info from old decl into new + function-scope one rather than doing it here. + + * decl2.c (mark_inline_for_output): Deal with the DECL_MAIN_VARIANT + of this decl, in case this is a function-scope declaration. + + * decl.c (finish_enum): Make sure that the type has the right + precision when we call fixup_*_type. + +Tue Nov 29 19:12:07 1994 Jason Merrill + + * cvt.c (build_up_reference): Strip superfluous NOP_EXPRs; we do + want to build up references to rvalues if possible. + (cp_convert): Stick on a NOP_EXPR when converting to the same type. + +Tue Nov 29 11:28:59 1994 Mike Stump + + * parse.y (maybe_raises): Handle throw (). + * parse.y (ansi_raise_identifier): Grok type-ids in exception + specifications. + * tree.c (build_exception_variant): Use list compare to check if + two exception specifications match. + * decl.c (duplicate_decls, bad_specifiers): Enhance wording on error + messages. + * call.c (build_method_call): Remove TREE_RAISES. + * cvt.c (convert_to_aggr): Likewise. + * typeck.c (build_function_call_real, convert_arguments): Likewise. + * init.c (expand_aggr_init_1): Likewise. + +Tue Nov 29 09:50:39 1994 Mike Stump + + * except.c: Add support for m68k and mips exception handling + support. + +Tue Nov 29 08:48:33 1994 Mike Stump + + * except.c (expand_end_all_catch): Throw into outer context, if we + fall off end of catch handlers. + +Mon Nov 28 16:44:41 1994 Mike Stump + + * Makefile.in: Make is easier to decide where parse.[ch] will be + built. + +Thu Nov 17 20:11:24 1994 Doug Evans + + * cp/Make-lang.in (CXX_INSTALL_NAME): Use program_transform_name. + (GXX_INSTALL_NAME): Likewise. + (CXX_CROSS_NAME): Use program_transform_cross_name. + (GXX_CROSS_NAME): Likewise. + (c++.install-man): Use program_transform_name on g++.1. + (c++.uninstall): Likewise. + +Mon Nov 28 13:53:03 1994 Mike Stump + + * parse.y (THROW): Fix precedence of throw expressions. + +Mon Nov 28 13:15:16 1994 Mike Stump + + * typeck.c (build_unary_op): Allow promotions from bool to int on + unary ~. + +Sun Nov 27 00:16:21 1994 Jason Merrill + + * method.c (build_overload_name): Use DECL_ASSEMBLER_NAME for + classes when appropriate. + (build_overload_nested_name): When dealing with a function context, + use ASM_FORMAT_PRIVATE_NAME to tweak the name of the function to + avoid conflicts between local classes of the same name. + +Wed Nov 23 17:59:42 1994 Mike Stump + + * gxx.gperf, parse.y, lex.h, hash.h, lex.c (init_lex), delc.c + (duplicate_decls, grokdeclarator), cp-tree.h: Add support for + `explicit'. + * cvt.c (convert_to_reference, cp_convert, build_type_conversion_1, + build_type_conversion): Use LOOKUP_ONLYCONVERTING in + build_method_calls so that non-converting constructors are not used. + * call.c (build_method_call): If we shouldn't use a non-converting + constructor, then don't. + +Wed Nov 23 14:46:56 1994 Jason Merrill + + * call.c (build_method_call): Don't try to synthesize methods yet. + +Tue Nov 22 12:45:21 1994 Jason Merrill + + * pt.c (push_template_decls): Create CONST_DECLs for template + constant parameters, not VAR_DECLs. + +Sat Nov 19 15:28:31 1994 Jim Wilson + + * typeck.c (build_binary_op_nodefault): Can shorten shift only if + shift count is less than size in bits of arg0. + +Thu Nov 17 15:30:50 1994 Mike Stump + + * gxx.gperf, hash.h, lex.c (init_lex, real_yylex), parse.y: Add new + ANSI keywords and, and_eq, bitand, bitor, explicit, namespace, not, + not_eq, or, or_eq, typename, using, xor, xor_eq to g++. Still need + to add support for explicit, namespace, typename, and using, support + for the rest is already in. + +Fri Nov 4 19:04:18 1994 Mike Stump + + * gc.c (get_bad_cast_node): New routine to support compile time + throws of bad_cast. + * gc.c (build_dynamic_cast): Support throwing of bad_cast at compile + time. + +Fri Nov 4 11:12:00 1994 Mike Stump + + * except.c: Add hppa support. + +Fri Nov 4 10:50:50 1994 Mike Stump + + * except.c: Add rs6000 support. + +Thu Nov 3 14:24:23 1994 Mike Stump + + * except.c (do_unwind): Add i[34]86 support. + +Thu Nov 3 00:10:46 1994 Jason Merrill + + * pt.c (do_pending_expansions): Unset TREE_PUBLIC on implicit + instantiations. + +Wed Nov 2 15:08:24 1994 Kung Hsu + + * decl.c (finish_function): Emit types used in method parameters + into symbol table. + +Wed Nov 2 15:05:47 1994 Jason Merrill + + * pt.c (process_template_parm): Allow pointer to member function + template parameter types. + (uses_template_parms): Handle pointer to member function + CONSTRUCTORs. + + * g++.c (main): Cast first argument of bzero to (char *). + Pass -lstdc++ instead of -lg++ unless we are invoked as 'g++'. + +Mon Oct 31 14:50:48 1994 Kung Hsu + + * gc.c (build_dynamic_cast): Rewrite to make it work. + * class.c (finish_vtbls): Build more vtables if flag_rtti is on. + * class.c (modify_all_direct_vtables): Likewise. + * init.c (expand_direct_vtbls_init): Expand more vtables if + flag_rtti is on. + * decl.c (init_type_desc): Add default return. + +Tue Oct 25 17:13:09 1994 Kung Hsu + + * tree.c (debug_binfo): Get rid of the initial size entry of + vtable. + * cp-tree.h: Change flag_dossier to flag rtti, define type + descriptor type nodes. + * decl.c (init_type_desc): New function to initialize type + descriptor type nodes. + * decl.c (record_builtin_type): Change flag_dossier to flag_rtti. + * lex.c (init_lex): Likewise. + * decl.c: Change variable flag_dossier to flag_rtti. + * decl.c (duplicate_decls): Get rid initial size entry of vtable. + * decl.c (hack_incomplete_structures): Take out assert 164. + * search.c (get_abstract_virtuals_1): Likewise. + * search.c (dfs_init_vbase_pointers): Change CLASSTYPE_DOSSIER to + CLASSTYPE_RTTI. + * parse.y: Likewise. + * class.c (prepare_fresh_vtable): For virtual bases, get right + offset. + * class.c (add_virtual_function): Change flag_dossier to + flag_rtti. + * class.c (modify_one_vtable): Modify the right rtti entry. + * class.c (override_one_vtable): Get rid of size entry. + * class.c (finish_struct): Change flag_dossier to flag_rtti, and + build extra vtables, build type descriptors for polymorphic + classes. + * gc.c (build_headof): Make headof() works correctly with new + rtti. + * gc.c (build_typeid): Make this function work with new rtti. + * gc.c (get_typeid): Make this function work with new rtti. + * gc.c (build_bltn_desc): New function for new rtti. + * gc.c (build_user_desc): Likewise. + * gc.c (build_class_desc): Ditto. + * gc.c (build_ptr_desc): Ditto. + * gc.c (build_attr_desc): Ditto. + * gc.c (build_func_desc): Ditto. + * gc.c (build_ptmf_desc): Ditto. + * gc.c (build_ptmd_desc): Ditto. + * gc.c (build_t_desc): Ditto. + * gc.c: Comment out old build_t_desc, build_i_desc, build_m_desc. + +Tue Oct 25 13:37:41 1994 Jason Merrill + + * call.c (convert_harshness): Check for TREE_UNSIGNED differences + after checking for integral conversions. + +Wed Nov 30 19:13:50 1994 Mike Stump + + * Version 2.6.3 released. + +Thu Nov 17 10:56:50 1994 Jason Merrill + + * typeck2.c (build_m_component_ref): Check the basetype of the + member pointer against the main variant of the object type. + +Mon Nov 14 14:21:52 1994 Jason Merrill + + * cvt.c (convert_to_reference): Make sure that the original expr + gets its type back when converting a reference. + + * method.c (build_overload_name): Clear numeric_outputed_need_bar here. + (build_decl_overload): Instead of here. + +Tue Nov 8 17:11:24 1994 Jason Merrill + + * cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a + function. + + * typeck.c (convert_for_initialization): Handle initialization from + a TARGET_EXPR. + +Sun Nov 6 01:34:24 1994 Jason Merrill + + * pt.c (lookup_nested_type_by_name): Fix list-walking logic. + (tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate + TYPE_READONLY and TYPE_VOLATILE from the argument. + (unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals + present in parm from arg. + (type_unification): Strip REFERENCE_TYPE from the argument type. + (unify): Don't strip REFERENCE_TYPE from the argument type. + +Sat Nov 5 22:42:15 1994 Greg McGary + + * pt.c (do_type_instantiation): Check to see if there's a + IDENTIFIER_TEMPLATE on a class before calling + instantiate_member_templates(). + +Sat Nov 12 06:35:42 1994 Mike Stump + + * Version 2.6.2 released. + +Thu Nov 3 18:48:19 1994 Paul Eggert + + * Makefile.in (spew.o, lex.o, pt.o): + Depend on $(srcdir)/parse.h, not parse.h. + +Tue Nov 1 19:19:41 1994 Mike Stump + + * Version 2.6.1 released. + +Sun Oct 23 13:19:55 1994 Jason Merrill + + * decl2.c: Declare flag_access_control. + (struct lang_f_options): Add access-control. + * expr.c (cplus_expand_expr, NEW_EXPR): Unset flag_access_control + for the call to expand_aggr_init to copy the object out of the + pcc_struct_return slot. + * search.c (compute_access): if (!flag_access_control) return + access_public. + +Fri Oct 21 00:32:54 1994 Jason Merrill + + * lex.c (cons_up_default_function): Don't try to defer method + synthesis now. + + * decl.c (init_decl_processing): Use __pure_virtual for abort_fndecl + instead of abort, since the OSF/1 dynamic linker doesn't like to see + relocation entries for abort. + + * tree.c (array_type_nelts_total): Use sizetype, not + integer_type_node. + (array_type_nelts_top): Likewise. + +Thu Oct 20 15:48:27 1994 Mike Stump + + * decl.c (grokdeclarator): Added handling for catch parameters + (CATCHPARM). + * except.c (expand_start_catch_block): Use the new CATCHPARM context + instead of NORMAL. + * except.c (expand_throw): Don't let convert_to_reference complain + about what we are doing. + +Thu Oct 20 12:55:24 1994 Jim Wilson + + * method.c (emit_thunk): Call instantiate_virtual_regs. + +Wed Oct 19 14:15:33 1994 Mike Stump + + * except.c (expand_exception_blocks): Make sure throw code doesn't + get put in function that won't be output. + +Mon Oct 17 18:03:15 1994 Jason Merrill + + * decl.c (init_decl_processing): Make alloca a builtin. + +Thu Oct 27 21:10:25 1994 Craig Burley + + * g++.c (main): Only decrement "added" and set "library" to + NULL when "library" != NULL (just like 940829 fix). + +Mon Oct 17 15:56:11 1994 Mike Stump + + * except.c (expand_start_catch_block): Make sure the false label + gets onto the permanent obstack, as it is used for the exception + table. + +Fri Oct 14 18:54:48 1994 Mike Stump + + * class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can + be set just below, use current_fndecl instead. + +Fri Oct 14 15:12:22 1994 Jason Merrill + + * init.c (expand_aggr_vbase_init_1): Don't call expand_aggr_init_1 + with LOOKUP_SPECULATIVELY. + (expand_default_init): Abort if build_method_call returns NULL_TREE. + + * typeck.c (build_modify_expr): Don't just build a MODIFY_EXPR if + the rhs is a TARGET_EXPR. + + * parse.y (left_curly): Anonymous types are not affected by #pragma + interface/implementation. + + * method.c (synthesize_method): Don't call setup_vtbl_ptr for the + default constructor if it isn't needed. + + * lex.c (cons_up_default_function): Do synthesize methods for + anonymous types if necessary. + +Thu Oct 13 17:44:55 1994 Jason Merrill + + * method.c (build_decl_overload): Set numeric_outputed_need_bar to 0. + +Wed Oct 12 13:27:57 1994 Jason Merrill + + * typeck.c (build_modify_expr): Understand how to copy an aggregate. + + * init.c (expand_default_init): Likewise. Also remove some of the + crufty code that assumes methods will not be synthesized properly. + + * lex.c (cons_up_default_function): If the containing type has no + name, these functions should never need to be called, so just + declare them. + + * lex.c (real_yylex): Use HOST_BITS_PER_WIDE_INT to determine the + bitmask for lexing character constants. + + * call.c (build_method_call): Disable code that tries to do tricky + stuff with a default parameter that is a constructor call, but + actually does other tricky stuff that breaks things. + +Wed Oct 12 16:14:01 1994 Benoit Belley + + * decl.c (finish_enum): Disable code which forces enums to be signed, + since this conflicts with their use as bitfields. type_promotes_to + handles promotion of enums of underlying unsigned types to signed + integer types. + +Wed Oct 12 13:24:03 1994 Jason Merrill + + * cvt.c (type_promotes_to): Also promote enums to long if + appropriate. + + * typeck.c (default_conversion): Don't expect type_promotes_to to + return a main variant. + +Wed Oct 12 12:19:45 1994 Jason Merrill + + * call.c (build_scoped_method_call): Don't lose side effects in the + object expression when calling a non-existent destructor. + +Fri Sep 2 19:05:21 1994 Rohan Lenard + + * call.c (build_scoped_method_call): Remove erroneous error message + when destructor call is written as a scoped call. + +Tue Oct 11 23:48:31 1994 Jason Merrill + + * various: Cast pointer arguments to bzero and bcopy to char *. + +Tue Oct 11 19:34:32 1994 Mike Stump + + * class.c (get_derived_offset): Added a type parameter to limit how + far up the CLASSTYPE_VFIELD_PARENT chain we search. + * class.c (modify_one_vtable, fixup_vtable_deltas): When forming the + offset to put into the vtable for the this parameter, make sure we + don't offset from a parent of the DECL_CONTEXT of the function. + +Tue Oct 11 16:10:52 1994 Jason Merrill + + * pt.c (do_function_instantiation): Set DECL_EXTERNAL and + TREE_STATIC when setting DECL_INTERFACE_KNOWN. + (do_type_instantiation): Likewise. + + * lex.c (cons_up_default_function): Set DECL_INTERFACE_KNOWN, + DECL_EXTERNAL and TREE_STATIC as appropriate. + + * decl2.c (finish_file): Also synthesize methods that don't have + DECL_EXTERNAL set. Set interface_unknown before doing so. + + * decl.c (start_function): If DECL_INTERFACE_KNOWN is set on the + function decl, don't muck with TREE_PUBLIC and DECL_EXTERNAL. + +Mon Oct 10 00:56:53 1994 Jason Merrill + + * lex.c (cons_up_default_function): Mark methods in a template class + as template instances. Store the values of interface_unknown and + interface_only for do_pending_inlines. + (do_pending_inlines): Use them. + + * decl2.c (finish_file): If we haven't seen a definition of a + function declared static, make the decl non-PUBLIC so compile_file + can give an error. + +Sun Oct 9 02:42:29 1994 Jason Merrill + + * method.c (do_build_copy_constructor): Handle anonymous unions. + (do_build_assign_ref): Likewise. + (largest_union_member): Move from lex.c. + +Sat Oct 8 14:59:43 1994 Jason Merrill + + Re-implement g++'s vague linkage independent of TREE_PUBLIC. + * pt.c (instantiate_member_templates): Lose redundant + -fexternal-templates handling. + (tsubst): Set TREE_PUBLIC and DECL_EXTERNAL on new decls. Don't set + TREE_STATIC or DECL_INTERFACE_KNOWN. + (do_pending_expansions): Predicate on DECL_INTERFACE_KNOWN instead + of DECL_EXTERNAL for explicit instantiations. + (do_function_instantiation): Do the new thing. + (do_type_instantiation): Likewise. + (instantiate_template): Deal with member templates defined in a .cc + file with -fexternal-templates. + * except.c (expand_exception_blocks): Use DECL_LINKAGE_KNOWN to + decide whether to stick builtin_throw here. + * decl2.c (import_export_inline): Predicate on DECL_INTERFACE_KNOWN + rather than TREE_PUBLIC. Generally fix rules. + (finish_file): Use DECL_INITIAL to determine whether or not a method + has been synthesized, rather than TREE_ASM_WRITTEN. + * decl.c (warn_extern_redeclared_static): Use DECL_PUBLIC instead of + TREE_PUBLIC. + (pushdecl): Likewise. + (duplicate_decls): Likewise. Deal with DECL_DECLARED_STATIC and + DECL_INTERFACE_KNOWN. + (redeclaration_error_message): Fix checking for conflicting linkage. + (define_function): Set DECL_INTERFACE_KNOWN. + (grokfndecl): Function decls are PUBLIC until we are sure about + their linkage. Set DECL_DECLARED_STATIC as needed. + (start_function): Deal with linkage. Move pushdecl after linkage + magic. + (finish_function): Don't set TREE_ASM_WRITTEN on discarded inlines. + * cp-tree.h (lang_decl_flags): Add interface_known and + declared_static. + (DECL_INTERFACE_KNOWN): New macro. + (DECL_DECLARED_STATIC): New macro. + (DECL_PUBLIC): New macro. + + Clean up bogus use of TREE_PUBLIC. + * class.c (alter_access): Fix mistaken use of TREE_PUBLIC (it + doesn't correspond to TREE_PROTECTED and TREE_PRIVATE). + * init.c (do_friend): Don't arbitrarily set TREE_PUBLIC. + +Wed Oct 5 13:44:41 1994 Jason Merrill + + * call.c (build_overload_call_real): Don't immediately do + array->pointer conversion. + + * pt.c (type_unification): If not passing to a reference, strip + cv-quals. Also handle array->pointer conversion. + +Tue Oct 4 17:45:37 1994 Jason Merrill + + * decl.c (grokdeclarator): Don't warn about applying const to a + const typedef or template type parameter. + + * decl2.c (finish_file): Also synthesize methods after walking the + vtables. Ugly ugly ugly. + +Mon Oct 3 15:02:41 1994 Jason Merrill + + * various: Remove lingering remnants of old exception handling code. + + * decl2.c (finish_file): Synthesize methods before walking the + vtables, so that the vtables get emitted as needed. + + * decl.c (shadow_tag): Remove obsolete code for pushing tags and + dealing with exceptions. + +Mon Oct 3 13:05:27 1994 Ian Lance Taylor + + * Make-lang.in (g++-cross): Depend upon version.o and $(LIBDEPS). + +Mon Oct 3 02:59:28 1994 Jason Merrill + + * decl2.c (finish_file): Fix inline handling. + +Sun Oct 2 00:21:56 1994 Jason Merrill + + * decl.c (grokdeclarator): Handle redundant scope even better. + ({push,pop}_cp_function_context): Take toplev parameter. + + * method.c (synthesize_method): Pass toplev parameter to + {push,pop}_cp_function_context depending on decl_function_context + (fndecl). + + * typeck.c (build_x_unary_op): Unary & on OFFSET_REFs is always the + built-in version. + + * method.c (synthesize_method): Don't be confused by __in_chrg + parameter. + + * class.c (popclass): Set C_C_D like start_function does. + + * decl.c (grokdeclarator): Handle redundant scope better. + + * parse.y (expr_or_declarator): Add '(' expr_or_declarator ')' rule. + (direct_notype_declarator): Likewise. + (complex_direct_notype_declarator): Remove it here. + +Sat Oct 1 21:42:18 1994 Jason Merrill + + * init.c (resolve_offset_ref): Fix types used in resolving .* + expressions. + +Sat Oct 1 15:18:49 1994 Jason Merrill + + Beginnings of work to synthesize methods only when needed. + * call.c (build_method_call): Synthesize methods as necessary + (currently never necessary). + * class.c (popclass): Don't try to set C_C_D here, as it'll end up + on the wrong obstack. + * decl.c (push_cp_function_context): Mostly copied from + push_c_function_context. + (pop_cp_function_context): Similarly. + (finish_function): Reverse order of poplevel and pop_nested_class so + that current_class_decl is restored properly. + (start_function): Likewise. + (finish_function): Add parameter 'nested'. Don't call + permanent_allocation if (nested). + * various: Pass extra parameter to finish_function. + * decl2.c (finish_file): Reorganize end-of-file inline handling, + synthesizing methods as necessary. + * lex.c (cons_up_default_function): Call mark_inline_for_output. + Only synthesize methods immediately if #pragma implementation + (currently disabled). + (do_pending_inlines): Call synthesize_method. + * method.c (synthesize_method): New function; all method synthesis + goes through here. Calls do_build_assign_ref and + do_build_copy_constructor. + (build_default_constructor): Remove. + (build_dtor): Likewise. + (build_assign_ref): Rename to do_build_assign_ref and remove stuff + done by synthesize_method. + (build_copy_constructor): Similarly. + +Thu Sep 29 16:58:52 1994 Mike Stump + + * typeck.c (c_expand_return): Use magic so the backend can fixup the + assignment into the return register, so cleanups won't clobber it. + +Thu Sep 29 13:08:50 1994 Jason Merrill + + * method.c (hack_identifier): Don't call assemble_external for + template decls. + + * decl.c (finish_decl): Also end temporary allocation if the decl in + question has a type of error_mark_node. + +Wed Sep 28 21:45:00 1994 Mike Stump + + * typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure + that if the ?: was a reference type, that the subparts will be also. + +Wed Sep 28 16:14:04 1994 Brendan Kehoe + + * except.c (register_exception_table): Use Pmode, not PTRmode. + +Fri Sep 23 13:54:27 1994 Jason Merrill + + * lex.c (do_pending_inlines): Do method synthesis after the + pending_inlines have been reversed. + +Thu Sep 22 12:53:03 1994 Per Bothner + + * decl2.c (finish_file): Fix Brendan's fix: Only call + register_exception_table if there is a non-empty exception table. + +Thu Sep 22 12:03:46 1994 Brendan Kehoe + + * decl2.c (finish_file): Only do register_exception_table if + -fhandle-exceptions is being used. + +Wed Sep 21 19:01:51 1994 Per Bothner + + * except.c (output_exception_table_entry): Simplify + by using assemble_integer. + (build_exception_table): Change to return a count. + Cleanup to use standard macros, instead of hard-wired + sparc asm format. Don't make __EXCEPTION_TABLE__ global. + (register_exception_table): New function. Generate call to builtin. + * decl2.c (finish_file): Call register_exception_table. + * cp-tree.h (build_exception_table): Fix prototype. + +Wed Sep 21 13:20:42 1994 Brendan Kehoe + + * tree.c (break_out_calls): Don't try to duplicate the DECL_INITIAL. + + * decl2.c (delete_sanity): Give an error at trying to delete a + function. + +Wed Sep 21 11:47:10 1994 Jason Merrill + + * lex.c (cons_up_default_function): Mark synthesized destructors + inline. + + * decl.c (duplicate_decls): Ignore redeclarations of wchar_t as + something other than __wchar_t, complaining if -pedantic and not in + a system header. + +Tue Sep 20 09:43:28 1994 Jason Merrill + + * decl.c (xref_tag): Set up BINFO_INHERITANCE_CHAIN on base binfos + here. + + * typeck.c (build_modify_expr): Require complete type after checking + for error_mark_node. + + * call.c (build_method_call): Print parmtypes when complaining of + ambiguous call. + + * typeck.c (build_modify_expr): Handle assignment to array from + non-array. + + * decl.c (lookup_name_real): Deal with got_scope == error_mark_node. + + * call.c (build_method_call): Don't bother with the exact match. + +Mon Sep 19 00:51:39 1994 Jason Merrill + + * init.c (expand_aggr_init): If we munge the type of the variable, + also munge the type of the initializer. + + * decl.c (grokdeclarator): Use <= when comparing to RID_LAST_MODIFIER. + (init_decl_processing): Push artificial declaration of wchar_t so + people don't have to declare it before they can use it. + + * error.c (cp_line_of): Return lineno in lieu of 0. + + * typeck.c (convert_for_assignment): Handle conversion of pmfs to + int and bool. + (build_component_ref): Fold the COMPONENT_REF in case it can be + reduced. + + * typeck2.c (store_init_value): Don't pedwarn about non-constant + bracketed initializers for automatic variables. + +Sun Sep 18 10:12:12 1994 Jason Merrill + + * error.c (dump_decl): Don't say `typedef enum foo foo'. + + * decl.c (start_decl): Don't set TREE_PUBLIC on template decls just + because they're affected by #pragma i/i. We'll deal with that when + they get instantiated. + + * typeck.c (build_unary_op): Clean up cruft in ADDR_EXPR case. + + * class.c (instantiate_type): Set TREE_CONSTANT on instantiated + ADDR_EXPRs if appropriate. + + * decl.c (build_ptrmemfunc_type): Unset IS_AGGR_TYPE on pmf types. + + * typeck.c (build_ptrmemfunc): Handle &overloaded_method as an + initializer properly. + * typeck2.c (digest_init): Likewise. + + * tree.c (cp_build_type_variant): Like c_build_type_variant, except + it uses build_cplus_array_type. + * *.c: Use cp_build_type_variant instead of c_build_type_variant. + + * pt.c (do_type_instantiation): Don't try to instantiate nested + enums. + +Tue Sep 13 10:56:58 1994 Jason Merrill + + * cvt.c (build_up_reference): Handle preincrement and predecrement + properly. + +Tue Sep 13 09:51:59 1994 Brendan Kehoe + + * decl.c (finish_decl): Only lay out the rtl for DECL if it is, in + fact, static. + +Mon Sep 12 14:40:30 1994 Brendan Kehoe + + * decl.c (finish_decl): Lay out the rtl for DECL before doing + grok_reference_init, in case it's static. + +Mon Sep 12 12:45:38 1994 Jason Merrill + + * class.c (finish_struct): Don't synthesize constructors if the + class has a field with the same name as the class. Don't die on + classes with no constructors or destructors. Don't die if the head + and tail of the class are in different files. + + * decl.c (grokdeclarator): Don't treat a function pointer field + with the same name as the class as a constructor. + +Fri Sep 9 13:17:00 1994 Jason Merrill + + * typeck.c (build_c_cast): Pull constant values out of their + variables here. + + * decl.c (duplicate_decls): Only propagate DECL_CHAIN in + FUNCTION_DECLs and TEMPLATE_DECLs. + +Thu Sep 8 10:07:48 1994 Jason Merrill + + * decl.c (duplicate_decls): Propagate DECL_CHAIN in all DECLs that + have it. + + * pt.c (unify): REALs and INTEGERs only unify with their own genus. + (instantiate_member_templates): Don't muck with DECL_EXTERNAL and + TREE_PUBLIC unless -fexternal-templates. + +Wed Sep 7 13:17:10 1994 Jason Merrill + + * pt.c (do_type_instantiation): Call instantiate_member_templates. + Deal with specializations. + (tsubst): Don't stick the mangled name in DECL_NAME for function + instantiations. Don't push them, either. + + * decl2.c (grokfield): Move code for generating the + DECL_ASSEMBLER_NAME for static members from here. + * method.c (build_static_name): To here. + * decl.c (grokvardecl): Call build_static_name. + (duplicate_decls): Keep old DECL_ASSEMBLER_NAME. + +Mon Sep 5 12:49:18 1994 Jason Merrill + + * call.c (build_method_call): If -Wsynth, warn when selecting + synthesized op= over user-supplied one cfront would select. + * decl2.c (lang_decode_option): Handle -Wsynth. + +Fri Sep 2 15:11:59 1994 Jason Merrill + + * decl.c (finish_enum): Overhaul to fix several bugs. + (start_enum): Disable useless code. + +Thu Sep 1 16:04:54 1994 Jason Merrill + + * typeck.c (c_expand_return): Warn about returning a reference to a + temporary. + (convert_arguments): Increment argument counter when using default + arguments, too. + +Wed Aug 31 14:29:22 1994 Jason Merrill + + * decl.c (finish_decl): If the type of decl is error_mark_node, + don't bother trying to do anything. + + * typeck.c (convert_for_initialization): If the rhs contains a + constructor call, pretend the lhs type needs to be constructed. + + * init.c (expand_default_init): If we stick the object inside the + initializer, mark the initializer used. + +Tue Aug 30 13:50:18 1994 Jason Merrill + + * method.c (build_assign_ref): Return *this; + (build_assign_ref): Fix base assignment order. + (build_copy_constructor): Fix member init order. + +Mon Aug 29 13:54:39 1994 Brendan Kehoe + + * g++.c (main): Remember to clear out SAW_SPECLANG after we see + its argument. + +Sat Aug 27 09:36:03 1994 Jason Merrill + + * method.c (build_copy_constructor): Also copy virtual bases. + +Fri Aug 26 17:05:15 1994 Jason Merrill + + * lex.c (do_pending_inlines): Clear out pending_inlines before doing + any synthesis. Also first set deja_vu on all pending_inlines. + + * method.c (build_assign_ref): Use build_member_call to invoke base + operator=, rather than build_modify_expr. And use + build_reference_type instead of TYPE_REFERENCE_TO. + (build_copy_constructor): Use TYPE_NESTED_NAME to identify the + basetype. + + * decl2.c (grokfield): Don't complain about undefined local class + methods. + + * class.c (finish_struct): Don't try to synthesize methods here. + * lex.c (do_pending_inlines): Instead, synthesize them here. + (init_lex): Initialize synth_obstack. + (cons_up_default_function): Stick synthesis request on + pending_inlines. + +Fri Aug 26 12:24:14 1994 Brendan Kehoe + + * call.c (build_method_call) [PCC_STATIC_STRUCT_RETURN]: Also + accept an RTL_EXPR in what we're about to use for the instance, + since anything which would end up with pcc_struct_return set + inside cplus_expand_expr. + + * cp-tree.h (cons_up_default_function): Note change of prototype. + +Thu Aug 25 23:05:30 1994 Gerald Baumgartner + + * class.c (finish_struct): Undid change from Aug 21 testing + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. + * parse.y (left_curly): Likewise, undid change from Aug 21. + * decl.c (xref_tag): Undid change from Aug 21, set + CLASSTYPE_INTERFACE correctly, and added comments. + +Thu Aug 25 00:36:31 1994 Jason Merrill + + Rework approach to synthesized methods; don't go through the parser + anymore. + * class.c (finish_struct): Use new synthesis approach. + * lex.c (cons_up_default_function): Now just creates declaration, + not code. + (largest_union_member): #if 0 out. + (default_assign_ref_body): Likewise. + (default_copy_constructor_body): Likewise. + * method.c (build_default_constructor): New function to synthesize X(). + (build_copy_constructor): Synthesize X(X&). + (build_assign_ref): Synthesize X::operator=(X&). + (build_dtor): Synthesize ~X(). + + * error.c (cp_line_of): If we're dealing with an artificial + TYPE_DECL, look at the type instead. + +Wed Aug 24 11:11:50 1994 Jason Merrill + + * init.c (sort_member_init): Check warn_reorder. + * decl2.c (lang_decode_option): Handle -W{no-,}reorder. + + * cp-tree.h (CLASSTYPE_SOURCE_LINE): New macro. + * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates. + * class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE. + +Tue Aug 23 09:28:35 1994 Mike Stump + + * error.c (dump_decl): Improve wording, so that error messages + dont't read template<, class foo>... + +Mon Aug 22 15:30:51 1994 Brendan Kehoe + + * parse.y (label_colon): Also match a TYPENAME as a label name, + since they may have declared a class by that name but have also + tried to have a local label under the same name. + + * pt.c (coerce_template_parms): Call cp_error, not cp_error_at, + for the message so they know at what point it was instantiated. + +Sun Aug 21 23:07:35 1994 Gerald Baumgartner + + * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING for signatures up to left_curly time. + * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING for signatures down to left_curly time. + * parse.y (left_curly): New final resting place for setting + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING for signatures. + + * class.c (finish_struct): Don't test for function/field name + conflicts in signatures, since all the fields are compiler-constructed. + +Fri Aug 19 14:04:47 1994 Kung Hsu + + * method.c (build_overload_nested_name): In qualified name + mangling, the template with value instantiation will have numeric + at end and may mixed with the name length of next nested level. + Add a '_' in between. + * method.c (build_overload_name): Ditto. + * method.c (build_overload_identifier): Ditto. + +Thu Aug 18 16:24:43 1994 Mike Stump + + * error.c (dump_decl): Handle NULL args. + +Thu Sep 29 16:15:36 1994 Michael I Bushnell + + * g++.c: Rework last change so it's done like collect.c (and + gcc.c). + +Wed Sep 14 10:17:27 1994 Michael I Bushnell + + * g++.c: Include in case `errno' is a macro + as permitted by ANSI C. + +Thu Aug 18 12:48:09 1994 Mike Stump + + * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time. + * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and + CLASSTYPE_VTABLE_NEEDS_WRITING down to left_curly time. + * parse.y (left_curly): New final resting place for setting + CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING. + +Thu Aug 11 11:32:42 1994 H.J. Lu + + * g++.c (main): Only decrement "added" and set "library" to + NULL when "library" != NULL. + +Sat Aug 13 00:14:52 1994 Jason Merrill + + * decl.c (grokdeclarator): Don't set TREE_PUBLIC on a function decl + just because its class has a known interface. + (decls_match): Deal with new format of template parms. + + * lex.c (cons_up_default_function): Don't play with TREE_PUBLIC and + DECL_EXTERNAL here. + +Fri Aug 12 01:55:15 1994 Jason Merrill + + * decl.c (pushtag): SET_DECL_ARTIFICIAL on gratuitous typedefs. + (xref_defn_tag): Likewise. + (pushdecl): Only allow artificial typedefs to be shadowed. + + * init.c (emit_base_init): Pass the right binfos to + expand_aggr_init_1. + + * class.c (delete_duplicate_fields_1): Make it work right. + (finish_struct): Catch function/field name conflict. + + * decl2.c (check_classfn): Pass the function to cp_error, not just + the name. + + * init.c (sort_member_init): Warn when order of member initializers + does not match order of member declarations. + (emit_base_init): Call expand_aggr_init_1 with LOOKUP_PROTECT. + + * error.c (dump_expr): Handle lists of functions. + + * decl.c (start_function): #pragma interface only affects functions + that would otherwise be static. + (finish_decl): Don't warn about an unused variable if it has both + constructor and destructor, since the 'resource allocation is + initialization' idiom is relatively common. + + * typeck.c (comp_target_types): Don't handle TEMPLATE_TYPE_PARMs. + (comp_target_parms): Likewise. + (compparms): Never consider default parms. + (common_base_type): Don't choose a virtual baseclass if there is a + more derived class in common. + (build_conditional_expr): If pedantic, pedwarn about conversion to + common base in conditional expr. + + * class.c (instantiate_type): Handle template instantiation better. + + * typeck.c (convert_arguments): Don't try to get tricky and convert + to int directly when PROMOTE_PROTOTYPES is set, as it breaks + user-defined conversions. + + * lex.c (check_for_missing_semicolon): Also give error at end of + file. + + * call.c (build_method_call): Don't promote arrays to pointers here. + + * typeck.c (convert_arguments): Don't require the actual parameter + to be of a complete type if the formal parameter is a reference. + +Thu Aug 11 15:21:40 1994 Jason Merrill + + * decl.c (grokdeclarator): Soften 'static' on member function error + to pedwarn. + + * init.c (build_new): Don't automatically save rval. + (build_offset_ref): Do field lookup with proper basetype_path. + +Thu Aug 11 12:46:54 1994 Brendan Kehoe + + * errfn.c (cp_silent): Declare to mark when we should avoid + emitting warnings and errors. + (cp_error): Check it. + (cp_warning): Likewise. + (cp_pedwarn): Likewise. + (cp_compiler_error): Likewise. + (cp_error_at): Likewise. + (cp_warning_at): Likewise. + (cp_pedwarn_at): Likewise. + * call.c (compute_conversion_costs): Set CP_SILENT when we start + out, and make sure we turn it off before we leave. + +Thu Aug 11 00:02:54 1994 Jason Merrill + + * decl2.c (grok_array_decl): Try computing *(A+B) if neither + argument is obviously an array. + +Wed Aug 10 15:32:04 1994 Jason Merrill + + * typeck.c (c_expand_start_case): Do cleanups here. + + * parse.y (xcond): Do bool conversion here, too. + (simple_stmt, SWITCH case): Don't do cleanups here. + + * decl.c (duplicate_decls): Don't treat builtins that have been + explicitly declared specially. + +Tue Aug 9 01:16:09 1994 Jason Merrill + + * tree.c (make_deep_copy): Support copying pointer, reference, + function, array, offset and method types. + + * decl.c (init_decl_processing): Mark exit and abort as + BUILT_IN_NONANSI so that duplicate_decls is kinder about + redeclaration. + (duplicate_decls): Don't give two errors for redeclaring a C + function with the same parms but a different return type. + + * parse.y (paren_cond_or_null): Do cleanup and bool conversion here. + (condition): Instead of here. + (simple_stmt, SWITCH case): Also do cleanup here. + + * decl2.c (finish_anon_union): Only break out FIELD_DECLs. + + * call.c (build_method_call): Don't throw away the side effects of + the object in a call to a non-existent constructor. + * parse.y (primary): Likewise. + + * method.c (build_decl_overload): Oop. + + * decl2.c (lang_decode_option): Deal with flag_no_nonansi_builtin, + warn about uselessness of specifying -fansi-overloading. + + * method.c (build_decl_overload): Treat any non-member new with one + parameter as __builtin_new. + + * decl.c (init_decl_processing): Setup built-in meanings of exit, + _exit and abort. + +Mon Aug 8 15:03:30 1994 Jason Merrill + + * error.c (dump_readonly_or_volatile): Put a space between const and + volatile if both apply. + + * init.c (perform_member_init): Clean up after this initialization. + (emit_base_init): Clean up after each base init, not after all have + been done. + (expand_aggr_vbase_init_1): Clean up after this init. + +Sun Aug 7 14:55:05 1994 Jason Merrill + + * call.c (build_method_call): Deal with destroying references. + + * parse.y (condition): Do bool_truthvalue_conversion here. + (paren_expr_or_null): And here. + (simple_if): Not here. + (simple_stmt): Or here. + +Sat Aug 6 22:29:45 1994 Jason Merrill + + * parse.y (paren_expr_or_null): Wrap the expression in a + CLEANUP_POINT_EXPR. + (condition): Likewise. + +Sat Aug 6 19:46:37 1994 Rohan Lenard + + * call.c (build_scoped_method_call): Fix error message when + destructor call refers to a nonexistent type. + +Sat Apr 16 22:43:30 1993 Gerald Baumgartner + + * lex.h (rid): Deleted RID_RAISES, it's never used. + Moved RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, RID_EXCEPTION, + RID_TEMPLATE and RID_SIGNATURE to the end of the enumeration, + they don't need to be touched in `grokdeclarator.' + (RID_LAST_MODIFIER): Defined macro to be RID_MUTABLE. + + * decl.c (grokdeclarator): Use RID_LAST_MODIFIER instead of + RID_MAX as loop limit for finding declaration specifiers. + +Sat Apr 3 21:59:07 1993 Gerald Baumgartner + + * lex.c (debug_yytranslate): Moved to parse.y since it needs to + access `yytname,' which is static in parse.c. + +Fri Apr 2 23:36:57 1993 Gerald Baumgarnter + + * cp-tree.h (GNU_xref_ref): Fixed typo in extern declaration, it + was `GNU_xref_def' instead of `GNU_xref_ref.' + +Fri Aug 5 14:20:16 1994 Jason Merrill + + * pt.c (do_function_instantiation): Don't set TREE_PUBLIC and + DECL_EXTERNAL on 'extern' instantiations; wait until EOF to do that. + (do_type_instantiation): Likewise. + + * decl2.c (import_export_inline): Decides at EOF what an inline's + linkage should be. + (finish_file): Call it. + + * decl.c (start_function): Don't rely on the settings of TREE_PUBLIC + and DECL_EXTERNAL from do_*_instantiation. Only set + DECL_DEFER_OUTPUT on inlines whose linkage might actually change. + (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to + mark for later consideration, rather than DECL_FUNCTION_MEMBER_P. + +Fri Aug 5 01:12:20 1994 Mike Stump + + * class.c (get_class_offset_1, get_class_offset): New routine to + find the offset of the class where a virtual function is defined, + from the complete type. + * class.c (modify_one_vtable, fixup_vtable_deltas): Use + get_class_offset instead of virtual_offset as get_class_offset will + always provide the right answer. + * tree.c (virtual_offset): Remove. It only ever worked some of the + time. + +Tue Aug 2 12:44:21 1994 Jason Merrill + + * call.c (build_method_call): Put back unary_complex_lvalue call + that I thought was redundant. + + * typeck.c (c_expand_return): Fix a case I missed before. + +Sun Jul 31 17:54:02 1994 Jason Merrill + + * pt.c (unify): Strip cv-quals from template type arguments (when + 'const T*' is matched to 'const char*', that does not mean that T is + 'const char'). + +Fri Jul 29 01:03:06 1994 Jason Merrill + + * pt.c (do_type_instantiation): Instantiate nested TAGS, not + typedefs. Third time's the charm? + + * parse.y (template_parm): Support default template parms. + * pt.c (process_template_parm): Likewise. + (end_template_parm_list): Likewise. + (coerce_template_parms): Likewise. + (mangle_class_name_for_template): Likewise. + (push_template_decls): Likewise. + (unify): Likewise. + * method.c (build_overload_identifier): Likewise. + * error.c (dump_decl): Likewise. + +Wed Jul 27 17:47:00 1994 Jason Merrill + + * pt.c (do_type_instantiation): Only instantiate nested *classes*. + +Tue Jul 26 13:22:40 1994 Jason Merrill + + * search.c (note_debug_info_needed): Also emit debugging information + for the types of fields. + +Mon Jul 25 00:34:44 1994 Jason Merrill + + * pt.c (lookup_template_class): Pass 'template' to + coerce_template_parms instead of 'in_decl', since it's a more + meaningful context. + + * typeck.c (c_expand_return): Make sure any cleanups for the return + expression get run. + (build_c_cast): Use CONVERT_EXPR for conversion to void. + + * pt.c (do_type_instantiation): Also instantiate nested types. + + * typeck.c (convert_for_assignment): Don't die when comparing + pointers with different levels of indirection. + + * decl.c (grokdeclarator): The sub-call to grokdeclarator for + class-local typedefs sets DECL_ARGUMENTS, so we need to clear it + out. + + * decl2.c (finish_anon_union): Don't die if the union has no + members. + + * decl.c (grokdeclarator): Undo changes to declspecs when we're done + so that 'typedef int foo, bar;' will work. + + * decl2.c (finish_file): Don't call expand_aggr_init for + non-aggregates. + +Mon Jul 25 00:03:10 1994 Teemu Torma + + * decl.c (finish_function): We can't inline constructors and + destructors under some conditions with -fpic, but don't unset + DECL_INLINE. + +Mon Jul 25 00:03:10 1994 Jason Merrill + + * typeck.c (build_object_ref): Make sure 'datum' is a valid object. + +Sun Jul 24 14:19:31 1994 Jason Merrill + + * class.c (finish_struct): Don't set DECL_FIELD_BITPOS on + non-fields. + (finish_struct_methods): Use copy_assignment_arg_p. + + * cvt.c (cp_convert): If expr is an OFFSET_REF, resolve it instead + of giving an error. + + * typeck.c (build_binary_op_nodefault): Don't set result_type if we + don't know how to compare the operands. + + * decl.c (grokdeclarator): Avoid seg fault when someone uses '__op' + as a declarator-id in their program. Like the Linux headers do. + Arrgh. + + * tree.c (lvalue_p): Treat calls to functions returning objects by + value as lvalues again. + + * typeck.c (build_component_addr): Use convert_force to convert the + pointer in case the component type is also a private base class. + + * search.c (get_matching_virtual): Fix bogus warning of overloaded + virtual. + + * pt.c (overload_template_name): Set DECL_ARTIFICIAL on the created + TYPE_DECL to fix bogus shadowing warnings. + +Fri Jul 22 01:15:32 1994 Jason Merrill + + * init.c (expand_aggr_init_1): const and volatile mismatches do not + prevent a TARGET_EXPR from initializing an object directly. + +Tue Jul 19 17:55:37 1994 Jason Merrill + + * cvt.c (build_up_reference): Allow building up references to + `this', don't warn about making references to artificial variables + (like `this'). + + * tree.c (lvalue_p): `this' is not an lvalue. + + * call.c (build_method_call): Accept using a typedef name (or + template type parameter) for explicit destructor calls. + +Thu Jul 14 09:42:23 1994 Mike Stump + + * Version 2.6.0 released. + +Wed Jul 13 03:57:54 1994 Jason Merrill + + * method.c (hack_identifier): Put back old code so lists of + non-functions will be handled properly. + + * cp-tree.h (TYPE_NEEDS_CONSTRUCTING): #if 0 out; this macro is now + defined in the language-independent tree.h. + + * tree.c (count_functions): Avoid bogus warning when compiling this + function. + +Mon Jul 11 18:37:20 1994 Jason Merrill + + * decl.c (grok_reference_init): Always save the initializer of a + reference. + +Fri Jul 8 17:41:46 1994 Mike Stump + + * decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside + CLEANUP_POINT_EXPRs so that the stack slots can be reused. + (disabled for now) + +Fri Jul 8 12:59:38 1994 Jason Merrill + + * method.c (hack_identifier): Fix for new overloading. + + * typeck.c (build_binary_op_nodefault): Don't mess with division by + zero. + +Fri Jul 8 13:20:28 1994 Gerald Baumgartner + + * decl2.c (finish_file): Only call walk_sigtables, if + flag_handle_signatures is turned on, don't waste time otherwise. + +Fri Jul 8 02:27:41 1994 Jason Merrill + + * decl.c (push_overloaded_decl): Don't create overloads of one when + shadowing a class type. + * typeck.c (build_x_function_call): Complain about overloads of one. + + * decl.c (grokdeclarator): Don't try to treat a char* as a tree. + (grokdeclarator): Fix setting of TREE_STATIC. + (start_decl): Clear DECL_IN_AGGR_P after calling duplicate_decls. + +Thu Jul 7 22:20:46 1994 Gerald Baumgartner + + * cp-tree.h (walk_sigtables): Created extern declaration. + * decl2.c (walk_sigtables): Created function, patterned after + walk_vtables, even though we only need it to write out sigtables. + (finish_sigtable_vardecl): Created function. + (finish_vtable_vardecl): Changed 0 to NULL_PTR. + (finish_file): Call walk_sigtables. + + * sig.c (build_signature_table_constructor): Mark class member + function pointed to from signature table entry as addressable. + +Thu Jul 7 13:39:37 1994 Jason Merrill + + * decl.c (start_decl): Check new decl of static member variable + against the declaration in the class here. + (grokvardecl): Instead of here. + + * class.c (prepare_fresh_vtable): Call import_export_vtable if not + -fvtable-thunks. + (build_vtable): Likewise. + + * decl2.c (import_export_vtable): Move logic for deciding the + interface of a template class from here. + (import_export_template): To here. + (finish_vtable_vardecl): Call import_export_template before + import_export_vtable. + +Wed Jul 6 20:25:48 1994 Mike Stump + + * except.c (init_exception_processing): Setup interim_eh_hook to + call lang_interim_eh. + * except.c (do_unwind): Propagate throw object value across + stack unwinding. + * except.c (saved_throw_value): Used to hold the value of the object + being thrown. It is always a reference to the real value. + * except.c (expand_start_catch_block): Add handling for the + value of the exception object. + * except.c (expand_start_catch_block): Add handler for the handler, + so that throws inside the handler go to the outer block. + * except.c (expand_end_catch_block): Likewise. + * parse.y (handler_args): Use parm instead, as the other doesn't yet + handle references correctly. + +Wed Jul 6 17:55:32 1994 Per Bothner + + * decl2.c (mark_vtable_entries): If -ftable-thunks, set the + vtable entry properly to abort. + +Tue Jul 5 14:07:54 1994 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Downgrade division by zero + errors to warnings. + + * call.c (build_overload_call_real): Handle fnname being a list of + functions. + * typeck.c (build_x_function_call): Pass list of functions to + build_overload_call, not just the name. + * tree.c (count_functions): Complain when called for invalid + argument. + + * decl.c (grokdeclarator): Fix settings of TREE_STATIC, TREE_PUBLIC + and DECL_EXTERNAL on static members and initialized const members. + * decl2.c (grokfield): Reflect this change. + +Fri Jul 1 09:35:51 1994 Jason Merrill + + * parse.y (init): ANSI C++ does not forbid { }. + +Thu Jun 30 00:35:22 1994 Jason Merrill + + * decl2.c (lang_decode_option): Set warn_nonvdtor along with -Wall. + warn_nonvdtor defaults to off. + + * class.c (instantiate_type): Use comptypes rather than relying on + types to satisfy ==. + + * decl.c (start_function): Set DECL_DEFER_OUTPUT on all inlines that + might be static. + + * tree.c (build_cplus_new): Never build WITH_CLEANUP_EXPRs. + + * decl.c (grok_reference_init): Deal with ADDR_EXPRs of TARGET_EXPRs. + + * cvt.c (cp_convert): Pass 0 to with_cleanup_p arg of + build_cplus_new. + +Wed Jun 29 22:31:09 1994 Jason Merrill + + * decl2.c (finish_file): Maybe consider static inlines multiple + times, in case they reference each other. + +Tue Jun 28 11:58:38 1994 Gerald Baumgartner + + * class.c (finish_struct): Don't `cons_up_default_function's + for signatures. + (finish_struct): Handle an empty method_vec correctly. + + * decl.c (grokdeclarator): Don't warn about a signature being + empty in a signature pointer declaration if we only saw a + forward declaration of the signature. Changed `warning's into + `cp_warning's. + + * sig.c (build_sigtable): Don't die if a null signature table + constructor is returned. + (build_signature_pointer_constructor): If the signature table + constructor is null, the _sptr field is set to a null pointer + and cast to the appropriate type. Make copies of all null + pointers so that the type null_pointer_node doesn't get changed. + (build_signature_table_constructor): Added comments. + + * sig.c (build_signature_pointer_constructor): Complain if we + try to assign to/initialize a signature pointer/reference of + an undefined signature. + +Mon Jun 27 14:05:16 1994 Gerald Baumgartner + + * typeck2.c (store_init_value): Don't be pedantic about + non-constant initializers of signature tables/pointers/references. + +Fri Jun 24 16:49:41 1994 Gerald Baumgartner + + * decl.c (grokdeclarator): If we are grokking an opaque typedef + in a signature, don't complain about it begin static. + +Wed Jun 29 16:44:45 1994 Mike Stump + + Fixes a problem of the this pointer being wrong in virtual calls to + methods that are not overridden in more derived classes. + + * class.c (fixup_vtable_delta): New routine. It will fixup the + delta entries in vtables, wheever they need updating. + * class.c (finish_struct): Call the new routine for all virtual + bases, as they can have different offsets, than those used in base + classes that we derive our vtable from. + +Tue Jun 28 23:49:28 1994 Jason Merrill + + * typeck.c (build_binary_op): Use the types before default + conversions in the error message. + + * *.c: Use c_build_type_variant instead of build_type_variant where + the type might be an array. + + * call.c (build_method_call): Call build_type_variant and + build_reference_type in the right order. + * decl.c (record_builtin_type): Likewise. + +Wed Jun 29 16:58:53 1994 Jason Merrill + + * call.c (build_method_call): Call build_type_variant and + build_reference_type in the right order. + * decl.c (record_builtin_type): Likewise. + +Tue Jun 28 23:49:28 1994 Jason Merrill + + * typeck.c (build_binary_op): Use the types before default + conversions in the error message. + + * *.c: Use c_build_type_variant instead of build_type_variant where + the type might be an array. + +Sat Jun 25 11:50:54 1994 Jason Merrill + + * cvt.c (convert_to_reference): Try UDC's before doing the + reinterpret_cast thang, though. + +Fri Jun 24 01:24:01 1994 Jason Merrill + + * typeck.c (c_expand_return): Don't USE the return value location + after we've expanded the jump. + + * decl2.c (finish_file): Make sure DECL_SAVED_INSNS is not 0 before + trying to write out an inline. + + * cvt.c (build_up_reference): Also do address adjustment when the + target type uses MI. + (convert_to_reference): Try UDCs only after built-in conversions. + (build_type_conversion_1): Don't play games with the argument to the + method. + (build_type_conversion): #if 0 out code for binding to reference. + +Thu Jun 23 00:22:28 1994 Jason Merrill + + * decl2.c (finish_file): Use TREE_SYMBOL_REFERENCED to decide + whether to emit inlines. + + * decl.c (grokdeclarator): Set explicit_int for decls that just + specify, say, 'long'. + + * init.c (do_friend): Do overload C functions (or call pushdecl, + anyaway). + +Wed Jun 22 13:40:49 1994 Jason Merrill + + * cvt.c (build_up_reference): Don't call readonly_error. + (convert_to_reference): Propagate const and volatile from expr to + its type. + + * tree.c (lvalue_p): Random CALL_EXPRs are not lvalues. + + * cvt.c (build_up_reference): Break out WITH_CLEANUP_EXPR when + creating a temporary. + (convert_to_reference): Lose excessive and incorrect trickiness. + (cp_convert): Call build_cplus_new with with_cleanup_p set. + + * typeck2.c (build_functional_cast): Likewise. + +Tue Jun 21 17:38:38 1994 Jason Merrill + + * decl.c (grokdeclarator): signed, unsigned, long and short all + imply 'int'. + + * decl.c (grokdeclarator): Allow "this is a type" syntax. + (grok_reference_init): Simplify and fix. + +Sun Jun 19 17:08:48 1994 Jason Merrill + + * decl.c (grokdeclarator): pedwarn about a typedef that specifies no + type. + +Sat Jun 18 04:16:50 1994 Jason Merrill + + * decl.c (start_function): Move TREE_PUBLIC and DECL_EXTERNAL + tinkering to after call to pushdecl. + +Fri Jun 17 14:48:28 1994 Jason Merrill + + * call.c (build_method_call): Handle destructors for non-aggregate + types properly. + +Thu Jun 16 16:48:05 1994 Jason Merrill + + * call.c (build_method_call): Make sure that the name given for the + destructor matches the constructor_name of the instance. + + * pt.c (do_function_instantiation): A non-extern instantiation + overrides a later extern one. + (do_type_instantiation): Likewise. + +Wed Jun 15 19:34:54 1994 Jason Merrill + + * init.c (expand_aggr_init): Use TYPE_MAIN_VARIANT to get the + unqualified array type. + + * cp-tree.h (EMPTY_CONSTRUCTOR_P): Tests whether NODE is a + CONSTRUCTOR with no elements. + + * decl.c (various): Lose empty_init_node. + (finish_decl): Use EMPTY_CONSTRUCTOR_P, do the empty CONSTRUCTOR + thing depending on the value of DECL_COMMON instead of + flag_conserve_space, do the empty CONSTRUCTOR thing for types that + don't have constructors, don't treat a real empty CONSTRUCTOR + specially. + + * typeck2.c (process_init_constructor): Don't treat empty_init_node + specially. + +Wed Jun 15 19:05:25 1994 Mike Stump + + * class.c (override_one_vtable): Don't forget to merge in an old + overrider when we wanted to reuse a vtable, but couldn't. + +Wed Jun 15 15:03:16 1994 Jason Merrill + + * decl.c (start_decl): Put statics in common again. + + * decl.c (grokdeclarator): Return NULL_TREE for an error rather than + setting the type to error_mark_node. + + * typeck.c (build_modify_expr): Build up a COMPOUND_EXPR for enum + bitfield assignments. + +Tue Jun 14 12:23:38 1994 Jason Merrill + + * decl.c (grok_op_properties): Const objects can be passed by value. + +Mon Jun 13 03:10:59 1994 Jason Merrill + + * decl2.c (import_export_vtable): Force implicit instantiations to + be interface_only when -fno-implicit-templates. + + * decl.c (duplicate_decls): Redeclaring a class template name is an + error. + + * pt.c (end_template_decl): Call GNU_xref_decl for class templates. + * xref.c (GNU_xref_decl): Support templates. + +Sat Jun 11 17:09:05 1994 Jason Merrill + + * decl.c (grok_op_properties): Split out checking for whether this + function should suppress the default assignment operator. + * decl2.c (grok_function_init): Likewise. + (copy_assignment_arg_p): New function to do just that. + Now considers virtual assignment operators that take a base as an + argument to count as copy assignment operators. + + * search.c (dfs_debug_mark): Lose checks for DWARF_DEBUG and + TREE_ASM_WRITTEN, as they are redundant. + + * pt.c (end_template_decl): Don't try to set DECL_CLASS_CONTEXT on a + decl that has no LANG_SPECIFIC part. + (do_type_instantiation): Force the debugging information for this + type to be emitted. + + * decl.c (start_decl): Clear up uses of various types of templates + (say sorry for static data members, rather than "invalid template"). + (expand_static_init): Fix initialization of static data members of + template classes. + +Fri Jun 10 00:41:19 1994 Jason Merrill + + * decl.c (grokdeclarator): Set DECL_CONTEXT on static data members. + + * g++.c (main): Use -xc++-cpp-output for .i files. + + * pt.c (tsubst): Give meaningful error about declaring template for + a copy constructor which was not declared in the class template. + (do_type_instantiation): Explicit instantiation before the class + template is an error. + (instantiate_template): Don't die if tsubst returns error_mark_node. + +Thu Jun 9 19:04:59 1994 Jason Merrill + + Don't synthesize the copy assignment operator if the one in a base + class is pure virtual. + * cp-tree.h (TYPE_HAS_ABSTRACT_ASSIGN_REF): New macro to indicate + whether the type has a pure virtual copy assignment operator. + * class.c (finish_base_struct): Don't generate the copy assignment + operator if a base class has a pure virtual one. + * decl.c (grok_op_properties): Add disabled code to set + TYPE_HAS_ABSTRACT_ASSIGN_REF with comment pointing to where it is + actually set. + * decl2.c (grok_function_init): Set TYPE_HAS_ABSTRACT_ASSIGN_REF. + + * decl2.c (import_export_vtable): Always treat template + instantiations as if write_virtuals >= 2, and treat implicit + instantiations as external if -fno-implicit-templates. + (finish_file): Output all pending inlines if + flag_keep_inline_functions. + +Wed Jun 8 20:48:02 1994 Mike Stump + + * tree.c (layout_vbasetypes): Align virtual base classes inside + complete objects, so that we don't core dump on machines such as + SPARCs when we access members that require larger than normal + alignments, such as a double. Also, we bump up the total alignment + on the complete type, as necessary. + +Wed Jun 8 16:18:14 1994 Jason Merrill + + * gxxint.texi (Free Store): New section with code for examining + cookie. + (Limitations of g++): Remove operator delete entry, since it is no + longer accurate. Fix access control entry. + + * typeck.c (build_unary_op): Pedwarn about taking the address of or + incrementing a cast to non-reference type. + (build_modify_expr): Use convert instead of convert_force again. + + * search.c (get_base_distance): Use IS_AGGR_TYPE_CODE to check for + class type, not == RECORD_TYPE. + + * decl.c (grokdeclarator): Cope with grokfndecl returning NULL_TREE. + + * typeck2.c (report_case_error): #if 0 out. + * lex.c (real_yylex): Lose RANGE. + * parse.y: Likewise. + +Tue Jun 7 18:17:35 1994 Jason Merrill + + * parse.y (simple_stmt, case ranges): Use ELLIPSIS instead of RANGE. + +Mon Jun 6 19:39:57 1994 Jason Merrill + + * typeck.c (build_c_cast): Don't shortcut conversions to the same + type. Don't replace consts with their values here, since that's now + done in cp_convert. + + * cvt.c (cp_convert): When converting to bool, take + integer_zero_node to false_node and all other INTEGER_CSTs to + true_node. + (build_type_conversion): Don't complain about multiple conversions + to float if we're not really converting. + +Fri Jun 3 02:10:56 1994 Jason Merrill + + Implement 'extern template class A;' syntax for suppressing + specific implicit instantiations. + * cp-tree.h: Update prototypes for do_*_instantiation. + * pt.c (do_pending_expansions): Don't compile 'extern' explicit + instantiations. + (do_function_instantiation): Set DECL_EXTERNAL on 'extern' explicit + instantiations. + (do_type_instantiation): Likewise. + * parse.y (explicit_instantiation): Support 'extern template class + A;' syntax. + * decl.c (start_function): Don't modify the settings of TREE_PUBLIC + and DECL_EXTERNAL on explicit instantiations. + + * cvt.c (cp_convert): Replace constants with their values before + converting. + (cp_convert): Consistently use 'e' instead of 'expr'. + +Thu Jun 2 03:53:30 1994 Jason Merrill + + * typeck2.c (build_x_arrow): Resolve OFFSET_REFs first. + +Wed Jun 1 18:57:35 1994 Jason Merrill + + * typeck2.c (digest_init): Handle initializing a pmf with an + overloaded method. + * typeck.c (build_ptrmemfunc): Handle overloaded methods. + + * decl.c (pushtag): Use build_decl to make TYPE_DECLs. + (xref_defn_tag): Likewise. + * pt.c (process_template_parm): Likewise. + (lookup_template_class): Likewise. + (push_template_decls): Likewise. + (instantiate_class_template): Likewise. + (create_nested_upt): Likewise. + * class.c (finish_struct): Don't try to set DECL_CLASS_CONTEXT on + TYPE_DECLs. + + * typeck.c (convert_arguments): Make sure type is not NULL before + checking its TREE_CODE. + +Wed Jun 1 17:40:39 1994 Mike Stump + + * class.c (get_derived_offset): New routine. + * class.c (finish_base_struct): Make sure we set BINFO_VTABLE and + BINFO_VIRTUALS when we choose a new base class to inherit from. + * class.c (modify_one_vtable): Use get_derived_offset to get the + offset to the most base class subobject that we derived this binfo + from. + * class.c (finish_struct): Move code to calculate the + DECL_FIELD_BITPOS of the vfield up, as we need might need it for + new calls to get_derived_offset in modify_one_vtable. + +Wed Jun 1 16:50:59 1994 Jason Merrill + + * init.c (build_member_call): Use build_pointer_type instead of + TYPE_POINTER_TO. + +Wed Jun 1 11:11:15 1994 Brendan Kehoe + + * decl.c (grokdeclarator): Make sure we have a DNAME set before we + try to use it in an error. + +Wed Jun 1 09:48:49 1994 Mike Stump + + * typeck.c (convert_arguments, convert_for_initialization): Don't + strip NOP_EXPRs, when we are converting to a reference. + +Wed Jun 1 01:11:38 1994 Jason Merrill + + * typeck.c (build_modify_expr): Don't dereference references when + initializing them. + + * decl2.c (grokfield): Don't check for grokdeclarator returning + error_mark_node any more. + + * decl.c (grokfndecl): Return NULL_TREE instead of error_mark_node. + (start_method): Return void_type_node instead of error_mark_node. + + * typeck.c (build_modify_expr): Resolve offset refs earlier. + +Tue May 31 16:06:58 1994 Jason Merrill + + * call.c (build_method_call): Resolve OFFSET_REFs in the object. + + * typeck.c (build_modify_expr): Dereference references before trying + to assign to them. + + * call.c (build_method_call): Don't confuse type conversion + operators with constructors. + * typeck2.c (build_functional_cast): Just call build_c_cast if there + was only one parameter. + * method.c (build_typename_overload): Don't set + IDENTIFIER_GLOBAL_VALUE on these identifiers. + * decl.c (grok_op_properties): Warn about defining a type conversion + operator that converts to a base class (or reference to it). + * cvt.c (cp_convert): Don't try to use a type conversion operator + when converting to a base class. + (build_type_conversion_1): Don't call constructor_name_full on an + identifier. + * cp-tree.h (DERIVED_FROM_P): Should be self-explanatory. + + * decl.c (start_decl): Don't complain that error_mark_node is an + incomplete type. + (finish_decl): Check for type == error_mark_node. + +Mon May 30 23:38:55 1994 Jason Merrill + + * decl.c (start_function): Set DECL_DEFER_OUTPUT on implicit + instantiations and inline members. + + * spew.c (yylex): Set looking_for_template if the next token is a '<'. + + * lex.h: Declare looking_for_template. + + * decl.c (lookup_name_real): Use looking_for_template to arbitrate + between type and template interpretations of an identifier. + +Sat May 28 04:07:40 1994 Jason Merrill + + * pt.c (instantiate_template): Zero out p if we found a + specialization. + + * decl.c (grokdeclarator): Elucidate warning. + (grokdeclarator): If pedantic AND -ansi, complain about long long. + + Make explicit instantiation work reasonably. It is now appropriate + to deprecate the use of -fexternal-templates. + * pt.c (instantiate_template): Set DECL_TEMPLATE_SPECIALIZATION or + DECL_IMPLICIT_INSTANTIATION on fndecl as appropriate. + (end_template_instantiation): Reflect changes in USE_TEMPLATE + semantics. + (do_pending_expansions): if (!flag_implicit_templates) DECIDE(0); + (do_function_instantiation): Don't set EXPLICIT_INST if + flag_external_templates is set. Do set TREE_PUBLIC and DECL_EXTERN + appropriately otherwise. + (do_type_instantiation): Set interface info for class. Set + TREE_PUBLIC and DECL_EXTERN for methods. Do none of this if + flag_external_templates is set. + * parse.y: Reflect changes in USE_TEMPLATE semantics. + * decl2.c: New flag flag_implicit_templates determines whether or + not implicit instantiations get emitted. This flag currently + defaults to true, and must be true for -fexternal-templates to work. + (finish_file): Consider flag_implement_inlines when + setting DECL_EXTERNAL. Consider flag_implicit_templates when + deciding whether or not to emit a static copy. + * decl.c (start_function): Set TREE_PUBLIC and DECL_EXTERNAL + properly for template instantiations. + (start_method): Set DECL_IMPLICIT_INSTANTIATION on methods of a + template class. + * cp-tree.h (CLASSTYPE_USE_TEMPLATE): Change semantics. + (DECL_USE_TEMPLATE): Parallel macro for FUNCTION and VAR_DECLs. + (various others): Accessor macros for the above. + +Fri May 27 13:57:40 1994 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Division by constant zero is + an error. + +Fri May 27 13:50:15 1994 Mike Stump + + * class.c (override_one_vtable): Don't modify things we don't own. + +Fri May 27 01:42:58 1994 Jason Merrill + + * decl.c (finish_decl): Don't postpone processing the initializer of + a decl with DECL_EXTERNAL set, and do call rest_of_compilation for a + PUBLIC const at toplevel. + (grokdeclarator): pedwarn about initializing non-const or + non-integral statics in the class body. + + * decl.c (pushtag): Don't try to set DECL_CLASS_CONTEXT on a + TYPE_DECL. + + * call.c (convert_harshness): Dereference reference on rhs before + proceeding, properly grok passing const things to non-const + references. + + * typeck.c (build_unary_op): Soften error about taking the address + of main() to a pedwarn. + + * lex.c (default_copy_constructor_body): Unambiguously specify base + classes (i.e. A((const class ::A&)_ctor_arg) ). + (default_assign_ref_body): Likewise. + +Thu May 26 13:13:55 1994 Gerald Baumgartner + + * decl2.c (grokfield): Don't complain about local signature + method declaration without definition. + + * call.c (convert_harshness): If `type' is a signature pointer + and `parmtype' is a pointer to a signature, just return 0. We + don't really convert in this case; it's a result of making the + `this' parameter of a signature method a signature pointer. + + * call.c (build_method_call): Distinguish calling the default copy + constructor of a signature pointer/reference from a signature + member function call. + +Thu May 26 12:56:25 1994 Jason Merrill + + * decl2.c (grokfield): Don't set TREE_PUBLIC on member function + declarations. + + * decl.c (duplicate_decls): A previous function declaration as + static overrides a subsequent non-static definition. + (grokdeclarator): Don't set TREE_PUBLIC on inline method + declarations. + +Wed May 25 14:36:38 1994 Jason Merrill + + * decl.c (grokdeclarator): Handle initialization of static const + members. + (finish_decl): Likewise. + + * decl2.c (grokfield): Allow initialization of static const members + even when pedantic. + + * decl2.c (grokfield): Deal with grokdeclarator returning + error_mark_node. + + * decl.c (grok_ctor_properties): Return 0 for A(A) constructor. + (grokfndecl): Check the return value of grok_ctor_properties. + (start_method): Likewise. + + * parse.y (absdcl): Expand type_quals inline. + +Tue May 24 19:10:32 1994 Jason Merrill + + * decl.c (pushtag): Use IS_AGGR_TYPE rather than checking for a + RECORD_TYPE. + +Tue May 24 18:09:16 1994 Per Bothner + + * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, + always use "__vt_%s". + * decl2.c (finish_vtable_vardecl): Don't consider abstract virtuals + when looking for a "sentinal" method (to decide on emitting vtables). + * decl2.c (finish_file): Scan all decls for thunks that need + to be emitted. + * decl2.c (finish_vtable_vardecl): Don't bother calling emit_thunk. + * method.c (make_thunk): Use a more meaningful label. If there + exists a matching top-level THUNK_DECL re-use it; otherwise + create a new THUNK_DECL (and declare it). + * method.c (emit_thunk): Make thunk external/public depending + on the underlying method. + +Tue May 24 00:22:04 1994 Jason Merrill + + * pt.c (tsubst): Use lookup_name_nonclass to find guiding decls, not + lookup_name. + + * call.c (build_overload_call_real): Don't immediately pick a + function which matches perfectly. + + * decl.c (grokdeclarator): Use c_build_type_variant for arrays. + (grokdeclarator): Warn about, and throw away, cv-quals attached to a + reference (like 'int &const j'). + + * typeck.c (convert_arguments): Don't mess with i for methods. + * call.c (build_method_call): Pass the function decl to + convert_arguments. + + * typeck.c (comp_ptr_ttypes_real): New function. Implements the + checking for which multi-level pointer conversions are allowed. + (comp_target_types): Call it. + (convert_for_assignment): Check const parity on the ultimate target + type, too. And make those warnings pedwarns. + +Mon May 23 14:11:24 1994 Jason Merrill + + * error.c (dump_char): Use TARGET_* for character constants. + +Mon May 23 13:03:03 1994 Brendan Kehoe + + * tree.c (debug_no_list_hash): Make static. + + * decl.c (decls_match): Say the types don't match if newdecl ends up + with a null type, after we've checked if olddecl does. + (pushdecl): Check if the decls themselves match before looking for + an extern redeclared as static, to avoid inappropriate and incorrect + warnings. + +Fri May 20 14:04:34 1994 Jason Merrill + + * decl.c (grokdeclarator): Make warning about duplicate short, etc. + a pedwarn. + + * typeck.c (build_c_cast): Casting to function or method type is an + error. + + * class.c (finish_struct): Make warning for anonymous class with no + instances a pedwarn. + + * Makefile.in (stamp-parse): Expect a s/r conflict. + + * typeck.c (build_modify_expr): pedwarn about using a non-lvalue + cast as an lvalue. + +Thu May 19 12:08:48 1994 Jason Merrill + + * cvt.c (type_promotes_to): Make sure bool promotes to int rather + than unsigned on platforms where sizeof(char)==sizeof(int). + +Wed May 18 14:27:06 1994 Jason Merrill + + * typeck.c (build_c_cast): Tack on a NOP_EXPR when casting to + another variant. + (build_modify_expr): Don't strip NOP_EXPRs, and don't get tricky + and treat them as lvalues. + + * decl.c (shadow_tag): Do complain about forward declarations of + enums and empty declarations. + * parse.y: Don't complain about forward declarations of enums and + empty declarations. + + * typeck.c (convert_for_assignment): Complain about changing + the signedness of a pointer's target type. + + * parse.y (stmt): Move duplicated code for checking case values from + here. + * decl2.c (check_cp_case_value): To here. And add a call to + constant_expression_warning. + + * typeck.c (convert_for_assignment): Don't complain about assigning + a negative value to bool. + + * decl.c (init_decl_processing): Make bool unsigned. + + * class.c (finish_struct): Allow bool bitfields. + +Wed May 18 12:35:27 1994 Ian Lance Taylor + + * Make-lang.in (c++.install-man): Get g++.1 from $(srcdir)/cp. + +Wed May 18 03:28:35 1994 Jason Merrill + + * cvt.c (build_type_conversion): Lose special handling of + truthvalues. + + * search.c (dfs_pushdecls): Improve shadowing warning. + +Tue May 17 13:34:46 1994 Jason Merrill + + * init.c (build_delete): Throw away const and volatile on `this'. + + * decl.c (finish_enum): Put the constants in TYPE_VALUES again, + rather than the enumerators. + (pushtag): s/cdecl/c_decl/g + +Mon May 16 23:04:01 1994 Stephen R. van den Berg + + * cp/typeck.c (common_type): Attribute merging. + (comp_types): Utilize COMP_TYPE_ATTRIBUTES macro. + + * cp/parse.y: Revamp attribute parsing. + +Mon May 16 01:40:34 1994 Jason Merrill + + * decl.c (shadow_tag): Also check for inappropriate use of auto and + register. + + * method.c (build_overload_name): Clarify that the illegal case is a + pointer or reference to array of unknown bound. + + * error.c (dump_type_prefix): Print references to arrays properly. + + * typeck.c (various): Be more helpful in pointer + comparison diagnostics. + + * tree.c (lvalue_p): MODIFY_EXPRs are lvalues again. Isn't this + fun? + + * parse.y: Also catch an error after valid stmts. + + * search.c (dfs_init_vbase_pointers): Don't abort because `this' is + const. + + * typeck.c (convert_for_initialization): If call to + convert_to_reference generated a diagnostic, print out the parm + number and function decl if any. + + * errfn.c (cp_thing): Check atarg1 to determine whether or not we're + specifying a line, not atarg. + + * tree.c (build_cplus_method_type): Always make `this' const. + + * decl2.c (grokclassfn): If -fthis-is-variable and this function is + a constructor or destructor, make `this' non-const. + + * typeck.c (build_modify_expr): Don't warn specially about + assignment to `this' here anymore, since it will be caught by the + usual machinery. + + * various: Disallow specific GNU extensions (variable-size arrays, + etc.) when flag_ansi is set, not necessarily when pedantic is set, + so that people can compile with -pedantic-errors for tighter const + checking and such without losing desirable extensions. + + * typeck2.c (build_functional_cast): Call build_method_call with + LOOKUP_PROTECT. + (process_init_constructor): Only process FIELD_DECLs. + + * decl.c (finish_decl): Also force static consts with no explicit + initializer that need constructing into the data segment. + + * init.c (build_delete): Undo last patch, as it interferes with + automatic cleanups. + +Sat May 14 01:59:31 1994 Jason Merrill + + * call.c, class.h, cp-tree.h, cvt.c, decl2.c: Lose old overloading + code. + + * init.c (build_delete): pedwarn about using plain delete to delete + an array. + +Fri May 13 16:45:07 1994 Jason Merrill + + * typeck.c (comp_target_types): Be more helpful in contravariance + warnings, and make them pedwarns. + + * decl.c (grokdeclarator): Use decl_context to decide whether or not + this is an access declaration. + + * class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it + has a conversion to enum or bool, too. + +Fri May 13 16:31:27 1994 Mike Stump + + * method.c (emit_thunk): Make declaration for + current_call_is_indirect local (needed for hppa). + +Fri May 13 16:16:37 1994 Jason Merrill + + * pt.c (uses_template_parms): Grok BOOLEAN_TYPE. + (tsubst): Likewise. + +Fri May 13 16:23:32 1994 Mike Stump + + * pt.c (tsubst): If there is already a function for this expansion, + use it. + * pt.c (instantiate_template): Likewise. + +Fri May 13 10:30:42 1994 Brendan Kehoe + + * parse.y (implicitly_scoped_stmt, simple_stmt case): Use + kept_level_p for MARK_ENDS argument to expand_end_bindings, to avoid + generating debug info for unemitted symbols on some systems. + + * cp-tree.h (build_static_cast, build_reinterpret_cast, + build_const_cast): Add declarations. + +Fri May 13 09:50:31 1994 Mike Stump + + * search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27 + fix. We now try get_binfo, and if that doesn't find what we want, + we go back to the old method, which still sometimes fails. + +Fri May 13 01:43:18 1994 Jason Merrill + + * parse.y (initdcl): Call cplus_decl_attributes on the right + variable. + * decl2.c (cplus_decl_attributes): Don't call decl_attributes for + void_type_node. + + * typeck.c (build_binary_op_nodefault): Change result_type for + comparison ops to bool. + (build_binary_op): Convert args of && and || to bool. + * cvt.c (build_default_binary_type_conversion): Convert args of && + and || to bool. + (build_default_unary_type_conversion): Convert arg of ! to bool. + (type_promotes_to): bool promotes to int. + +Fri May 13 01:43:18 1994 Mike Stump + + Implement the new builtin `bool' type. + * typeck.c (build_binary_op_nodefault): Convert args of && and || to + bool. + (build_unary_op): Convert arg of ! to bool. + * parse.y: Know true and false. Use bool_truthvalue_conversion. + * method.c (build_overload_value): Know bool. + (build_overload_name): Likewise. + * lex.c (init_lex): Set up RID_BOOL. + * gxx.gperf: Add bool, true, false. + * error.c (*): Know bool. + * decl.c (init_decl_processing): Set up bool, true, false. + * cvt.c (cp_convert): Handle conversion to bool. + (build_type_conversion): Likewise. + * *.c: Accept bool where integers and enums are accepted (use + INTEGRAL_CODE_P macro). + +Thu May 12 19:13:54 1994 Richard Earnshaw + + * g++.c: Use #ifdef for __MSDOS__, not #if. + +Thu May 12 18:05:18 1994 Mike Stump + + * decl2.c (lang_f_options): Handle -fshort-temps. -fshort-temps + gives old behavior , and destroys temporaries earlier. Default + behavior now conforms to the ANSI working paper. + +Thu May 12 14:45:35 1994 Jason Merrill + + * typeck.c (build_modify_expr): Understand MODIFY_EXPR as an lvalue. + Use convert_force to convert the result of a recursive call when we + are dealing with a NOP_EXPR. Don't automatically wrap MODIFY_EXPRs + in COMPOUND_EXPRs any more. + (various): Lose pedantic_lvalue_warning. + (unary_complex_lvalue): Understand MODIFY_EXPR. + + * cvt.c (convert_to_reference): Allow DECL to be error_mark_node if + we don't know what we're initializing. + +Wed May 11 01:59:36 1994 Jason Merrill + + * cvt.c (convert_to_reference): Modify to use convtype parameter. + Only create temporaries when initializing a reference, not when + casting. + (cp_convert): New main function. + (convert): Call cp_convert. + * cvt.c, decl.c, typeck.c: Fix calls to convert_to_reference. + * cp-tree.h (CONV_*): New constants used by conversion code for + selecting conversions to perform. + + * tree.c (lvalue_p): MODIFY_EXPRs are no longer lvalues. + + * typeck.c (build_{static,reinterpret,const_cast): Stubs that just + call build_c_cast. + * parse.y: Add {static,reinterpret,const}_cast. + * gxx.gperf: Likewise. + + * typeck.c (common_type): Allow methods with basetypes of different + UPTs. + (comptypes): Deal with UPTs. + (build_modify_expr): Wrap all MODIFY_EXPRs in a COMPOUND_EXPR. + + * pt.c (end_template_decl): Check for multiple definitions of member + templates. + + * call.c (build_method_call): Complain about calling an abstract + virtual from a constructor. + + * typeck.c (pointer_int_sum): Check for the integer operand being 0 + after checking the validity of the pointer operand. + + * typeck2.c (digest_init): Pedwarn about string initializer being + too long. + +Tue May 10 12:10:28 1994 Jason Merrill + + * decl.c (push_overloaded_decl): Only throw away a builtin if the + decl in question is the artificial one. + + * parse.y (simple_stmt, switch): Use implicitly_scoped_stmt because + expand_{start,end}_case cannot happen in the middle of a block. + + * cvt.c (build_type_conversion_1): Use convert again. + +Tue May 10 11:52:04 1994 Brendan Kehoe + + * typeck2.c (digest_init): Make sure we check for signed and + unsigned chars as well when warning about string initializers. + + * init.c (emit_base_init): Check if there's a DECL_NAME on the + member before trying to do an initialization for it. + +Tue May 10 11:34:37 1994 Mike Stump + + * except.c: Don't do anything useful when cross compiling. + +Tue May 10 03:04:13 1994 Jason Merrill + + * decl.c (duplicate_decls): Fix up handling of builtins yet again. + (push_overloaded_decl): Likewise. + + * cvt.c (convert): Don't look for void type conversion. + +Mon May 9 18:05:41 1994 Jason Merrill + + * init.c (do_friend): Only do a pushdecl for friends, not + pushdecl_top_level. + +Mon May 9 13:36:34 1994 Jim Wilson + + * decl.c (lookup_name_current_level): Put empty statement after + the label OUT to make the code valid C. + +Mon May 9 12:20:57 1994 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Only complain about + comparing void * and a function pointer if void * is smaller. + +Sun May 8 01:29:13 1994 Jason Merrill + + * decl.c (lookup_name_current_level): Move through temporary binding + levels. + + * parse.y (already_scoped_stmt): Revive. + (simple_stmt): Use it again. + + * decl.c (poplevel): Always call poplevel recursively if we're + dealing with a temporary binding level. + +Sat May 7 10:52:28 1994 Mike Stump + + * decl.c (finish_decl): Make sure we run cleanups for initial values + of decls. Cures memory leak. + * decl.c (expand_static_init): Likewise for static variables. + * decl2.c (finish_file): Likewise for globals. + +Sat May 7 03:57:44 1994 Jason Merrill + + * typeck.c (commonparms): Don't complain about redefining default + args. + + * decl.c (duplicate_decls): Don't complain twice about conflicting + function decls. + (decls_match): Don't look at default args. + (redeclaration_error_message): Complain about redefining default + args. + + * call.c (build_overload_call_real): Also deal with guiding + declarations coming BEFORE the template decl. + + * pt.c (unify): Allow different parms to have different + cv-qualifiers. + (unify): Allow trivial conversions on non-template parms. + +Fri May 6 03:53:23 1994 Jason Merrill + + * pt.c (tsubst): Support OFFSET_TYPEs. + (unify): Likewise. + + * decl2.c (finish_decl_parsing): Call push_nested_class with a type. + + * init.c (build_offset_ref): Fix error message. + * search.c (lookup_field): Likewise. + + * call.c (build_scoped_method_call): Pass binfo to + build_method_call. + * typeck.c (build_object_ref): Likewise. + + * typeck2.c (binfo_or_else): Don't return a _TYPE. + + * class.c (finish_struct): Don't complain about re-use of inherited + names or shadowing of type decls. + * decl.c (pushdecl_class_level): Likewise. + + * decl.c (finish_enum): Set the type of all the enums. + + * class.c (finish_struct): Don't get confused by access decls. + + * cp-tree.h (TYPE_MAIN_DECL): New macro to get the _DECL for a + _TYPE. You can stop using TYPE_NAME for that now. + + * parse.y: Lose doing_explicit (check $0 instead). + * gxx.gperf: 'template' now has a RID. + * lex.h (rid): Likewise. + * lex.c (init_lex): Set up the RID for 'template'. + + * parse.y (type_specifier_seq): typed_typespecs or + nonempty_type_quals. Use it. + (handler_args): Fix bogus syntax. + (raise_identifier{,s}, optional_identifier): Lose. + * except.c (expand_start_catch_block): Use grokdeclarator to parse + the catch variable. + (init_exception_processing): The second argument to + __throw_type_match is ptr_type_node. + + Fri May 6 07:18:54 1994 Chip Salzenberg + + [ change propagated from c-decl.c of snapshot 940429 ] + * cp/decl.c (finish_decl): Setting asmspec_tree should not + zero out the old RTL. + +Fri May 6 01:25:38 1994 Mike Stump + + Add alpha exception handling support to the compiler. + Quick and dirty backend in except.c. + + * cp/*: Remove most remnants of old exception handling support. + * decl.c (finish_function): Call expand_exception_blocks to put + the exception hanlding blocks at the end of the function. + * dec.c (hack_incomplete_structures): Make sure expand_decl_cleanup + comes after expand_decl_init. + * except.c: Reimplementation. + * expr.c (cplus_expand_expr): Handle THROW_EXPRs. + * lex.c (init_lex): Always have catch, try and throw be reserved + words, so that we may always parse exception handling. + * parse.y: Cleanup to support new interface into exception handling. + * tree.def (THROW_EXPR): Add. + +Thu May 5 17:35:37 1994 Jason Merrill + + * parse.y (simple_stmt, for loops): Use implicitly_scoped_stmt. + (various): Lose .kindof_pushlevel and partially_scoped_stmt. + +Thu May 5 16:17:27 1994 Kung Hsu + + * parse.y (already_scoped_stmt): Move expand_end_binding() to + fix the unmatched LBB/LBE in stabs. + +Thu May 5 14:36:17 1994 Jason Merrill + + * decl.c (set_nested_typename): Set TREE_MANGLED on the new + identifiers. + (pushdecl): Check TREE_MANGLED. + (xref_tag): Likewise. + * cp-tree.h (TREE_MANGLED): This identifier is a + DECL_NESTED_TYPENAME (named to allow for future use to denote + mangled function names as well). + + Implement inconsistency checking specified in [class.scope0]. + * decl.c (lookup_name_real): Don't set ICV here after all. + (finish_enum): Also set the type of the enumerators themselves. + (build_enumerator): Put the CONST_DECL in the list instead of its + initial value. + (pushdecl_class_level): Check inconsistent use of a name in the + class body. + * class.c (finish_struct): Check inconsistent use of a name in the + class body. Don't set DECL_CONTEXT on types here anymore. + * parse.y (qualified_type_name): Note that the identifier has now + been used (as a type) in the class body. + * lex.c (do_identifier): Note that the identifier has now been used + (as a constant) in the class body. + * error.c (dump_decl): Print type and enum decls better. + +Thu May 5 09:35:35 1994 Brendan Kehoe + + * typeck.c (build_modify_expr): Warn about assignment to `this'. + +Wed May 4 15:55:49 1994 Jason Merrill + + * init.c (build_delete): Use the global operator delete when + requested. + + * decl.c (lookup_name_real): If we find the type we're looking in a + base class while defining a class, set IDENTIFIER_CLASS_VALUE for + the type. + + * class.c (finish_struct): Remove a couple of dependencies on + language linkage. + + * decl.c (pushtag): Classes do nest in extern "C" blocks. + (pushdecl): Only set DECL_NESTED_TYPENAME on the canonical one for + the type. + (pushtag): Remove another dependency on the language linkage. + + * lex.c (cons_up_default_function): Don't set DECL_CLASS_CONTEXT to + a const-qualified type. + + * decl.c (push_overloaded_decl): Throw away built-in decls here. + (duplicate_decls): Instead of here. + +Wed May 4 15:27:40 1994 Per Bothner + + * typeck.c (get_member_function_from_ptrfunc): Do The Right + Thing (I hope) if we're using thunks. + +Wed May 4 13:52:38 1994 Jason Merrill + + * parse.y (specialization): aggr template_type_name ';'. + (named_class_head_sans_basetype): Use it. + (explicit_instantiation): Likewise. + (tmpl.2): Revert. + + * cvt.c (build_type_conversion_1): Use convert_for_initialization, + rather than convert, to do conversions after the UDC. + + * cp-tree.h (SHARED_MEMBER_P): This member is shared between all + instances of the class. + + * search.c (lookup_field): If the entity found by two routes is the + same, it's not ambiguous. + +Wed May 4 12:10:00 1994 Per Bothner + + * decl.c (lookup_name_real): Check for a NULL TREE_VALUE, + to prevent the compiler from crashing ... + +Wed May 4 11:19:45 1994 Jason Merrill + + * call.c (build_method_call): If we don't have an object, check + basetype_path to figure out where to look up the function. + + * typeck.c (convert_for_initialization): Pass TYPE_BINFO (type) to + build_method_call in case exp is NULL_TREE. + +Tue May 3 16:02:53 1994 Per Bothner + + Give a vtable entries a unique named type, for the sake of gdb. + * class.c (build_vtable_entry): The address of a thunk now has + type vtable_entry_type, not ptr_type_node. + * method.c (make_thunk): Fix type of THUNK_DECL. + * class.c (add_virtual_function, override_one_vtable): Use + vfunc_ptr_type_node, instead of ptr_type_node. + * cp-tree.h (vfunc_ptr_type_node): New macro. + * decl.c (init_decl_processing): Make vtable_entry_type + be a unique type of pointer to a unique function type. + +Tue May 3 09:20:44 1994 Jason Merrill + + * parse.y (do_explicit): Sets doing_explicit to 1. + (explicit_instantiation): Use do_explicit rather than TEMPLATE + directly, add "do_explicit error" rule. + (datadef): Set doing_explicit to 0 after an explicit instantiation. + (tmpl.2): Don't instantiate if we see a ';' unless we're doing an + explicit instantiation. + (named_class_head_sans_basetype): Remove aggr template_type_name + ';' again. + +Mon May 2 23:17:21 1994 Jason Merrill + + * search.c (lookup_nested_tag): Lose. + + * decl2.c (grokfield): Set DECL_CONTEXT on TYPE_DECLs. + (lookup_name_nonclass): Lose. + + * decl.c (poplevel_class): Add force parameter. + (lookup_name_real): Fix handling of explicit scoping which specifies + a class currently being defined. Add 'nonclass' argument. + (lookup_name, lookup_name_nonclass): Shells for lookup_name_real. + + * class.c (finish_struct): Don't unset IDENTIFIER_CLASS_VALUEs here. + (popclass): Force clearing of IDENTIFIER_CLASS_VALUEs if we're being + called from finish_struct. + +Mon May 2 19:06:21 1994 Per Bothner + + * decl.c (init_decl_processing), cp-tree.h: Removed memptr_type. + (It seeems redundant, given build_ptrmemfunc_type.) + * typeck.c (get_member_function_from_ptrfunc), gc.c (build_headof, + build_classof): Use vtable_entry_type instead of memptr_type. + * method.c (emit_thunk): Call poplevel with functionbody==0 + to prevent DECL_INITIAL being set to a BLOCK. + +Mon May 2 15:02:11 1994 Jason Merrill + + * parse.y (named_class_head_sans_basetype): Add "aggr + template_type_name ';'" rule for forward declaration of + specializations. + +Mon May 2 15:02:11 1994 Jason Merrill + + * class.c (instantiate_type): Deal with pmf's. + + * Make-lang.in (cc1plus): Don't depend on OBJS or BC_OBJS, since + stamp-objlist does. + + * Makefile.in (../cc1plus): Depend on OBJDEPS. + (OBJDEPS): Dependency version of OBJS. + +Mon May 2 12:51:31 1994 Kung Hsu + + * search.c (dfs_debug_mark): Unmark TYPE_DECL_SUPPRESS_DEBUG, not + DECL_IGNORED_P. + +Fri Apr 29 12:29:56 1994 Jason Merrill + + * class.c (finish_struct): Clear out memory of local tags. And + typedefs. + + * decl2.c (grokclassfn): Don't set DECL_CONTEXT to a cv-qualified + type. + * search.c (get_matching_virtual): Be more helpful in error message. + + * *: Use DECL_ARTIFICIAL (renamed from DECL_SYNTHESIZED). + + * lex.c (default_assign_ref_body): Expect TYPE_NESTED_NAME to work. + (default_copy_constructor_body): Likewise. + + * class.c (finish_struct): Don't gratuitously create multiple decls + for nested classes. + +Thu Apr 28 23:39:38 1994 Jason Merrill + + Avoid clobbering the arg types of other functions when reverting + static member functions. + * decl.c (revert_static_member_fn): Rearrange arguments, don't + require values for 'fn' and 'argtypes', add warning to comment + above. + (decls_match): Rearrange arguments in call to rsmf. + (grok_op_properties): Don't pass values for fn and argtypes. + * pt.c (instantiate_template): Don't pass values for fn and argtypes. + +Thu Apr 28 16:29:11 1994 Doug Evans + + * Make-lang.in (cc1plus): Depend on stamp-objlist. + * Makefile.in (BC_OBJS): Delete. + (OBJS): Cat ../stamp-objlist to get language independent files. + Include ../c-common.o. + (../cc1plus): Delete reference to BC_OBJS. + +Thu Apr 28 02:12:08 1994 Jason Merrill + + * search.c (compute_access): No really, deal with static members + properly. Would I lie to you? + + Implement lexical hiding of function declarations. + * pt.c (tsubst): Use lookup_name to look for function decls to guide + instantiation. + * method.c (build_opfncall): Use lookup_name_nonclass to look for + non-member functions. + * init.c (do_friend): Use lookup_name_nonclass to look for + functions. + * error.c (ident_fndecl): Use lookup_name to look for functions. + * decl2.c (lookup_name_nonclass): New function, skips over + CLASS_VALUE. + * decl.c (struct binding_level): Lose overloads_shadowed field. + (poplevel): Don't deal with overloads_shadowed. + (push_overloaded_decl): Do lexical hiding for functions. + * class.c (instantiate_type): Don't check non-members if we have + members with the same name. + * call.c (build_method_call): Use lookup_name_nonclass instead of + IDENTIFIER_GLOBAL_VALUE to check for non-member functions. + (build_overload_call_real): Likewise. + + * decl.c (duplicate_decls): Check for ambiguous overloads here. + (push_overloaded_decl): Instead of here. + + * decl.c (pushdecl): Back out Chip's last change. + + * decl.c (grok_op_properties): Operators cannot be static members. + + * cp-tree.h (DECL_SYNTHESIZED): DECL_SOURCE_LINE == 0 + (SET_DECL_SYNTHESIZED): DECL_SOURCE_LINE = 0 + * lex.c (cons_up_default_function): Use SET_DECL_SYNTHESIZED. + + * method.c (do_inline_function_hair): Don't put friends of local + classes into global scope, either. + + * typeck2.c (build_functional_cast): Don't look for a function call + interpretation. + +Thu Apr 28 15:19:46 1994 Mike Stump + + * cp-tree.h: Disable use of backend EH. + +Wed Apr 27 21:01:24 1994 Doug Evans + + * Make-lang.in (c++.distdir): mkdir tmp/cp first. + * Makefile.in (INCLUDES): Move definition to same place as + parent makefile. + (ALLOCA): Define. + (OLDAR_FLAGS): Delete. + (OLDCC): Define. + (DIR): Delete. + (CLIB): Define. + (####site): Delete. + (SUBDIR_USE_ALLOCA): Don't use ALLOCA if compiling with gcc. + +Wed Apr 27 19:10:04 1994 Kung Hsu + + * decl.c (xref_tag): Not to use strstr(), it's not available on + all platforms. + +Wed Apr 27 18:10:12 1994 Jason Merrill + + * class.c (finish_struct): Resolve yet another class/pmf confusion. + + * call.c (build_overload_call_real): Don't take the single-function + shortcut if we're dealing with an overloaded operator. + +Wed Apr 27 17:35:37 1994 Mike Stump + + * search.c (get_base_distance): Search the virtual base class + binfos, incase someone wants to convert to a real virtual base + class. + * search.c (expand_indirect_vtbls_init): Use convert_pointer_to_real + instead of convert_pointer_to, as it now will work. + +Wed Apr 27 15:36:49 1994 Jason Merrill + + * cvt.c (convert_to_reference): Don't complain about casting away + const and volatile. + + * typeck.c (build_unary_op): References are too lvalues. + +Wed Apr 27 13:58:05 1994 Mike Stump + + * class.c (override_one_vtable): We have to prepare_fresh_vtable + before we modify it, not after, also, we cannot reuse an old vtable, + once we commit to a new vtable. Implement ambiguous overrides in + virtual bases as abstract. Hack until we make the class + ill-formed. + +Wed Apr 27 01:17:08 1994 Jason Merrill + + * parse.y (unary_expr): Expand new_placement[opt] and + new_initializer[opt] inline. + + * search.c (lookup_fnfields): Don't throw away the inheritance + information here, either. + (compute_access): Handle static members properly. + + * init.c (build_member_call): Always set basetype_path, and pass it + to lookup_fnfields. + + * search.c (lookup_field): Deal properly with the case where + xbasetype is a chain of binfos; don't throw away the inheritance + information. + (compute_access): protected_ok always starts out at 0. + + * init.c (resolve_offset_ref): Don't cast `this' to the base type + until we've got our basetype_path. + + * cp-tree.h (IS_OVERLOAD_TYPE): aggregate or enum. + + * cvt.c (build_up_reference): Use build_pointer_type rather than + TYPE_POINTER_TO. + + * call.c (convert_harshness_ansi): Call type_promotes_to for reals + as well. + + * cvt.c (type_promotes_to): Retain const and volatile, add + float->double promotion. + + * decl.c (grokdeclarator): Don't bash references to arrays into + references to pointers in function parms. Use type_promotes_to. + +Tue Apr 26 23:44:36 1994 Mike Stump + + Finish off Apr 19th work. + + * class.c (finish_struct_bits): Rename has_abstract_virtuals to + might_have_abstract_virtuals. + * class.c (strictly_overrides, override_one_vtable, + merge_overrides): New routines to handle virtual base overrides. + * class.c (finish_struct): Call merge_overrides to handle overrides + in virtual bases. + +Tue Apr 26 12:45:53 1994 Jason Merrill + + * typeck.c (build_function_call): Call build_function_call_real with + LOOKUP_NORMAL. + + * *: Don't deal with TYPE_EXPRs. + + * tree.c (lvalue_p): If the type of the expression is a reference, + it's an lvalue. + + * cvt.c (convert_to_reference): Complain about passing const + lvalues to non-const references. + (convert_from_reference): Don't arbitrarily throw away const and + volatile on the target type. + + * parse.y: Simplify and fix rules for `new'. + + * decl.c (grok_op_properties): operator void is illegal. + +Mon Apr 25 02:36:28 1994 Jason Merrill + + * parse.y (components): Anonymous bitfields can still have declspecs. + + * decl.c (pushdecl): Postpone handling of function templates like we + do C functions. + + * search.c (expand_indirect_vtbls_init): Fix infinite loop when + convert_pointer_to fails. + + * call.c (compute_conversion_costs_ansi): A user-defined conversion + by itself is better than that UDC followed by standard conversions. + Don't treat integers and reals specially. + + * cp-tree.h: Declare flag_ansi. + + * typeck.c (c_expand_return): pedwarn on return in void function + even if the expression is of type void. + (build_c_cast): Don't do as much checking for casts to void. + (build_modify_expr): pedwarn about array assignment if this code + wasn't generated by the compiler. + + * tree.c (lvalue_p): A comma expression is an lvalue if its second + operand is. + + * typeck.c (default_conversion): Move code for promoting enums and + ints from here. + * cvt.c (type_promotes_to): To here. + * call.c (convert_harshness_ansi): Use type_promotes_to. Also fix + promotion semantics for reals. + +Sun Apr 24 16:52:51 1994 Doug Evans + + * Make-lang.in (c++.install-common): Check for g++-cross. + * Makefile.in: Remove Cygnus cruft. + (config.status): Delete. + (RTL_H): Define. + (TREE_H): Use complete pathname, some native makes have minimal + VPATH support. + (*.o): Use complete pathname to headers in parent dir. + (doc, info, dvi): Delete. + +Sun Apr 24 16:52:51 1994 Doug Evans + + * Make-lang.in (c++.install-common): Check for g++-cross. + * Makefile.in: Remove Cygnus cruft. + (config.status): Delete. + (RTL_H): Define. + (TREE_H): Use complete pathname, some native makes have minimal + VPATH support. + (*.o): Use complete pathname to headers in parent dir. + (doc, info, dvi): Delete. + +Sun Apr 24 00:47:49 1994 Jason Merrill + + * decl.c (pushdecl): Avoid redundant warning on redeclaring function + with different return type. + (decls_match): Compare return types strictly. + +Fri Apr 22 12:55:42 1994 Jason Merrill + + * cvt.c (build_type_conversion): Do try to convert through other + pointers. This will fail if the class defines multiple pointer + conversions. + + * error.c (dump_type_prefix): Print out pointers to arrays properly. + (dump_type_suffix): Likewise. (was 'int *[]', now 'int (*)[]') + + * typeck.c (build_unary_op): Disallow ++/-- on pointers to + incomplete type. + + * decl.c (duplicate_decls): Check mismatched TREE_CODES after + checking for shadowing a builtin. If we're redeclaring a builtin + function, bash the old decl to avoid an ambiguous overload. + + * cvt.c (convert_to_reference): Don't force arrays to decay here. + + * tree.c (lvalue_p): A MODIFY_EXPR is an lvalue. + + * decl.c (duplicate_decls): Don't assume that the decls will have + types. + + Mon Apr 18 11:35:32 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940318 snapshot ] + * c-decl.c (pushdecl): Warn if type mismatch with another external decl + in a global scope. + + Fri Apr 22 06:38:56 1994 Chip Salzenberg + + * cp/typeck2.c (signature_error): Use cp_error for "%T". + + Mon Apr 18 11:59:59 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940415 snapshot ] + * cp/decl.c (duplicate_decls, pushdecl, builtin_function): + Use DECL_FUNCTION_CODE instead of DECL_SET_FUNCTION_CODE. + + Mon Apr 18 11:55:18 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940409 snapshot ] + * cp/decl.c (duplicate_decls): Put new type in same obstack as + old ones, or permanent if old ones in different obstacks. + + Mon Apr 18 11:48:49 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940401 snapshot ] + * cp/parse.y (attrib): Handle string args as expressions, + merging the two rules. `mode' attribute now takes a string arg. + Delete the rule for an identifier as arg. + + Mon Apr 18 11:24:00 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940312 snapshot ] + * cp/typeck.c (pointer_int_sum): Multiplication should be done signed. + (pointer_diff): Likewise the division. + + Sun Mar 6 19:43:39 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940304 snapshot ] + * cp/decl.c (finish_decl): Issue warning for large objects, + if requested. + + Sat Feb 19 22:20:32 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940218 snapshot ] + * cp/parse.y (attrib): Handle attribute ((section ("string"))). + * cp/decl.c (duplicate_decls): Merge section name into new decl. + + Tue Feb 8 09:49:17 1994 Chip Salzenberg + + [ cp/* changes propagated from c-* changes in 940206 snapshot ] + * cp/typeck.c (signed_or_unsigned_type): Check for any + INTEGRAL_TYPE_P not just INTEGER_TYPE. + + Mon Dec 6 13:35:31 1993 Norbert Kiesel + + * cp/decl.c (finish_enum): Start from 0 when determining precision + for short enums. + + Fri Dec 3 17:07:58 1993 Ralph Campbell + + * cp/parse.y (unary_expr): Look at $1 for tree_code rather than + casting $$. + + Wed Nov 17 19:22:09 1993 Chip Salzenberg + + * cp/typeck.c (build_binary_op_nodefault): Propagate code + from C front-end to optimize unsigned short division. + (build_conditional_expr): Fix bug in "1 ? 42 : (void *) 8". + + Wed Nov 17 19:17:18 1993 Chip Salzenberg + + * cp/call.c (convert_harshness_ansi): Given an (e.g.) char + constant, prefer 'const char &' to 'int'. + + Wed Feb 3 13:11:48 1993 Chip Salzenberg + + * cp/class.c (finish_struct_methods): Handle multiple + constructors in fn_fields list. + +Fri Apr 22 12:48:10 1994 Kung Hsu + + * class.c (finish_struct): Use TYPE_DECL_SUPPRESS_DEBUG to flag + types not to be dumped in stabs, like types in #pragma interface. + * decl.c (init_decl_processing): Use TYPE_DECL_SUPPRESS_DEBUG to + mark unknown type. + +Fri Apr 22 03:27:26 1994 Doug Evans + + * Language directory reorganization. + See parent makefile. + +Thu Apr 21 18:27:57 1994 Per Bothner + + * cp-tree.h (THUNK_DELTA): It is normally negative, so + use signed .i variant of frame_size rather than unsigned .u. + * cp-tree.h (VTABLE_NAME_FORMAT): If flag_vtable_thunks, + use "VT" rather than "vt" due to binary incompatibility. + * class.c (get_vtable_name): Use strlen of VTABLE_NAME_FORMAT, + rather than sizeof, since it is now an expression. + * class.c (modify_one_vtable): Modify to skip initial element + containing a count of the vtable. + +Thu Apr 21 00:09:02 1994 Jason Merrill + + * lex.c (check_newline): Force interface_unknown on main input file. + + * pt.c (do_pending_expansions): Always emit functions that have been + explicitly instantiated. + (do_function_instantiation): Set DECL_EXPLICITLY_INSTANTIATED. + (do_type_instantiation): Set CLASSTYPE_VTABLE_NEEDS_WRITING and + DECL_EXPLICITLY_INSTANTIATED on all my methods. + * parse.y (explicit_instantiation): Call do_type_instantiation for + types. + * decl2.c (finish_vtable_vardecl): Call import_export_vtable. + * decl.c (start_function): Don't set DECL_EXTERNAL on a function + that has been explicitly instantiated. + * cp-tree.h (DECL_EXPLICITLY_INSTANTIATED): Alias for + DECL_LANG_FLAG_4. + * class.c: Move import_export_vtable to decl2.c, and comment out all + uses. + +Wed Apr 20 16:51:06 1994 Jason Merrill + + * lex.c (process_next_inline): Don't muck with DECL_INLINE. + (do_pending_inlines): Likewise. + +Tue Apr 19 22:25:41 1994 Mike Stump + + Reimplement vtable building, and most vtable pointer setting. + Allows for earier maintenance, easier understandability, and most + importantly, correct semantics. + + * class.c (build_vtable): Removed unneeded + SET_BINFO_VTABLE_PATH_MARKED. + * class.c (prepare_fresh_vtable): Likewise. Added argument. + * class.c (modify_vtable_entry): General cleanup. + * class.c (related_vslot, is_normal, modify_other_vtable_entries, + modify_vtable_entries): Removed. + * class.c (add_virtual_function): General cleanup. + * class.c (finish_base_struct): Setup BINFO_VTABLE and + BINFO_VIRTUALS as early as we can, so that modify_all_vtables can + work. + * class.c (finish_vtbls): New routine, mostly from + unmark_finished_struct. + * class.c (overrides): New routine. + * class.c (modify_one_vtable): New routine, mostly from + modify_other_vtable_entries and modify_vtable_entries. + * class.c (modify_all_direct_vtables, modify_all_indirect_vtables, + modify_all_vtables): New routines. + * class.c (finish_struct): Added arguemnt to prepare_fresh_vtable + call. General cleanup on how pending_hard_virtuals are handled. + General cleanup on modifying vtables. Use finish_vtbls, instead of + unmark_finished_struct. + * cp-tree.h (init_vtbl_ptrs, expand_direct_vtbls_init, + get_first_matching_virtual, get_matching_virtual, + expand_vbase_vtables_init, expand_indirect_vtbls_init): Update. + * cvt.c (convert_pointer_to_real): Cleanup error message. + * decl.c (grokfndecl): General cleanup. + * decl.c (finish_function): Change init_vtbl_ptrs call to + expand_direct_vtbls_init. Change expand_vbase_vtables_init call to + expand_indirect_vtbls_init. + * init.c (expand_virtual_init): Remove unneeded argument. + * init.c (init_vtbl_ptrs): Rename to expand_direct_vtbls_init, added + two arguments to make more general. Made more general. Now can be + used for vtable pointer initialization from virtual bases. + * init.c (emit_base_init): Change expand_vbase_vtables_init call to + expand_indirect_vtbls_init. Change init_vtbl_ptrs call to + expand_direct_vtbls_init. + * init.c (expand_virtual_init): General cleanup. + * init.c (expand_default_init): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * init.c (expand_recursive_init_1): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * init.c (expand_recursive_init): Change expand_vbase_vtables_init + call to expand_indirect_vtbls_init. + * search.c (get_first_matching_virtual): Rename to + get_matching_virtual. General cleanup and remove setting of + DECL_CONTEXT. That is now done in a cleaner way in + modify_vtable_entry and add_virtual_function. + * search.c (expand_vbase_vtables_init): Rename to + expand_indirect_vtbls_init. General cleanup. Use + expand_direct_vtbls_init to do hard work. Ensures that _all_ vtable + pointers from virtual bases are set up. + * search.c (bfs_unmark_finished_struct, unmark_finished_struct): + Removed. + + * *.[chy]: Remove support for VTABLE_USES_MASK. + +Tue Apr 19 12:51:59 1994 Jason Merrill + + * cvt.c (convert_to_reference): Use NOP_EXPRs to switch between + reference and pointer types instead of bashing the types directly. + + * call.c (build_overload_call_real): Use the TREE_CODE to determine + whether the function is overloaded or not, rather than + TREE_OVERLOADED. + * *: Remove all uses of TREE_OVERLOADED. + + * decl.c (grokdeclarator): Only complain about initializing const + fields when -ansi or -pedantic. + +Tue Apr 19 12:42:42 1994 Doug Evans + + * cp-tree.h (THUNK_DELTA): frame_size is now a union. + +Mon Apr 18 00:17:13 1994 Jason Merrill + + Do overloading on a block-by-block basis, not function-by-function. + * decl.c: Lose overloads_to_forget. + (struct binding_level): Add overloads_shadowed field. + (poplevel): Restore overloads_shadowed. + (push_overloaded_decl): Use overloads_shadowed instead of + overloads_to_forget. + (finish_function): Don't look at overloads_to_forget. + + Copy enum_overflow logic from c-decl.c. + * decl.c (start_enum): Initialize enum_overflow. + (build_enumerator): Use enum_overflow. Also use current_scope(). + + * search.c (current_scope): Move Brendan's comment from + build_enumerator here. + + * typeck.c (convert_for_assignment): Change warnings to pedwarns for + discarding const/volatile. + +Sat Apr 16 01:18:21 1994 Jason Merrill + + * typeck.c (comp_target_parms): Accept TEMPLATE_TYPE_PARMs on the rhs. + (comp_target_types): Likewise. + + * decl.c (lookup_name): Don't unset got_scope here. + + * spew.c (yylex): Only replace yylval with the TYPE_NESTED_NAME if + got_scope != NULL_TREE. + +Fri Apr 15 16:36:33 1994 Jason Merrill + + Horrible kludge to prevent templates from being instantiated by + their base classes. + * parse.y (template_instantiate_once): Unset TYPE_BEING_DEFINED + before we get to left_curly. + * pt.c (instantiate_class_template): Set TYPE_BEING_DEFINED. + + * error.c (dump_decl): If it's a typedef, print out the name of the + decl, not just the underlying type. + + * decl.c (pushdecl): If the old duplicate decl was a TYPE_DECL, + update the IDENTIFIER_TYPE_VALUE of its name. + + * decl2.c (finish_file): When processing the initializer for a + static member, pretend that the dummy function is a member of the + same class. + +Fri Apr 15 15:56:35 1994 Kung Hsu + + * class.c (build_vtable_entry): Revert Apr 4 change. + * decl2.c (mark_vtable_entries): Replace pure virtual function + decl with abort's. + +Fri Apr 15 13:49:33 1994 Jason Merrill + + * typeck.c (build_conditional_expr): Pedwarn on pointer/integer + mismatch, and don't pedwarn on 0/function pointer mismatch. + + * typeck2.c (digest_init): Lose code for special handling of unions. + (process_init_constructor): Since they're handled just fine here. + Pedwarn on excess elements. + + * decl2.c (grokfield): Complain about local class method declaration + without definition. + +Fri Apr 15 13:19:40 1994 Per Bothner + + * method.c (emit_thunk): Add extern declaration for + current_call_is_indirect (needed for hppa). + +Thu Apr 14 16:12:31 1994 Jason Merrill + + Improve local class support; allow classes in different blocks to + have the same name. + * decl.c (pushtag): Support local classes better. + (pushdecl_nonclass_level): New function for pushing mangled decls of + nested types into the appropriate scope. + (xref_defn_tag): Use pushdecl_nonclass_level instead of + pushdecl_top_level. + (grokfndecl): Don't mess with IDENTIFIER_GLOBAL_VALUE for local + class methods. + * method.c (do_inline_function_hair): Likewise. + + * class.c (finish_struct): It is legal for a class with no + constructors to have nonstatic const and reference members. + +Thu Apr 14 07:15:11 1994 Brendan Kehoe + + * decl.c (push_overloaded_decl): Avoid giving errors about + built-ins, since duplicate_decls will have given warnings/errors + for them. + +Thu Apr 14 03:45:12 1994 Jason Merrill + + * cvt.c (convert_to_reference): Warn about casting pointer type to + reference type when this is probably not what they wanted. + +Wed Apr 13 13:12:35 1994 Per Bothner + + * decl.c (finish_decl): Don't mindlessly set TREE_USED for + static consts any more (toplev.c has now been modified to + not emit warnings if they are unused). + +Wed Apr 13 00:22:35 1994 Jason Merrill + + * decl.c (grok_op_properties): If op new/delete get here with + METHOD_TYPEs, do a revert_static_member_fn. + + * cp-tree.h (IDENTIFIER_CLASS_TYPE_VALUE): Lose. + * init.c (is_aggr_typedef): Don't look at + IDENTIFIER_CLASS_TYPE_VALUE. + (get_aggr_from_typedef): Likewise. + (get_type_value): Likewise. + * call.c (build_scoped_method_call): Don't rely on overloaded + template names having IDENTIFIER_CLASS_VALUE set. + + * parse.y (component_decl_1, fn.def2): Revert rules for + constructors. + (component_decl_1, fn.def2): Use $1 instead of $$, since $$ is being + clobbered. + + * decl.c (start_function): Only warn about `void main()' if pedantic + || warn_return_type. + +Tue Apr 12 02:14:17 1994 Jason Merrill + + Clean up overloading of the template name. + * class.c (pushclass): Overload the template name whenever pushing + into the scope of a template class, not just if it is + uninstantiated. + (popclass): Correspondingly. + * search.c (push_class_decls): Don't overload_template_name. + * pt.c (overload_template_name): Don't set IDENTIFIER_LOCAL_VALUE or + DECL_CONTEXT on things. + * parse.y (left_curly): Don't overload_template_name. + * class.c (finish_struct): Don't undo_template_name_overload. + + * method.c (build_opfncall): Only pass one argument to global op + delete. + + * call.c (build_method_call): Use TYPE_VEC_DELETE_TAKES_SIZE to + decide how many arguments to use for vec delete. + + * decl.c (grok_op_properties): Be consistent in modifying + current_class_type. + (grokdeclarator): Only complain about function decls with no return + type if we're being pedantic. + +Mon Apr 11 00:10:53 1994 Jason Merrill + + Add support for operator new [] and operator delete []. + + * tree.def: Add VEC_NEW_EXPR and VEC_DELETE_EXPR. + * ptree.c (print_lang_type): Indicate vec new/delete. + * parse.y: Support vec new/delete. + * method.c (build_decl_overload): Deal with vec new/delete. + (build_opfncall): Likewise. + * lex.c (init_lex): Set up values of ansi_opname and opname_tab for + vec new/delete. vec new uses "__vn", and vec delete uses "__vd". + * init.c (init_init_processing): Set up BIVN and BIVD. + (do_friend): Don't clean up after mistaken setting of TREE_GETS_NEW, + since it doesn't happen any more. + (build_new): Support vec new. Always call something. + (build_x_delete): Support vec delete. + (build_vec_delete): Lose dtor_dummy argument, add use_global_delete, + and pass it to build_x_delete. + * decl2.c (delete_sanity): Don't change behavior by whether or not + the type has a destructor. Pass use_global_delete to + build_vec_delete. + (coerce_delete_type): Make sure that the type returned has a first + argument of ptr_type_node. + * decl.c (init_decl_processing): Also declare the global vec + new/delete. + (grokdeclarator): Also force vec new/delete to be static. + (grok_op_properties): Note presence of vec new/delete, and play with + their args. If vec delete takes the optional size_t argument, set + TYPE_VEC_DELETE_TAKES_SIZE. + * cp-tree.h (TYPE_GETS_{REG,VEC}_DELETE): New macros to simplify + checking for one delete or the other. + (lang_type): gets_new and gets_delete are now two bits long. The + low bit is for the non-array version. Lose gets_placed_new. + (TYPE_VEC_DELETE_TAKES_SIZE): New macro indicating that the vec + delete defined by this class wants to know how much space it is + deleting. + (TYPE_VEC_NEW_USES_COOKIE): New macro to indicate when vec new must + add a header containing the number of elements in the vector; i.e. + when the elements need to be destroyed or vec delete wants to know + the size. + * class.c (finish_struct_methods): Also check for overloading vec + delete. + * call.c (build_method_call): Also delete second argument for vec + delete. + + * decl.c (grokdeclarator): Correct complaints again. + (grokdeclarator): Fix segfault on null declarator. + (decls_match): Also accept redeclaration with no arguments if both + declarations were in C context. Bash TREE_TYPE (newdecl) here. + (duplicate_decls): Instead of here. + + * parse.y (nested_name_specifier_1): Lose rules for dealing with + syntax errors nicely, since they break parsing of 'const i;'. + + * decl.c (lookup_name): if (got_scope == current_class_type) + val = IDENTIFIER_CLASS_VALUE (name). + + * search.c (lookup_nested_tag): Look in enclosing classes, too. + + * spew.c (yylex): Only look one character ahead when checking for a + SCOPE. + + * lex.c (check_newline): Read first nonwhite char before + incrementing lineno. + + * decl.c (grokdeclarator): Don't claim that typedefs are variables + in warning. + + * parse.y: Divide up uses of unqualified_id into + notype_unqualified_id and unqualified_id, so that TYPENAME can be + used as an identifier after an object. + + * class.c (push_nested_class): Don't push into non-class scope. + + * decl.c (grokdeclarator): If an identifier could be a type + conversion operator, but has no associated type, it's not a type + conversion operator. + + * pt.c (unify): Check for equality of constants better. + + * decl.c (grokdeclarator): Don't complain about access decls. + +Sun Apr 10 02:39:55 1994 Jason Merrill + + * decl.c (grokdeclarator): pedwarn about data definitions without + types here. + + * parse.y (datadef): Don't pedwarn about decls without types here, + since that is valid for functions. + (fn.def2, component_decl): Support constructors with declmods again. + (nomods_initdecls): For decls without any mods, so that we don't try + to get declspecs from some arbitrary $0. + + * search.c (lookup_field): Use cp_error. + + * parse.y (nested_name_specifier_1): Don't check aggr/non-aggr type + here; it breaks destructors for non-aggr types. + + * decl.c (lookup_name): Only look for TYPE_DECLs in base classes of + a type being defined, like the comment says. + If got_scope is not an aggregate, just return NULL_TREE. + + * pt.c (create_nested_upt): Kung's code for creating types nested + within uninstantiated templates now lives here (it used to live in + hack_more_ids). It needs to be expanded. + + * parse.y: Stop calling see_typename so much. + + * decl.c (lookup_name): Deal with TTPs and UPTs. + + * lex.c (real_yylex): Don't set looking_for_typename just because we + saw a 'new'. + (dont_see_typename): #if 0 out. + + * spew.c (yylex): Increment looking_for_typename if the next + character is SCOPE, rather than setting it to 1; this way, the value + from seeing an aggr specifier will not be lost. This kinda relies + on looking_for_typename never being < 0, which is now true. + + * parse.y (nested_name_specifier_1): Accept TEMPLATE_TYPE_PARMs, + too. + (named_class_head_sans_basetype): Accept template types, too. Oops. + +Fri Apr 8 16:39:35 1994 Jason Merrill + + * decl2.c (reparse_decl_as_expr1): Handle SCOPE_REFs. + + * parse.y: Lose START_DECLARATOR. + + * search.c (lookup_nested_tag): New function to scan CLASSTYPE_TAGS + for a class. + + * parse.y: Simplify fn.def2 and component_decl. Support 'enum + A::foo' syntax. Catch invalid scopes better. + + * parse.y, lex.c: Lose TYPENAME_COLON. + + * decl2.c (groktypefield): #if 0 out. + + * decl.c (lookup_name): If the type denoted by got_scope is + currently being defined, look in CLASSTYPE_TAGS rather than FIELDS. + + * class.c (push_nested_class): Don't try to push into + error_mark_node. + +Fri Apr 8 07:26:36 1994 Brendan Kehoe + + * Makefile.in (stamp-parse): Update count of conflicts to 33. + +Thu Apr 7 17:47:53 1994 Jason Merrill + + A saner implementation of nested types that treats template types + no differently from non-template types. There are still some + shortcomings of our system; most notably, it is difficult to look + for a nested type that is hidden by another name, because of the way + we keep track of hidden types. But this shouldn't be a problem for + just about anyone. Perhaps lookup_field should be fixed up a bit. + + * spew.c: Moved handling of nested types/scoping from the lexer + into the parser. Removed variable template_type_seen_before_scope. + Removed functions frob_identifier, hack_more_ids, and various cruft + that was #if 0'd out in the past, reducing the size of the file from + 1146 lines to 450 lines. We can't quite do away with spew.c yet, + though; we still need it for do_aggr () and checking for SCOPE after + the current identifier. And setting lastiddecl. + + * parse.y: Moved handling of nested types/scoping from the lexer + into the parser, using a new global variable `got_scope'. Reduced + the number of states by 53. Implemented all uses of explicit global + scope. Removed terminals SCOPED_TYPENAME and SCOPED_NAME. Removed + nonterminals tmpl.1, scoped_base_class, id_scope, typename_scope, + scoped_typename. Added nonterminals nested_type, + qualified_type_name, complete_type_name, qualified_id, ptr_to_mem, + nested_name_specifier, global_scope, overqualified_id, type_name. + Changed many others. Added 9 new reduce/reduce conflicts, which are + nested type parallels of 9 that were already in the grammar for + non-nested types. Eight of the now 33 conflicts should be removed + in the process of resolving the late binding between variable and + function decls. + + * gxxint.texi (Parser): Update. + + * cp-tree.h (IS_AGGR_TYPE_CODE): Add UNINSTANTIATED_P_TYPE. + + * lex.h: Add decl for got_scope. + + * lex.c (see_typename): Claim to be the lexer when calling + lookup_name. + + * decl.c (lookup_name): When called from the lexer, look at + got_scope and looking_at_typename; otherwise don't. + +Thu Apr 7 22:05:47 1994 Mike Stump + + 31th Cygnus<->FSF merge. + +Thu Apr 7 17:47:53 1994 Jason Merrill + + * decl2.c (mark_vtable_entries): Call this to mark all the + entries in the vtable addressable. + (finish_decl_parsing): Handle SCOPE_REFs. + + * decl.c (decls_match): Always call compparms with strict == 1. + Handle the special case of C function redecl here. + (duplicate_decls): Only keep the old type if the new decl takes no + arguments. + + * typeck.c (compparms): Also allow t1 to be ... if strict == 0. + +Thu Apr 7 16:17:50 1994 Mike Stump + + * class.c (build_vtable_entry): Fix breakage introduced Apr 5 + 17:48:41. + +Wed Apr 6 16:05:10 1994 Per Bothner + + * init.c (build_virtual_init), search.c (build_vbase_vtables_init), + ch-tree.h: Every place these functions were called, the result was + immediately passed to expand_expr_stmt. Reduce redundancy by + calling expand_expr_init *inside* these functions. These + makes for a simpler interface, and we don't have to build + compound expressions. Hence, rename these function to: + expand_virtual_init and expand_vbase_vtables_init respectively. + * init.c, decl.c: Change callers of these functions. + * init.c, cp-tree.h (expand_virtual_init): Make static. + + * decl2.c (finish_file): Check TREE_PUBLIC||TREE_ADDRESSABLE + rather than DECL_SAVED_INSNS before emitting inlines. + +Wed Apr 6 13:06:39 1994 Jason Merrill + + * spew.c (init_spew): #if 0 out stuff used by arbitrate_lookup. + + * decl.c (duplicate_decls): If this is a new declaration of an + extern "C" function, keep the type (for the argtypes). + (redeclaration_error_message): Don't check DECL_LANGUAGE here. + (decls_match): Call compparms with a value of strict dependent on + the value of strict_prototypes for DECL_LANGUAGE (oldecl). + + * typeck.c (compparms): ... is only equivalent to non-promoting + parms if we're not being strict. + + * parse.y (empty_parms): Don't check flag_ansi || pedantic here. + + * decl.c (init_decl_processing): if (flag_ansi || pedantic) + strict_prototypes_lang_c = strict_prototypes_lang_cplusplus; + + * decl2.c (grok_function_init): Don't set DECL_INITIAL on pure + virtuals. + +Tue Apr 5 17:48:41 1994 Per Bothner + + Support for implementing vtables with thunks. + * tree.def (THUNK_DECL): New TREE_CODE. + * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY), tree.c + (fnaddr_from_vtable_entry): Handle flag_vtable_thunks case. + * cp-tree.h (memptr_type): New variable. + * class.c (build_vtable_entry): Build thunk if necessary. + * class.c (build_vfn_ref): If using thunks, don't need + to add delta field from vtable (there is none!). + * decl.c: Add memptr_type as well as vtable_entry_type. + If using thunks, the latter is just ptr_type_node. + * gc.c, typeck.c: Use memptr_typeChange, not vtable_entry_type. + * decl2.c (finish_vtable_vardecl): Handle thunks. + * expr.c (cplus_expand_expr): Support THUNK_DECL. + + * decl.c (grokdeclarator): Set DECL_THIS_EXTERN if "extern". + * decl.c (start_function): Set current_extern_inline based on + DECL_THIS_EXTERN, not TREE_PUBLIC. + * decl.c (finish_function): Call mark_inline_for_output if needed, + + Improve intelligence about when to emit inlines. + * cp-tree.h (lang_decl_flags): New field saved_inline. + * cp-tree.h (DECL_SAVED_INLINE): New macro. + * class.c (add_virtual_function): Don't set TREE_ADDRESSABLE. + * decl.h, decl.c (pending_addressable_inlines): Removed. + * decl2.c (pending_addressable_inlines): Renamed to saved_inlines. + * decl2.c (mark_inline_for_output): Do nothing if + DECL_SAVED_INLINE; otherwise set it (and add to saved_inlines list). + * decl2.c (finish_vtable_vardecl): SET_CLASSTYPE_INTERFACE_KNOWN + and set CLASSTYPE_INTERFACE_ONLY if there is a non-inline virtual. + * decl2.c (finish_file): Writing out inlines later, so we can + also handle the ones needed for vtbales. + * decl2.c (write_vtable_entries, finish_vtable_typedecl): Removed. + + * cp-tree.h, class.c, decl2.c, search.c: Remove -fvtable-hack + and flag_vtable_hack. Use -fvtable-thunks and flag_vtable_thunks + instead. (The rationale is that these optimizations both break binary + compatibility, but should become the default in a future release.) + +Wed Apr 6 10:53:56 1994 Mike Stump + + * class.c (modify_vtable_entries): Never reset the DECL_CONTEXT + of a fndecl, as we might not be from that vfield. + +Tue Apr 5 17:43:35 1994 Kung Hsu + + * class.c (add_virtual_function): Fix bug for pure virtual, so + that DECL_VINDEX of the dummy decl copied won't be error. + (see also Apr 4 change) + +Tue Apr 5 17:23:45 1994 Per Bothner + + * typeck.c (c_expand_return): Before checking that we're not + returning the address of a local, make sure it's a VAR_DECL. + (And don't worry about it being a TREE_LIST.) + +Tue Apr 5 13:26:42 1994 Jason Merrill + + * parse.y (YYDEBUG): Always define. + * lex.c (YYDEBUG): Likewise. + +Mon Apr 4 11:28:17 1994 Kung Hsu + + * class.c (finish_struct): Backup out the change below, put the + new change for the same purpose. The change below breaks code. + + * class.c (finish_struct): If pure virtual, copy node and make + RTL point to abort, then put in virtual table. + * decl2.c (grok_function_iit): Reinstate Mar 31 change. + +Sat Apr 2 03:12:58 1994 Jason Merrill + + * init.c (build_new): pedwarn about newing const and volatile + types. + + * tree.c (get_identifier_list): Only do the special handling + thing if we're dealing with the main variant of the record type. + + * cvt.c (convert_to_reference): When converting between + compatible reference types, use the pointer conversion machinery. + Don't just blindly overwrite the old type. + +Fri Apr 1 17:14:42 1994 Jason Merrill + + * call.c (build_method_call): When looking at global functions, + be sure to use instance_ptr for the first argument, not some version + of it that has been cast to a base class. Also do this before + comparing candidates. + +Thu Mar 31 19:50:35 1994 Jason Merrill + + * call.c (build_method_call): Constructors can be called for + const objects. + +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 + + * decl.c (init_decl_processing): Declare __builtin_return_address + and __builtin_frame_address for C++ as well. + +Thu Mar 31 12:35:49 1994 Mike Stump + + * typeck2.c (store_init_value): Integral constant variables are + always constant, even when doing -fpic. + +Sat Jan 23 23:23:26 1994 Stephen R. van den Berg + + * decl.c (redeclaration_error_message): Pass the types to + comptypes. + +Wed Mar 30 21:29:25 1994 Mike Stump + + Cures incorrect errors about pure virtuals in a class, when they + have been overridden in a derived class. + + * search.c (get_abstract_virtuals): Reimplement. + * search.c (get_abstract_virtuals_1): New routine. + +Wed Mar 30 14:10:04 1994 Jason Merrill + + * pt.c (push_template_decls): Make the pushed level pseudo + global. + + * parse.y (extdefs): Don't pop everything if the current binding + level is pseudo_global. + + * decl.c (pop_everything): Stop on reaching a pseudo-global + binding level. + + * cp-tree.h (DECL_FUNCTION_MEMBER_P): Change to more reliable test. + + * decl.c (duplicate_decls): Only copy DECL_SOURCE_{FILE_LINE} if + the old decl actually had an initializer. + + * {various}: Clean up gcc -W complaints. + + * cp-tree.h (DECL_FUNCTION_MEMBER_P): Currently defined to be + (DECL_CONTEXT (NODE) != NULL_TREE). + + * parse.y (lang_extdef): Call pop_everything if necessary. + + * decl.c (pop_everything): New function for popping binding + levels left over after a syntax error. + (pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not + a function is a member. + +Wed Mar 30 14:20:50 1994 Mike Stump + + Cures calling a more base base class function, when a more derived + base class member should be called in some MI situations. + + * search.c (make_binfo): Use more the more specialized base + binfos from the binfo given as the second argument to make_binfo, + instead of the unspecialized ones from the TYPE_BINFO. + * class.c (finish_base_struct): Likewise, update callers. + * search.c (dfs_get_vbase_types): Likewise. + * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. + * decl.c (xref_tag): Use NULL_TREE instead of 0. + * lex.c (make_lang_type): Likewise. + +Wed Mar 30 14:10:04 1994 Jason Merrill + + * decl.c (pushdecl): If pushing a C-linkage function, only do a + push_overloaded_decl. + (duplicate_decls): Standard overloading does not shadow built-ins. + +Tue Mar 29 00:54:18 1994 Jason Merrill + + * pt.c (end_template_decl): Don't call push_overloaded_decl. + + * init.c (do_friend): Don't call push_overloaded_decl. + + * decl.c (pushdecl): Call push_overloaded_decl for functions and + function templates. + (duplicate_decls): Functions and function templates are not + duplicates, but don't complain about calling this function to + compare them. + (push_overloaded_decl): Don't deal with linkage. Call + duplicate_decls. + (redeclaration_error_message): Deal with linkage. + + * decl.c (start_function): If push_overloaded_decl returns an + older version of the function, deal with it. + + * decl.c (start_function): Be sure only to push_overloaded_decl + for non-members. + + * decl.c (grokfndecl): Put back clearing of DECL_CHAIN for + methods. + (start_function): Lose broken and redundant code for checking old + decl. + + * init.c (add_friend): Give line numbers of both friend decls + when warning about re-friending. + + * pt.c (tsubst): Use comptypes rather than == to compare the + types of the method as declared and as defined, since default + parameters may be different. + + * call.c (build_method_call): Use brendan's candidate printing + routine. + + * decl.c (start_method): Methods defined in the class body are + inline whether or not it's a template class. + +Mon Mar 28 16:39:26 1994 Jason Merrill + + * parse.y (initdcl0): Add "extern" to current_declspecs if + have_extern_spec && ! used_extern_spcec. + + * tree.c (really_overloaded_fn): A fn with more than one + overload. + + * pt.c (end_template_decl): Use really_overloaded_fn. + + * decl.c (duplicate_decls): When smashing a decl into a previous + definition, keep the old file and line. + Don't deal with overloaded functions. + Lose old code for checking arg types of functions. + Check for overloaded C functions. + (pushdecl): Deal with overloaded functions. + (start_decl): Expect pushdecl to return an appropriate function decl. + (start_function): Likewise. + (push_overloaded_decl): Don't check for overloaded C functions. + + * *.c: Stop using DECL_OVERLOADED, it being archaic. + TREE_OVERLOADED should probably go, too. + +Mon Mar 28 14:00:45 1994 Ron Guilmette + + * typeck.c (comp_target_types): Call comp_target_parms with + strict == 1. + +Sun Mar 27 00:07:45 1994 Jason Merrill + + * parse.y (empty_parms): Don't parse () as (...) in extern "C" + sections if we're compiling with -ansi or -pedantic. + + * decl.c (decls_match): Don't treat (int) and (int&) as matching. + + * decl2.c (grokfield): Don't pedwarn twice about initializing + field. + + * decl.c (push_overloaded_decl): Warn about shadowing + constructor. + (redeclaration_error_message): Don't allow 'int a; int a;' + + * cvt.c (build_up_reference): Only check for valid upcast if + LOOKUP_PROTECT is set, not just any flag. + +Fri Mar 25 01:22:31 1994 Jason Merrill + + * lex.c (check_newline): When we see a #pragma implementation, + also set it for the main input file. + + * init.c (build_new): Convert array size argument to size_t. + + * parse.y (primary): If we're doing a parenthesized type-id, call + groktypename before passing it to build_new. + + * call.c (build_method_call): Deal properly with const and + volatile for instances of reference type. + + * decl.c (store_return_init): Change 'if (pedantic) error' to 'if + (pedantic) pedwarn'. + + * decl.c (grokdeclarator): Don't complain about putting `static' + and `inline' on template function decls. + +Thu Mar 24 23:18:19 1994 Jason Merrill + + * call.c (build_method_call): Preserve const & volatile on + `this'. + +Thu Mar 24 16:21:52 1994 Mike Stump + + * init.c (build_new, build_vec_delete): Use global new and delete + for arrays. + * decl2.c (delete_sanity): Likewise. + +Thu Mar 24 02:10:46 1994 Jason Merrill + + * cvt.c (convert_to_reference): If i is an lvalue, + (int &)i -> *(int*)&i, as per 5.2.8p9 of the latest WP. + (convert_force): Call convert_to_reference with LOOKUP_COMPLAIN. + +Wed Mar 23 17:45:37 1994 Jason Merrill + + * decl.c (duplicate_decls): Also propagate DECL_TEMPLATE_MEMBERS + and DECL_TEMPLATE_INSTANTIATIONS. + + * init.c (build_new): Handle array typedefs properly. + +Wed Mar 23 18:23:33 1994 Mike Stump + + 30th Cygnus<->FSF merge. + +Wed Mar 23 00:46:24 1994 Mike Stump + + * class.c (modify_vtable_entries): Avoid running off the end of the + virtuals list when processing a virtual destructor. + * class.c (get_vtable_entry): Likewise. + +Wed Mar 23 00:23:59 1994 Jason Merrill + + * decl.c (duplicate_decls): If two template decls don't match, + just return 0. + +Tue Mar 22 23:49:41 1994 Jason Merrill + + * typeck.c (convert_for_assignment): Don't pedwarn about + converting function pointer to void *. + +Tue Mar 22 22:23:19 1994 Mike Stump + + Major revamp of pointer to member functions. Cures major + nonfunctionality when used in casts, and MI situations. + + * cvt.c (convert_force): Update call site of build_ptrmemfunc. + * typeck.c (convert_for_assignment): Likewise. + * typeck2.c (digest_init): Likewise. + * typeck2.c (process_init_constructor): Simplify by moving code into + digest_init. + * typeck2.c (digest_init): Do default_conversions on init value, if + we are processing pointer to member functions. + * class.c (get_vfield_offset): Now non-static. Convert bit offset + into byte offset. + * cp-tree.h (get_vfield_offset): Likewise. + * typeck.c (get_member_function_from_ptrfunc): Convert down to right + instance, before fetching vtable pointer. + * typeck.c (get_delta_difference): New routine. + * typeck.c (build_ptrmemfunc): Revamp to handle casting better, also + get vtable pointer out of right subobject. + +Tue Mar 22 17:56:48 1994 Mike Stump + + * search.c (get_binfo): Return NULL instead of aborting, when + passed a UNION_TYPE. + +Tue Mar 22 12:44:54 1994 Jason Merrill + + These patches implement handling of redefinition/redeclaration of + templates. + + * typeck.c (comptypes): Simplify. All TEMPLATE_TYPE_PARMs are + considered compatible. + + * parse.y (template_def): Pass defn argument to end_template_decl. + + * pt.c (end_template_decl): Add defn argument. Check for + redefinition. Simplify. + + * error.c (OB_UNPUT): New macro, to remove mistakes. + (aggr_variety): Subroutine of dump_aggr_type. + + * decl.c (decls_match): Support templates. + (duplicate_decls): No longer static. Don't try to lay out template + decls. + (pushdecl): Simplify. + + * cp-tree.h (DECL_TEMPLATE_MEMBERS): Use DECL_SIZE instead of + DECL_INITIAL. + +Mon Mar 21 11:46:55 1994 Jason Merrill + + * error.c (dump_decl): Support class template decls. + (dump_type): Don't adorn template type parms. + + * decl.c (duplicate_decls): Save DECL_TEMPLATE_INFO from old decl + if it was a definition. + (redeclaration_error_message): Do the cp_error thang, and reject + redefinition of templates. + +Mon Mar 21 19:36:06 1994 Per Bothner + + * decl.c (grokdeclarator): Set TREE_PUBLIC for METHOD_TYPE + in FIELD context, when appropriate. Also, + CLASSTYPE_INTERFACE_ONLY is irrelevant to setting TREE_PUBLIC. + Also, simplify check for bogus return specifiers. + +Mon Mar 21 11:46:55 1994 Jason Merrill + + * parse.y (after_type_declarator1): Expand type_quals. + (notype_declarator1): Likewise. + (absdcl1): Likewise. + +Sat Mar 19 01:05:17 1994 Jason Merrill + + * decl.c (grokdeclarator): Treat class-local typedefs like static + members; i.e. 'typedef int f();' means that f is a function type, + not a method type. + + * parse.y (decl): Change direct_* back to *. + (type_id): Change direct_abstract_declarator to absdcl. + (direct_declarator, direct_initdecls, direct_initdcl0): Remove again. + +Fri Mar 18 12:47:59 1994 Jason Merrill + + These two patches fix crashes on instantiating a template inside a + function with C linkage or containing labels. + + * class.c (current_lang_stacksize): No longer static. + + * decl.c (struct saved_scope): Add lang_base, lang_stack, + lang_name, lang_stacksize, and named_labels. + (push_to_top_level): Save them. + (pop_from_top_level): Restore them. + + * gxxint.texi (Parser): Update. + + These two patches finish moving the task of expr/declarator + ambiguity resolution from the lexer to the parser, and add one more + r/r conflict. START_DECLARATOR can now be nuked. + + * parse.y (decl): Add "direct_" in typespec X rules. + (direct_declarator): New nonterminal for + direct_after_type_declarator and direct_notype_declarator. + (direct_initdecls): Like initdecls, but uses direct_initdcl0. + (direct_initdcl0): Like initdcl0, but uses direct_declarator. + (named_parm): Add typespec direct_declarator rule. + + * spew.c (yylex): #if 0 out START_DECLARATOR insertion. + + These two patches disable some excessive cleverness on the part of + g++; a non-class declaration always hides a class declaration in the + same scope, and g++ was trying to unhide it depending on the + enclosing expression. + + * spew.c (arbitrate_lookup): #if 0 out. + + * decl.c (lookup_name): Never call arbitrate_lookup. + + * parse.y (complex_notype_declarator1): Add '*' + complex_notype_declarator1 and '&' complex_notype_declarator1 rules. + + * parse.y (complex_direct_notype_declarator): Restore id_scope + see_typename TYPENAME rule, remove all other rules beginning with + those tokens. + (notype_unqualified_id): Add '~' see_typename IDENTIFIER rule. + +Thu Mar 17 17:30:01 1994 Jason Merrill + + These changes fix the compiler's handling of the functional cast/ + object declaration ambiguities in section 6.8 of the ARM. They also + add 11 reduce/reduce conflicts. Sigh. + + * parse.y: Add precedence decls for OPERATOR and '~'. + (notype_unqualified_id): New nonterminal, encompasses all of the + ANSI unqualified-id nonterminal except TYPENAMEs. + (expr_or_declarator): New nonterminal to delay parsing of code like + `int (*a)'. + (primary): Use notype_unqualified_id. + (decl): Add typespec initdecls ';' and typespec declarator ';' + rules. + (initdcl0): Deal with the above. + (complex_notype_declarator1): A notype_declarator that is not also + an expr_or_declarator. + (complex_direct_notype_declarator): A direct_notype_declarator that + doesn't conflict with expr_or_declarator. Use + notype_unqualified_id. Remove id_scope see_typename TYPENAME rule. + (functional_cast): New nonterminal, for the three functional cast + rules. So that they can be moved after + complex_direct_notype_declarator. + (see_typename): Don't accept type_quals any more. + + * decl2.c (reparse_decl_as_expr): New function to deal with parse + nodes for code like `int (*a)++;'. + (reparse_decl_as_expr1): Recursive subroutine of the above. + (finish_decl_parsing): New function to deal with parse nodes for + code like `int (*a);'. See the difference? + +Thu Mar 17 12:16:10 1994 Mike Stump + + These changes break binary compatibility in code with classes + that use virtual bases. + + * search.c (dfs_get_vbase_types): Simplify and correct to make + sure virtual bases are initialized in dfs ordering. + * search.c (get_vbase_types): Simplify and make readable. + +Thu Mar 17 12:01:10 1994 Jason Merrill + + * parse.y: s/ typename / type_id /g + +Wed Mar 16 17:42:52 1994 Kung Hsu + + * parse.y (typespec): Add SCOPE TYPENAME for global scoped + type. e.g. ::B x. + + * decl.c (complete_array_type): Fix a bug that in -pendantic + mode even there's no initializer, it will continue to build + default index. + +Wed Mar 16 17:43:07 1994 Jason Merrill + + * parse.y (direct_notype_declarator): Add PTYPENAME rule, remove + all of the scoped PTYPENAME rules. + +Wed Mar 16 16:39:02 1994 Mike Stump + + * init.c (build_offset_ref): The value of A::typedef_name is + always the TYPE_DECL, and never an error. + +Tue Mar 15 20:02:35 1994 Jason Merrill + + * search.c (get_base_distance_recursive): Two binfos can only + represent the same object if they are both via_virtual. + + * class.c (finish_base_struct): Check vbases for ambiguity, too. + + * search.c (get_vbase_types): Accept binfo argument, too. + +Tue Mar 15 19:22:05 1994 Kung Hsu + + * decl.c (complete_array_type): Complete TYPE_DOMAIN of the + initializer also, because back-end requires it. + +Tue Mar 15 15:33:31 1994 Jason Merrill + + * error.c (dump_expr): Support member functions (which show up as + OFFSET_REFs). + +Mon Mar 14 16:24:36 1994 Mike Stump + + * init.c (build_new): Set the return type of multidimensional + news correctly. + +Fri Mar 11 15:35:39 1994 Kung Hsu + + * call.c (build_method_call): If basetype not equal to type + of the instance, use the type of the instance in building + destructor. + +Thu Mar 10 17:07:10 1994 Kung Hsu + + * parse.y (direct_notype_declarator): Add push_nested_type for + 'template_type SCOPED_NAME' rule. + +Tue Mar 8 00:19:58 1994 Jason Merrill + + * parse.y (parm): Add typed_declspec1 {absdcl, epsilon} rules. + +Sat Mar 5 04:47:48 1994 Jason Merrill + + * parse.y (regcast_or_absdcl): New nonterminal to implement late + reduction of constructs like `int ((int)(int)(int))'. + (cast_expr): Use it. + (sub_cast_expr): Everything that can come after a cast. + (typed_declspecs1): typed_declspecs that are not typed_typespecs. + (direct_after_type_declarator): Lose PAREN_STAR_PAREN rule. + (direct_abstract_declarator): Replace '(' parmlist ')' rule with + '(' complex_parmlist ')' and regcast_or_absdcl. + (parmlist): Split + (complex_parmlist): Parmlists that are not also typenames. + (parms_comma): Enabler. + (named_parm): A parm that is not also a typename. Use declarator + rather than dont_see_typename abs_or_notype_decl. Expand + typed_declspecs inline. + (abs_or_notype_decl): Lose. + (dont_see_typename): Comment out. + (bad_parm): Break out abs_or_notype_decl into two rules. + +Fri Mar 4 18:22:39 1994 Jason Merrill + + * decl2.c (reparse_decl_as_casts): New function to change parse + nodes for `(int)(int)(int)' from "function taking int and returning + function taking int and returning function taking int" to "... cast + to int, cast to int, cast to int". + + * decl2.c (reparse_decl_as_expr): Recursive function to change + parse nodes for `A()()' from "function returning function returning + A" to "A().operator()". + + * parse.y (primary): Replace `typespec LEFT_RIGHT' rule with + `typespec fcast_or_absdcl' rule. + (fcast_or_absdcl): New nonterminal to implement late reduction of + constructs like `A()()()()'. + (typename): Replace `typespec absdcl1' rule with + `typespec direct_abstract_declarator' rule. + (direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule + with `fcast_or_absdcl type_quals' rule. + +Fri Mar 4 16:18:03 1994 Mike Stump + + * tree.c (lvalue_p): Improve OFFSET_REF handling, so that it + matches Section 5.5. + +Fri Mar 4 14:01:59 1994 Jason Merrill + + * error.c (dump_type_prefix): Don't print basetype twice for + pmfs. + +Fri Mar 4 13:24:33 1994 Mike Stump + + * typeck.c (convert_arguments): Handle setHandler(A::handlerFn) + so that it is like setHandler(&A::handlerFn). Cures an `invalid + lvalue in unary `&''. + +Fri Mar 4 11:15:59 1994 Jason Merrill + + * gxxint.texi (Copying Objects): New section discussing default + op= problems with virtual inheritance. + + * decl2.c (grokoptypename): Just does grokdeclarator and + build_typename_overload, since the parser can't call grokdeclarator + directly. + + * method.c (build_typename_overload): Set IDENTIFIER_GLOBAL_VALUE + and TREE_TYPE on generated identifiers. + + * decl.c (grokdeclarator): Don't deal with TYPE_EXPRs anymore. + + * parse.y (parm): Convert `const char *' to `__opPCc' here. + + * error.c (dump_decl): Say sorry rather than my_friendly_aborting + if we can't figure out what to do. + (dump_type*): Likewise. + + * typeck2.c (build_m_component_ref): 'component' is an expr, not + a decl. Also move the IS_AGGR_TYPE check after the stripping of + REFERENCE_TYPE. + +Fri Mar 4 04:46:05 1994 Mike Stump + + * call.c (build_method_call): Handle b->setHandler(A::handlerFn) + so that it is like b->setHandler(&A::handlerFn). Cures an `invalid + lvalue in unary `&''. + +Thu Mar 3 12:38:15 1994 Jason Merrill + + * parse.y: Add precedence specification for START_DECLARATOR. + (type_quals): Move before primary. + (typename): Move before typed_declspecs, add 'typespec absdcl1' rule. + + * decl2.c (grokoptypename): Lose. + + * decl.c (grokdeclarator): Parse TYPE_EXPRs in the initial scan, + rather than waiting until later. + +Wed Mar 2 14:12:23 1994 Jason Merrill + + * parse.y (unary_expr): Use 'typename' in 'new' rules, rather + than expanding it inline. + (typename): Expand empty option of (former) absdcl inline. + (abs_or_notype_decl): Likewise. + (absdcl): Lose empty rule. + (conversion_declarator): New nonterminal for 'typename' of 'operator + typename'. + (operator_name): Use it instead of absdcl. + + * parse.y: Add precedence declarations for SCOPED_TYPENAME, + TYPEOF, and SIGOF. + (typed_declspecs): Accept typed_typespecs, rather than typespec + directly. Add rules with reserved_typespecquals. + (reserved_declspecs): Don't accept typespecqual_reserved at the + beginning of the list. The typed_declspecs rule will deal with this + omission. + (declmods): Accept nonempty_type_quals, rather than TYPE_QUAL + directly. + + * parse.y (direct_notype_declarator, + direct_after_type_declarator, direct_abstract_declarator): Split up + the declarator1 nonterminals to match the draft standard and avoid + ambiguities. + (new_type_id, new_declarator, direct_new_declarator, + new_member_declarator): New nonterminals to implement the subset of + 'typename' allowed in new expressions. + (unary_expr): Use new_type_id instead of typename. + (after_type_declarator1, absdcl1): Fix semantics of member pointers. + (abs_member_declarator, after_type_member_declarator): Lose. + + * parse.y (absdcl1): Don't require parens around + abs_member_declarator. + (abs_member_declarator): Lose see_typename from rules. + (after_type_member_declarator): Likewise. + + * tree.c (get_identifier_list): New function, containing code + previously duplicated in get_decl_list and list_hash_lookup_or_cons. + (get_decl_list): Use it. + (list_hash_lookup_or_cons): Likewise. + + * parse.y (typed_declspecs, declmods): It's not necessary to hash + the declspecs on class_obstack, so don't. This way typed_typespecs + can reduce to typed_declspecs. + +Wed Mar 2 14:29:18 1994 Jason Merrill + + * cvt.c (build_up_reference): If we aren't checking visibility, + also allow base->derived conversions. + +Mon Feb 28 15:14:29 1994 Per Bothner + + * typeck.c (build_c_cast): Remove bogus hack when converting + to a reference type. + + * cp-tree.h (lang_decl::vbase_init_list, DECL_VBASE_INIT_LIST): + Removed, not used. + (lang_stype::methods, lang_decl::next_method): New fields. + (CLASSTYPE_METHODS, DECL_NEXT_METHOD): New macros. + * decl.c (duplicate_decls): Preserve DECL_NEXT_METHOD. + + * cp-tree.h, decl2.c (flag_vtable_hack): New flag. + * decl2.c (finish_vtable_vardecl): If flag_vtable_hack, + and !CLASSTYPE_INTERFACE_KNOWN, try to use the presence of + a non-inline virtual function to control emitting of vtables. + * class.c (finish_struct): Build CLASSTYPE_METHODS list. + * search.c (build_vbase_vtables_init): Don't assemble_external + (yet) if flag_vtable_hack. + * class.c (build_vfn_ref): Likewise. + +Mon Feb 28 14:54:13 1994 Jason Merrill + + * parse.y (component_decl): Don't include "typed_declspecs + declarator ';'" speedup, since it breaks enums. + +Fri Feb 25 15:43:44 1994 Per Bothner + + * class.c (finish_struct): Minor optimization for building + fn_fields list. + +Fri Feb 25 15:23:42 1994 Jason Merrill + + * decl.c (start_function): Fix detection of function overloading. + +Thu Feb 24 22:26:19 1994 Mike Stump + + * lex.c (check_newline): #pragma interface can take a string + argument, just like #pragma implementation. #pragma implementation + checks for garbage on the line, line #pragma interface does. Main + input files do not auto implement like named files, #pragma + implementation must be used explicitly. + +Thu Feb 24 17:09:01 1994 Jason Merrill + + * parse.y (components): Handle list of one again. + (notype_components): Likewise. + (after_type_declarator1): Take maybe_raises out again. + + * gxxint.texi (Parser): Document additional r/r conflict. + +Wed Feb 23 14:42:55 1994 Jason Merrill + + * gxxint.texi (Parser): Add node. + + * Makefile.in (stamp-parse): Update expected conflict count. + + * parse.y (various): Replace "declmods declarator" with "declmods + notype_declarator". The comment saying that "declmods declarator ';'" + corresponds to "int i;" was wrong; it corresponds to "const i;". + (component_decl): Add "typed_declspecs declarator ';'" rule; this + *does* correspond to "int i;". Change "declmods components" to + "declmods notype_components". + (components): Don't deal with a list of one anymore. + (notype_components): New nonterminal, corresponds to notype_declarator. + ({after_,no}type_component_decl{,0}): More new nonterminals. + ({after_,no}type_declarator): Fold in START_DECLARATOR token. + Eliminates four reduce/reduce conflicts. + + (expr): Depend on nontrivial_exprlist instead of nonnull_exprlist. + (nontrivial_exprlist): New nonterminal: A list of at least two + expr_no_commas's. + (nonnull_exprlist): Depend on nontrival_exprlist. + Eliminates four reduce/reduce conflicts. + + (named_class_head): Move intermediate code block into separate + nonterminal so that we can stick %prec EMPTY on it. + + Add more %prec EMPTY's to eliminate remaining shift/reduce + conflicts. + + (after_type_declarator): Add maybe_raises to fndecl rules. + (after_type_declarator_no_typename): Remove. + For correctness. + + Document remaining reduce/reduce conflicts. + +Tue Feb 22 12:10:32 1994 Jason Merrill + + * search.c (get_base_distance): Only bash BINFO_INHERITANCE_CHAIN + (TYPE_BINFO (type)) if we care about the path. + + * tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the + options are. + +Mon Feb 21 19:59:40 1994 Mike Stump + + * Makefile.in (mostlyclean): lex.c is a source file, don't + remove. + +Sat Feb 19 01:27:14 1994 Jason Merrill + + * parse.y: Eliminate 20 shift/reduce conflicts. + +Fri Feb 18 11:49:42 1994 Jason Merrill + + * pt.c (type_unification): Add subr argument; if set, it means + that we are calling ourselves recursively, so a partial match is OK. + (unify): Support pointers to methods and functions. + (tsubst): Support method pointers. + * decl.c (build_ptrmemfunc_type): No longer static, so that + tsubst can get at it. + + * init.c (is_aggr_typedef): Pretend template type parms are + aggregates. + * decl2.c (build_push_scope): If cname refers to a template type + parm, just grin and nod. + + * call.c (build_overload_call_real): Pass subr argument to + type_unification. + * pt.c (do_function_instantiation): Likewise. + * class.c (instantiate_type): Likewise. + + * search.c (get_base_distance): If BINFO is a binfo, use it and + don't mess with its BINFO_INHERITANCE_CHAIN. + + * cvt.c (convert_to_reference): Fix temporary generation. + If ambiguous, return error_mark_node. + + * init.c (build_new): Put back some necessary code. + +Thu Feb 17 15:39:47 1994 Jason Merrill + + * init.c (build_new): Deal with array types properly. + + * search.c (get_binfo): Become a shell for get_base_distance. + (get_binfo_recursive): Lose. + (get_base_distance_recursive): Find the path to the via_virtual base + that provides the most access. + (get_base_distance): Likewise. + + * parse.y (explicit_instantiation): Syntax is 'template class + A', not 'template A'. + + * typeck.c (convert_for_initialization): Remove bogus warning. + + * parse.y (datadef): Revert patch of Oct 27. + +Thu Feb 17 15:12:29 1994 Per Bothner + + * class.c (build_vfn_ref): Cast delta field to ptrdiff_type_node, + rather than integer_type_node. Does wonders for the Alpha. + +Thu Feb 17 13:36:21 1994 Jason Merrill + + * decl.c (build_ptrmemfunc_type): Make sure that the pmf type + goes onto the same obstack as its target type. + +Wed Feb 16 00:34:46 1994 Jason Merrill + + * cvt.c (convert_to_reference): If converting via constructor + on local level, go back to build_cplus_new approach. + + * tree.c (build_cplus_new): If with_cleanup_p, set cleanup slot + to error_mark_node to prevent expand_expr from building a cleanup + for this variable. + + * lex.c (default_assign_ref_body): Return *this from the memcpy + version, too. + + * decl.c (grok_reference_init): Just return if called with + error_mark_node, don't worry about initializing non-const reference + with temporary. + + * cvt.c (convert_to_reference): Do the right thing for + non-aggregate reference conversions, pedwarn when generating a + non-const reference to a temporary. + + * class.c (finish_struct): TYPE_HAS_COMPLEX_{INIT,ASSIGN}_REF and + TYPE_NEEDS_CONSTRUCTING all depend on TYPE_USES_VIRTUAL_BASECLASSES + again. + +Tue Feb 15 19:47:19 1994 Jason Merrill + + * decl.c (grok_reference_init): Pawn off a lot of the work on + convert_to_reference. Generally do the right thing. + + * cvt.c (convert_to_reference): Conform to the initial comment; + i.e. don't create temps if decl != error_mark_node. Handle + cleanups better for temps that do get created. Don't pretend + that we can use an 'A' to initialize a 'const double &' just by + tacking on a NOP_EXPR. Support LOOKUP_SPECULATIVELY. + + * call.c (build_method_call): Set TREE_HAS_CONSTRUCTOR on + constructor calls. + +Mon Feb 14 14:50:17 1994 Jason Merrill + + * decl.c (grok_reference_init): Make a temporary for initializing + const reference from constant expression. + +Mon Feb 14 11:31:31 1994 Per Bothner + + * cp-tree.h, decl.c (set_identifier_local_value): Deleted function. + * decl.c (pushdecl): Define decl in correct binding_level + (which isn't always the inner_binding_level). + + * cvt.c (build_up_reference): Don't ever call expand_aggr_init. + It's ugly, and I don't think it's the right thing to do. + + * cp-tree.h, class.c, decl.c, decl2.c, sp/search.c: + Remove NEW_CLASS_SCOPING, assuming it is always 1. + * decl.c (pop_decl_level): Removed; manually inlined. + +Sun Feb 13 19:04:56 1994 Jason Merrill + + * class.h (candidate): Add basetypes field. + + * call.c (build_method_call): Do access checking after choosing a + function, not before. + + * Makefile.in (cvt.o, call.o, method.o): Depend on class.h. + (mostlyclean): Remove ../cc1plus. + +Fri Feb 11 11:52:26 1994 Jason Merrill + + * class.c (finish_struct): Don't allow adjusting access to a field + of a base class if a local field has the same name. + + * error.c (dump_type_prefix): Output basetype for METHOD_TYPEs. + +Thu Jan 13 17:55:51 1994 Gnanasekaran Swaminathan + + * cp-tree.h (DESTRUCTOR_NAME_P): Do not confuse AUTO_TEMP names + with destructor names when either NO_DOLLAR_IN_LABEL or + NO_DOT_IN_LABEL are not defined. + + Now `template class A {...}' works. + + * pt.c (grok_template_type): Substitute template parm types + with actual types in complex type as well. + (coerce_template_parms): Update the grok_template_type () + function call. + + * pt.c (tsubst): Traverse method list using DECL_CHAIN. + + * decl.c (grok_op_properties): Allow operator++/-- to have + default arguments. + + * typeck2.c (store_init_value): Don't abort when called to + initialize a type that needs constructing with a CONSTRUCTOR. + + * init.c (expand_aggr_init_1, CONSTRUCTOR case): If + store_init_value fails, build and expand an INIT_EXPR. If + store_init_value succeeds, call expand_decl_init. + +Fri Feb 11 02:49:23 1994 Mike Stump + + * class.c (build_vbase_path): Use complete_type_p instead of + resolves_to_fixed_type_p to determine if the virtual bases are in + their right place for the type of expr. Cures problem of thinking a + virtual base class is one place, when it is in fact someplace else. + +Fri Feb 11 00:26:46 1994 Mike Stump + + * init.c (resolve_offset_ref): Make sure we first convert to + intermediate type, if given, when dealing with members off `this'. + Solves an incorrrect `type `foo' is not a base type for type + `multiple'' when it is infact, a base type. + +Thu Feb 10 21:49:35 1994 Mike Stump + + * class.c (modify_other_vtable_entries): Use get_binfo, instead + of binfo_value. Solves problem with compiler giving a `base class + `B' ambiguous in binfo_value (compiler error)' on complex MI + herarchies, when a virtual function is first defied in a virtual + base class. + +Thu Feb 10 17:19:32 1994 Mike Stump + + * class.c (build_vbase_path): Don't complain about ambiguous + intermediate conversion when converting down to a virtual base + class, even if they might seem to be ambiguous. + +Thu Feb 10 12:18:26 1994 Jason Merrill + + * typeck2.c (build_functional_cast): #if 0 out constructor + inheritance code, improve error messages. + + * class.c (finish_base_struct): Complain about base with only + non-default constructors in derived class with no constructors. + + * decl.c (grokdeclarator): Fix detection of virtual new/delete. + +Wed Feb 9 22:02:32 1994 Mike Stump + + * search.c (build_mi_virtuals, add_mi_virtuals, + report_ambiguous_mi_virtuals): Removed unneeded code. + * class.c (finish_struct_bits): Likewise. + +Wed Feb 9 11:27:17 1994 Jason Merrill + + * pt.c (end_template_instantiation): Push decl before + pop_from_top_level. + + * typeck2.c (build_m_component_ref): Make sure datum is of + aggregate type. + + * init.c (get_type_value): New function, returns + IDENTIFIER_TYPE_VALUE or IDENTIFIER_CLASS_TYPE_VALUE or NULL_TREE. + + * call.c (build_method_call): Don't die on call to destructor for + non-type. + + * decl.c (grokdeclarator): Complain about virtual op new and op + delete, make static virtuals unvirtual instead of unstatic. + + * typeck.c (build_c_cast): Also call default_conversion on + methods. + + * decl.c (grokdeclarator): Don't complain about anonymous + bitfields. + + * parse.y (simple_stmt, for loops): Move the continue point after + the cleanups. + + * class.c (finish_struct): Fix setting of + TYPE_HAS_COMPLEX_INIT_REF. + +Tue Feb 8 13:21:40 1994 Jason Merrill + + * init.c (build_new): Deal with `new double (1)'. + + * class.c (finish_struct): TYPE_HAS_COMPLEX_*_REF are supersets of + TYPE_HAS_REAL_*_REF, but TYPE_HAS_COMPLEX_INIT_REF is independent of + TYPE_NEEDS_CONSTRUCTING. + + * decl.c (duplicate_decls): Propagate access decls. + + * typeck2.c (process_init_constructor): Accept empty_init_node + for initializing unions. + + * class.c, lex.c, cp-tree.h: Use + TYPE_HAS_COMPLEX_ASSIGN_REF where TYPE_HAS_REAL_ASSIGN_REF was used + before, use TYPE_HAS_COMPLEX_INIT_REF for TYPE_NEEDS_CONSTRUCTING in + some places. + + * decl.c (finish_decl): Don't complain about uninitialized const + if it was initialized before. + +Mon Feb 7 18:12:34 1994 Jason Merrill + + * lex.c (default_assign_ref_body): Don't deal with vbases for + now. + + * decl.c (finish_decl): Fix reversed logic for objects and other + things that need to be constructed but have no initializer. + + * class.c (finish_struct): Don't set TYPE_HAS_* flags that are + set by grok_op_properties or finish_decl. + + * decl.c: Don't warn about extern redeclared inline unless + -Wextern-inline is given. + * decl2.c (lang_decode_option): Likewise. + * cp-tree.h: Likewise. + +Mon Feb 7 17:29:24 1994 Per Bothner + + * decl.c (pushdecl_with_scope): Fix thinko. Add forward + declaration. + + * decl.c (pushdecl_with_scope): New function. + * decl.c (pushdecl_top_level): Use new function. + * decl.c (pushtag): Initialize newdecl. + * decl.c (pushtag): Push new type decl into correct scope. + +Mon Feb 7 14:42:03 1994 Jason Merrill + + * call.c, cvt.c, init.c, search.c, cp-tree.h: + Eradicate LOOKUP_PROTECTED_OK. + +Mon Feb 7 13:57:19 1994 Per Bothner + + * decl.c (pushtag, xref_tag), cp-tree.h: Add extra parameter + 'globalize' to signify implicit declarations. + * decl.c (globalize_nested_type, maybe_globalize_type): Removed. + * decl.c (set_identifier_type_value_with_scope): New function. + * decl.c (set_identifier_local_value): Simplify. + * spew.c (yylex, do_addr): Modify to return a _DEFN if a + forward declaration (followed by ';' and not preceded by 'friend'). + * class.c, decl.c, except.c, init.c, parse.y, + pt.c, search.c: Add new argument to calls to xref_tag and + pushtag. + +Mon Feb 7 00:22:59 1994 Jason Merrill + + * cp-tree.h (ACCESSIBLY_UNIQUELY_DERIVED_P): New macro, means what + ACCESSIBLY_DERIVED_FROM_P meant before. + (ACCESSIBLY_DERIVED_FROM_P): Now disregards ambiguity. + + * cvt.c (build_up_reference): Call get_binfo with PROTECT == 1. + + * search.c (get_base_distance_recursive): Members and friends of + a class X can implicitly convert an X* to a pointer to a private or + protected immediate base class of X. + (get_binfo_recursive): Likewise. + (get_base_distance): Ignore ambiguity if PROTECT < 0. + (get_binfo): Lose multiple values of PROTECT. + (compute_access): Protected is OK if the start of the + search is an accessible base class of current_class_type. + + * method.c (build_opfncall): Do check access on operator new here. + + * decl.c (finish_function): Don't check access on operator new + here. + +Sun Feb 6 14:06:58 1994 Jason Merrill + + * decl.c (xref_tag): The base of a derived struct is NOT always + public. Duh. + + * pt.c (do_explicit_instantiation): New function, called from + parser to do explicit function instantiation. + (type_unification): Allow the args list to be terminated with + void_list_node. + (do_pending_expansions): Look at i->interface for non-member + templates. + + * parse.y (datadef): Move explicit_instantiation here. + (structsp): From here. + (datadef): Complain about `int;'. + +Sun Feb 6 12:33:18 1994 Per Bothner + + * pt.c (end_template_instantiation), cp-tree.h: Remove unused + second parameter, and simplify first from a TREE_LIST where + we only care about its TREE_VALUE to just the value (an IDENTIFIER). + * pt.c (instantiate_member_templates): Simplify argument list + from a TREE_LIST to just an IDENTIFIER. + * lex.c (yyprint): PRE_PARSED_CLASS_DECL is now just an IDENTIFIER. + * parse.y (template_instantiate_once): Simplify accordingly. + * decl.c (inner_binding_level): New. Use various places to + simplify. + +Sun Feb 6 02:49:37 1994 Jason Merrill + + * typeck2.c (build_functional_cast): int() -> int(0). + +Sat Feb 5 00:53:21 1994 Jason Merrill + + * class.c (finish_struct): Don't do a bitwise copy for op= if the + class has a virtual function table. + + * typeck.c (convert_for_initialization): Restore warnings about + not using defined op=. Should really be my_friendly_aborts, I + s'pose. + +Fri Feb 4 14:21:00 1994 Jason Merrill + + * class.c (finish_struct): Tidy up conditions for doing bitwise + copies of objects. + + * decl.c (build_default_constructor): #if 0 out. + + * *: Eradicate TYPE_GETS_{ASSIGNMENT,ASSIGN_REF,CONST_ASSIGN_REF, + CONST_INIT_REF}, TYPE_HAS_REAL_CONSTRUCTOR. + + * decl.c (grokdeclarator): Don't return void_type_node for + friends being defined here. + + * init.c (perform_member_init): Only do the init if it's useful. + + * lex.c (default_copy_constructor_body): If we don't need to do + memberwise init, just call __builtin_memcpy. + (default_assign_ref_body): Likewise. + + * decl.c (grokdeclarator): If friendp && virtualp, friendp = 0. + +Fri Feb 4 13:02:56 1994 Mike Stump + + * lex.c (reinit_parse_for_method, cons_up_default_function): + Don't give warn_if_unknown_interface warning when it came from a + system header file. + * pt.c (end_template_decl, instantiate_template): Likewise. + * decl.c (start_decl): Likewise. + +Fri Feb 4 00:41:21 1994 Jason Merrill + + * decl.c (grokdeclarator): Don't try to set TYPE_WAS_ANONYMOUS on + enums. + + * decl2.c (constructor_name_full): Use IS_AGGR_TYPE_CODE instead of + IS_AGGR_TYPE, since we don't know it's a type. + +Thu Feb 3 11:36:46 1994 Jason Merrill + + * decl.c (grokdeclarator): Don't complain about anonymous unions. + + * cp-tree.h (TYPE_WAS_ANONYMOUS): This struct was originally + anonymous, but had a name given to it by a typedef. + + * decl.c (grokdeclarator): When renaming an anonymous struct, set + TYPE_WAS_ANONYMOUS. + + * decl2.c (constructor_name_full): Use TYPE_WAS_ANONYMOUS. + + * cp-tree.h (DECL_UNDEFINED_FRIENDS): #if 0 out. + + * init.c (xref_friend): Don't set up DECL_UNDEFINED_FRIENDS. + (embrace_waiting_friends): Don't use DECL_UNDEFINED_FRIENDS. + + * decl.c (grokdeclarator): Set TYPE_NESTED_NAME properly on nested + anonymous structs that get typedef'd. + + * decl.c (grokdeclarator): Always return void_type_node for + friends. + + * error.c (dump_function_decl): Don't use DECL_CLASS_CONTEXT for + friends. + (dump_function_decl): Don't print out default args for + a function used in an expression. + + * decl.c (grokdeclarator): Give error on abstract declarator used + in an invalid context (i.e. `void (*)();'). + + * error.c (cp_line_of): Support _TYPE nodes. + (cp_file_of): Likewise. + + * cvt.c (build_up_reference): Don't abort if passed a SAVE_EXPR; + it can happen for the RHS of an assignment stmt where the LHS is + a COND_EXPR. + + * init.c (expand_aggr_init_1): Deal with bracketed initializer + lists properly. + + * class.c (finish_struct): Deal with enumerators and typedefs + again. + +Wed Feb 2 11:30:22 1994 Jason Merrill + + * class.c (finish_struct): Tidy up loop over fields. + + * errfn.c (cp_thing): Don't advance twice after a format. + + * class.c (finish_struct): Complain about needing a constructor + if a member has only non-default constructors, and don't try to + generate a default constructor. + + * decl.c (finish_decl): Also do the constructor thing if + TYPE_NEEDS_CONSTRUCTING is set (for arrays). + + * search.c (unuse_fields): New function: mark all fields in this + type unused. + (dfs_unuse_fields): Helper function. + + * class.c (pushclass): If the new class is the same as the old + class, still unuse the fields. + (unuse_fields): Move to search.c. + + * decl.c (grok_op_properties): Add friendp argument. + (grokfndecl): Pass it. + (start_method): Likewise. + + * decl2.c (delete_sanity): Add use_global_delete parameter to catch + ::delete calls. + + * parse.y (unary_expr): Pass new parameter to delete_sanity. + + * lex.c (default_copy_constructor_body): Don't choke if the union + has no fields. + (default_assign_ref_body): Likewise. + + * call.c (compute_conversion_costs_ansi): Do the right thing for + ellipsis matches. + + * decl.c (push_to_top_level): Optimize. + + * decl.c (start_function): Look for the lexical scope of a friend + in DECL_CLASS_CONTEXT. + + * init.c (do_friend): Set DECL_CLASS_CONTEXT on global friends. + +Tue Feb 1 15:59:24 1994 Jason Merrill + + * cp-tree.h (TREE_GETS_PLACED_NEW): New macro. + + * init.c (init_init_processing): Don't assign BIN/BID to the + IDENTIFIER_GLOBAL_VALUEs of their respective operators. + (build_new): Check TREE_GETS_PLACED_NEW. + + * decl.c (grok_op_properties): Don't set TREE_GETS_NEW for a decl of + op new with placement, set TREE_GETS_PLACED_NEW. + + * cp-tree.h (ANON_UNION_P): New macro. Applies to decls. + + * class.c (finish_struct): Don't treat anonymous unions like + other aggregate members. Do synthesize methods for unions without + a name, since they may or may not be "anonymous unions". + + * decl2.c (grok_x_components): Wipe out memory of synthesized methods + in anonymous unions. + + * lex.c (default_copy_constructor_body): Support unions. + (default_assign_ref_body): Likewise. + +Mon Jan 31 12:07:30 1994 Jason Merrill + + * cp-tree.h: Fix documentation of LOOKUP_GLOBAL, add prototypes. + + * error.c (args_as_string): New function (%A), like type_as_string + except NULL_TREE -> "..." + + * call.c (build_overload_call_real): Fix for new overloading. + + * decl.c (grok_op_properties): Set all of the TYPE_OVERLOADS_* flags + here. + + * parse.y (operator_name): Instead of here. + + * typeck2.c (build_functional_cast): Treat a TREE_LIST as a list + of functions. + + * call.c (build_overload_call_real): Support LOOKUP_SPECULATIVELY. + + * method.c (build_opfncall): Don't need to massage return value + any more, call build_overload_call with all flags. + + * typeck.c (build_x_binary_op): Put back speculative call to + build_opfncall. + (build_x_unary_op): Likewise. + (build_x_conditional_expr): Likewise. + +Mon Jan 31 10:00:30 1994 Mike Stump + + * cvt.c (build_type_conversion_1): Change call to pedwarn into + warning, and conditionalize upon warn_cast_qual. + +Fri Jan 28 11:48:15 1994 Jason Merrill + + * search.c (lookup_field): If xbasetype is a binfo, copy it to + avoid clobbering its inheritance info. + + * call.c (build_method_call): Don't overwrite basetype_path with + TYPE_BINFO (inst_ptr_basetype) if they have the same type. + + * search.c (compute_access): Fix handling of protected inheritance + and friendship with the enclosing class. + + * typeck2.c (store_init_value): Allow passing of TREE_CHAIN for + initialization of arbitrary variable. + + * typeck2.c (build_functional_cast): Only try calling a method if + one exists. + + * decl.c (grokdeclarator): Move handling of constructor syntax + initialization into first loop for generality. + (parmlist_is_random): Lose. + + * lex.c (cons_up_default_function): Set TREE_PARMLIST on arguments + to default function. + +Thu Jan 27 19:26:51 1994 Jason Merrill + + * decl.c (grokparms): Abort if we get called with something we don't + expect. + +Thu Jan 27 17:37:25 1994 Mike Stump + + * call.c (build_overload_call_real): Change argument complain to + flags to match style of rest of code. Pass it down to + build_function_call_real as necessary. + * call.c (build_overload_call, build_overload_call_maybe): Change + argument complain to flags to match style of rest of code. + * cp-tree.h (build_function_call_real): Added fourth flags + argument. + * cvt.c (convert_to_reference): Only give warning messages, if + LOOKUP_COMPLAIN is set. + * typeck.c (build_x_function_call): Change simple complain + argument to build_overload_call_maybe and build_overload_call, to + LOOKUP_COMPLAIN to match style of rest of code. + * typeck2.c (build_functional_cast): Likewise. + * typeck.c (build_function_call_real): Add flags, so that we can + not complain, if we don't want to complain. Complain about + arguments, if we are complaining, otherwise don't. + * typeck.c (build_function_call, build_function_call_maybe): + Stick in flags argument. + * typeck.c (build_x_binary_op, build_x_unary_op, + build_x_conditional_expr, build_x_compound_expr): Follow style of + build_x_indirect_ref, as it is more correct and more common. + +Thu Jan 27 14:36:20 1994 Jason Merrill + + * call.c (build_method_call): Don't check for being called with + a pointer. + + * decl2.c (finish_file): Don't play with DECL_CLASS_CONTEXT for the + static initializer function. + + * init.c (build_member_call): Use convert_force here, too. + + * search.c (compute_access): Only treat static members specially + if they are referenced directly. + +Wed Jan 26 18:28:14 1994 Jason Merrill + + * gxxint.texi (Access Control): New node. + + * search.c (current_scope): New function; returns whichever of + current_class_type and current_function_decl is the most nested. + (compute_access): Total overhaul to make it clearer and more + correct. Don't use the cache for now; in the only situation where + it was used before, it gained nothing. This frees up three of the + DECL_LANG_FLAGs for possible other use! + + * cp-tree.h: #if 0 out DECL_PUBLIC & friends. + + * typeck.c (build_component_ref_1): Don't check DECL_PUBLIC. + + * call.c (build_method_call): Use convert_force to cast `this' -- + rely on the access checking for the method itself. + + * init.c (is_friend): Do the nesting thing, handle types. I am + my own friend. + (is_friend_type): Become a shell for is_friend. + (add_friend): Never stick in ctype. + Why are the friendship functions in init.c, anyway? + +Wed Jan 26 17:50:00 1994 Mike Stump + + * cvt.c (build_type_conversion_1): Don't conditionalize call to + pedwarn upon pedantic. + +Wed Jan 26 17:20:46 1994 Mike Stump + + * cvt.c (convert_to_reference): Add 8.4.3 checking so that one + gets a warning if one tries to initialize a non-const & from a + non-lvalue. + * cvt.c (convert_to_reference): Use %P format for argument + numbers in warnings. + +Wed Jan 26 14:35:06 1994 Mike Stump + + * init.c (build_delete): Follow style in call.c to construct the + virtual call to the desctructor, as that code is right. Fixes a + problem of the compiler saying a pointer conversion is ambiguous. + +Wed Jan 26 11:28:14 1994 Jason Merrill + + * cp-tree.h (VTABLE_NAME_P): Change other occurrence of + VTABLE_NAME_FORMAT to VTABLE_NAME. + + * *: s/visibility/access/g + +Tue Jan 25 18:39:12 1994 Jason Merrill + + * typeck.c (build_modify_expr): Don't smash references if INIT_EXPR. + +Tue Jan 25 13:54:29 1994 Mike Stump + + * init.c (build_delete): Back out Jan 17th & 18th pacthes, as + they break libg++. + +Tue Jan 25 13:11:45 1994 Jason Merrill + + * decl.c (duplicate_decls): Fix pointer arithmetic. + +Mon Jan 24 15:50:06 1994 Chip Salzenberg + + [ cp-* changes propagated from c-* changes in 940114 snapshot ] + * cp-parse.y (maybe_attribute): Allow multiple __attribute__ + clauses on a declaration. + +Mon Jan 24 17:06:23 1994 Jason Merrill + + * class.c (finish_struct): Do synthesize methods for anon + structs, just not unions. + +Mon Jan 24 13:50:13 1994 Kung Hsu + + * decl.c (xref_tag): Handle anonymous nested type. + * decl.c (globalize_nested_type): Add no globalize bit check. + * spew.c (hack_more_ids): Templated nested decl not push top + level. + + * parse.y: Get rid of 'goto do_components'. It is much better + for debugging. + + * decl.c (is_anon_name): Get rid of the function and use the + macro ANON_AGGRNAME_P. + * pt.c: Ditto. + +Fri Jan 21 14:06:02 1994 Jason Merrill + + * class.c (finish_struct): Don't synthesize any methods for + anonymous structs/unions. + + * typeck.c (build_modify_expr): Don't treat pmf's as class objects. + +Thu Jan 20 18:56:46 1994 Jason Merrill + + * method.c (build_opfncall): Call build_indirect_ref on + synthesized instance for operator delete. + + * pt.c (type_unification): Don't abort if called with a list of + types in ARGS. + + * class.c (instantiate_type): Deal with function templates. + +Thu Jan 20 16:55:35 1994 Jim Wilson + + * Makefile.in (CC): Default to cc not gcc. + +Thu Jan 20 13:47:54 1994 Jason Merrill + + * typeck.c (build_modify_expr): Call constructor if appropriate. + + * decl.c (push_to_top_level): Clear out class-level bindings cache. + +Wed Jan 19 13:51:22 1994 Jason Merrill + + * call.c (resolve_scope_to_name): Work recursively (previously only + looked down one level). + + * lex.c (do_pending_inlines): If we're still dealing with the last + batch of inlines, don't start working on a new one. + + * Makefile.in (stamp-parse): Update conflict count. + (TAGS): Fix. + + * parse.y (explicit_instantiation): New rule; implements + 'template A' syntax (though not 'template foo(int)' yet). + (structsp): Add explicit_instantiation. + +Tue Jan 18 13:53:05 1994 Jason Merrill + + * class.c (finish_struct, etc.): Simplify decision to synthesize + a destructor. + + * call.c, class.c, cp-tree.h, decl.c, init.c, + ptree.c, search.c, typeck.c, typeck2.c: Nuke + TYPE_NEEDS_CONSTRUCTOR (change all calls to TYPE_NEEDS_CONSTRUCTING). + * init.c (expand_aggr_init_1): Don't try non-constructor methods + of initializing objects. + (build_new): Don't try other methods if the constructor lookup fails. + + * class.c (finish_base_struct): Set cant_have_default_ctor and + cant_synth_copy_ctor properly. + (finish_struct): Likewise. + +Mon Jan 17 13:58:18 1994 Jason Merrill + + * typeck.c (build_modify_expr_1): #if 0 out again. + (build_modify_expr): #if 0 out memberwise init code again. + + * lex.c (default_copy_constructor_body): Be const-correct. + (default_assign_ref_body): Likewise. + + * init.c (perform_member_init): Use TYPE_HAS_CONSTRUCTOR to decide + whether or not to use it, rather than TYPE_NEEDS_CONSTRUCTING. + (expand_aggr_init): Disable silent conversion from initializer list + to list of args for a constructor. + + * class.c (base_info): Lose needs_default_ctor. + (finish_base_struct): Likewise. + (finish_struct): Likewise. + + * decl.c (init_decl_processing): Don't turn off flag_default_inline + just because flag_no_inline is on. + (finish_decl): Use TYPE_HAS_CONSTRUCTOR to decide to use + constructor. + + * class.c (finish_struct): Synthesize default ctor whenever + allowed. + + * Makefile.in (TAGS): Don't try to run etags on cp-parse.y. + +Sat Jan 15 18:34:33 1994 Mike Stump + + * Makefile.in, configure: Handle the C++ front-end in a + subdirectory. + * cp-*: Move C++ front-end to cp/*. + +Fri Jan 14 14:09:37 1994 Jason Merrill + + * cp-typeck.c (build_function_call_real): Modify to match other + instances of taking the address of the function. + + * cp-class.c (finish_struct): Set TYPE_HAS_REAL_CONSTRUCTOR to 1 if + there are non-synthesized constructors. + Only set TYPE_NEEDS_CONSTRUCTOR if TYPE_HAS_REAL_CONSTRUCTOR. + Always generate copy constructor if possible. + + * cp-tree.h (lang_type): Add has_real_constructor bitfield. + (TYPE_HAS_REAL_CONSTRUCTOR): Define. + + * cp-lex.c (default_copy_constructor_body): Use init syntax + for all bases. + + * cp-type2.c (store_init_value): Only give error for initializer list + if TYPE_HAS_REAL_CONSTRUCTOR. + +Thu Jan 13 15:38:29 1994 Jason Merrill + + * cp-tree.h (DECL_SYNTHESIZED): Add defn. + (lang_decl): Add synthesized bitfield to decl_flags. + + * cp-lex.c (cons_up_default_function): Use DECL_SYNTHESIZED to mark + artificial methods, rather than a line # of 0. + +Fri Jan 14 18:25:29 1994 Kung Hsu + + * cp-decl (xref_tag): Fix a bug in conflict type. + * cp-parse.y: Add SCOPED_NAME for uninstantiated template nested + type reference. + * cp-spew.c (yylex): Generated SCOPED_NAME token. + * cp-lex.c (yyprint): Handle SCOPED_NAME. + +Fri Jan 14 17:00:29 1994 Mike Stump + + * cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is + not right. + +Thu Jan 13 14:00:35 1994 Kung Hsu + + * cp-decl2.c (grok_x_components): Fix a bug that enum type does not + have type_flags. + +Thu Jan 13 11:39:34 1994 Mike Stump + + Ensure that all vtable pointers are initialized with all the right + values. + + * cp-class.c (is_normal): Changed to reflect new meaning of + CLASSTYPE_VFIELD_PARENT. + * cp-class.c (maybe_fixup_vptrs): Use of + CLASSTYPE_NEEDS_VIRTUAL_REINIT here is misguided. Use + BINFO_MODIFIED instead. + * cp-class.c (finish_struct): Changed to reflect new meaning of + CLASSTYPE_VFIELD_PARENT. + * cp-decl.c (get_binfo_from_vfield): Removed, unneeded now. + * cp-decl.c (finish_function): Use init_vtbl_ptrs, instead of open + coding it here. + * cp-init.c (init_vfields): Changed name to init_vtbl_ptrs, and + re-implement. + * cp-init.c (emit_base_init): Use new name init_vtbl_ptrs. + * cp-tree.h (vfield_parent): Changed to integer. + * cp-tree.h (CLASSTYPE_VFIELD_PARENT): Changed docs to reflect new + meaning. + * cp-tree.h (init_vtbl_ptrs): Added init_vtbl_ptrs. + +Wed Jan 12 18:24:16 1994 Kung Hsu + + * cp-decl.c (xref_tag): Re-implement globalize nested type. + * cp-decl2.c (grok_x_components): Ditto. + * cp-parse.y: Ditto. + * cp-tree.h (lang_type): Add no_globalize bit in type_flags. + +Wed Jan 12 14:08:09 1994 Jason Merrill + + * cp-decl.c (grokdeclarator): Don't set TREE_PUBLIC on friend + decls with a definition attached. + + * cp-typeck.c (build_modify_expr): Undo previous change in the case + of INIT_EXPRs. + +Tue Jan 11 19:33:03 1994 Jason Merrill + + * cp-typeck.c (build_modify_expr): Replace code for generating + assignment semantics for classes with an error. + (build_modify_expr_1): #if 0 out. + + * cp-decl.c (pushdecl): Patch bogus design of pushdecl + behavior for overloaded functions (it doesn't push anything). + + * cp-class.c (finish_struct): When generating default op=, + set TYPE_HAS_ASSIGNMENT. + +Mon Jan 10 18:48:06 1994 Mike Stump + + * cp-cvt.c (convert): Make {double, clashing enum} -> enum + invalid. + * cp-typeck.c (convert_for_assignment): Simplify. + * cp-decl2.c (warn_enum_clash): Removed. + * invoke.texi (-Wenum-clash): Removed. + * toplev.c (-Wenum-clash): Removed. + +Mon Jan 10 17:48:37 1994 Kung Hsu + + * cp-decl.c (finish_decl): Fix incorrect popclass call. + + * cp-decl.c (is_anon_name): New function, check whether the name + is anonymous name generated by compiler. + * cp-decl.c (grokdeclarator): Allow nested SCOPE_REF + * cp-spew.c (hack_more_ids): Handle nested type in template. + * cp-parse.y: Handle nested type reference in uninstantiated + template. + * cp-call.c (build_method_call): Handle uninstantiated template + case. + * cp-pt.c (search_nested_type_in_tmpl): New function, search nested + type in template. + * cp-pt.c (lookup_nested_type_by_name): New function, lookup nested + type by name. + * cp-pt.c (tsubst): Handle nested type search by name. + +Mon Jan 10 14:32:18 1994 Jason Merrill + + * cp-init.c (build_member_call): Propagate qualifiers to new type. + + * cp-call.c (build_method_call): Count functions the new way. + +Fri Jan 7 19:03:26 1994 Jason Merrill + + * cp-decl.c (pushtag): Set DECL_ASSEMBLER_NAME for nested classes, + too. + +Tue Jan 4 16:45:51 1994 Kung Hsu + + * cp-parse.y: Change to handle whether to globalize nested class. + * cp-decl.c (xref_tag, maybe_globalize_type): Likewise. + +Mon Jan 3 22:22:32 1994 Gerald Baumgartner + + * Makefile.in cp-call.c cp-class.c cp-cvt.c cp-decl.c cp-decl2.c + cp-error.c cp-init.c cp-lex.c cp-lex.h cp-method.c cp-parse.y + cp-spew.c cp-tree.c cp-tree.h cp-type2.c cp-typeck.c cp-xref.c + gplus.gperf toplev.c: Incorporated C++ signature extension. + * cp-sig.c: New file, contains most of signature processing. + * cp-hash.h: Regenerated from gplus.gperf. + + * gcc.1 g++.1: Added explanation for the `-fhandle-signatures' + and `-fno-handle-signatures' command line flags. + + * gcc.texi: Changed the last-modification date. + * invoke.texi: Added `-fhandle-signatures' in the list of + C++ language options. Added explanation for this option. + + + +Copyright (C) 1994 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1995 b/gcc/cp/ChangeLog-1995 new file mode 100644 index 000000000..b5ca4ec34 --- /dev/null +++ b/gcc/cp/ChangeLog-1995 @@ -0,0 +1,3797 @@ +Thu Dec 28 11:13:15 1995 Mike Stump + + * except.c (expand_builtin_throw): Use RETURN_ADDR_OFFSET instead of + NORMAL_RETURN_ADDR_OFFSET. + (end_eh_unwinder): Likewise. + +Wed Dec 27 22:18:16 1995 Mike Stump + + * gc.c (build_dynamic_cast): Make sure we don't cast away const + when dealing with references, and make sure we handle dynamic + casting to a cv qualified reference. + +Thu Dec 21 23:50:35 1995 Mike Stump + + * except.c (struct eh_context): New structure top hold eh context + information. + (push_eh_context): New routine. + (pop_eh_context): Likewise. + * decl.c (push_cp_function_context): Use them. + (pop_cp_function_context): Likewise. + +Wed Dec 20 12:42:51 1995 Jason Merrill + + * decl2.c (finish_file): Also prune uninteresting functions in the + inline emission loop. + +Wed Dec 20 02:32:07 1995 Jeffrey A Law + + * sig.c (build_signature_table_constructor): Mark functions + in the signature as referenced. + +Tue Dec 19 22:36:56 1995 Jason Merrill + + * decl2.c (finish_file): Do all the vtable/synthesis stuff before + the inline emission stuff. + +Mon Dec 18 15:51:33 1995 Jason Merrill + + * cp-tree.h, decl2.c (flag_weak): New flag to control the use of + weak symbols. + * lang-options.h: Add -f{no-,}weak. + * decl.c (init_decl_processing): If the target does not support weak + symbols, don't use them. + * decl2.c, pt.c: s/SUPPORTS_WEAK/flag_weak/. + +Sun Dec 17 21:13:23 1995 Rusty Russell + + * init.c (expand_member_init): warning for base init after members. + +Fri Dec 15 15:32:18 1995 Jason Merrill + + * cvt.c (build_expr_type_conversion): Don't convert to a reference + type. + +Thu Dec 14 16:05:58 1995 Mike Stump + + * method.c (report_type_mismatch): Improve wording for volatile + mismatches. + +Thu Dec 14 14:16:26 1995 Mike Stump + + * init.c (expand_aggr_init_1): Use expand_aggr_init_1 instead of + expand_assignment, as the later doesn't handle things that have + copy constructors well. The compiler would do bitwise copying, + instead of ctor calling in some cases. + +Wed Dec 13 17:05:54 1995 Paul Eggert + + * g++.c (my_strerror): Return "cannot access" if errno is 0. + (pfatal_with_name, perror_exec): Don't assume that + the returned value from my_strerror contains no '%'s. + (concat): Remove. + (sys_nerror): Declare only if HAVE_STRERROR is not defined. + +Wed Dec 13 16:22:38 1995 Jason Merrill + + Lose CLASSTYPE_METHODS/DECL_NEXT_METHOD chain; make + TYPE_METHODS/TREE_CHAIN mean what they used to. + * decl2.c (constructor_name_full): Refer to CLASSTYPE_METHOD_VEC + instead of TYPE_METHODS. + * decl.c (duplicate_decls): Lose references to DECL_NEXT_METHOD. + * tree.c (tree_copy_lang_decl_for_deferred_output): Likewise. + * cp-tree.h (CLASSTYPE_METHODS): Lose. + (CLASSTYPE_METHOD_VEC): Point to lang_spec->methods instead of + TYPE_METHODS. + (struct lang_decl): Lose next_method field. + (DECL_NEXT_METHOD): Lose. + * class.c (finish_struct_methods): Don't mess with TYPE_METHODS. + (finish_struct): Just use TYPE_METHODS; we don't need fn_fields + anymore. + (finish_struct_methods): Don't mess with the TREE_CHAINs in + fn_fields. + + * search.c (add_conversions): Don't use TREE_CHAIN to traverse method + vector. + + * call.c (build_method_call): Synthesize here even when not inlining. + * typeck.c (build_function_call_real): Likewise. + +Wed Dec 13 15:02:39 1995 Ian Lance Taylor + + * cp/lex.c (check_newline): If DBX_DEBUGGING_INFO and write_symbols + == DBX_DEBUG, call dbxout_start_new_source_file and + dbxout_resume_previous_source_file when appropriate. + +Tue Dec 12 20:38:55 1995 Mike Stump + + * except.c (start_anon_func): Push to the top level. + (end_anon_func): Pop from the top level. + +Mon Dec 11 18:56:14 1995 Mike Stump + + * cp-tree.h (build_cleanup): New routine to build cleanups. + * decl.c (expand_static_init): Use build_cleanup to build a cleanup + call at ctor time and use atexit to run it later. + * decl2.c (build_cleanup): New routine, taken from finish_file. + (finish_file): Use build_cleanup instead, and don't put function + local statics in global dtor list. + +Wed Dec 6 14:34:29 1995 Mike Stump + + * except.c (expand_throw): Ensure that we have cleanups, if we try + and expand cleanups. + +Wed Dec 6 11:48:21 1995 Mike Stump + + * except.c (expand_throw): Add logic to manage dynamic cleanups for + the EH object. + (expand_end_catch_block): Use the magic of expand_goto, instead of + emit_jump so that we get the cleanup for any catch clause parameter + and the cleanup for the exception object. Update to reflect label + changes. + (push_eh_cleanup): New routine to register a cleanup for an + exception object. + (empty_fndecl): Used to default cleanup actions to + nothing. + (init_exception_processing): Setup empty_fndecl. Setup + saved_cleanup. + (expand_start_catch_block): Update to reflect label changes. Call + push_eh_object to register the cleanup for the EH object. + (start_anon_func): New routine to start building lambda expressions + from trees. + (end_anon_func): New routine to end them. + (struct labelNode): Change so that we can use tree labels, or rtx + labels. + (saved_cleanup): Object to check for dynamic cleanups for the + exception handling object. + (push_label_entry): Change so that we can use tree labels, or rtx + labels. + (pop_label_entry): Likewise. + (top_label_entry): Likewise. + (expand_start_all_catch): Use tree label instead of rtx label, so + that we can get the magic of expand_goto. + (expand_end_all_catch): Update to reflect label changes. + + * class.c (build_vfn_ref): Remove building_cleanup logic, as we now + use UNSAVE_EXPRs. + * typeck.c (get_member_function_from_ptrfunc): Remove remnants of + building_cleanup logic, as we now use UNSAVE_EXPRs. + * cp-tree.h (unsave_expr): Declare it. + * decl.c (building_cleanup): Remove. + (maybe_build_cleanup): Remove building_cleanup logic, and use + UNSAVE_EXPR instead. + +Sun Dec 3 01:34:58 1995 Mike Stump + + * gc.c (build_t_desc): Update error message to say . + +Thu Nov 30 12:30:05 1995 Brendan Kehoe + + * decl.c (pushdecl): Only warn about shadowing a local variable if + warn_shadow is true. + +Sun Nov 26 16:06:55 1995 Rusty Russell + + * typeck.c (build_binary_op_nodefault): Added warning about + comparisons between different enum types with -Wall, unless + -fenum-int-equiv set. + +Wed Nov 22 15:44:02 1995 Mike Stump + + * class.c (finish_struct_1): Skip down to the inner type in + multidimensional arrays. Ensures ctors will be made for types that + need constructing. + +Wed Nov 22 14:19:22 1995 Mike Stump + + * decl.c (last_dtor_insn): New to track the last compiler generated + insn in a dtor. + (store_parm_decls): Set it. + (finish_function): Use it to see if the dtor is empty. Avoid doing + vtable setup all the time, if we can. + (struct cp_function): Add last_dtor_insn. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + +Wed Nov 22 11:52:19 1995 Paul Russell + + * typeck.c (build_unary_op): Set TREE_NO_UNUSED_WARNING to avoid + warnings. + +Tue Nov 21 17:15:23 1995 Mike Stump + + * typeck.c (expand_target_expr): Make sure targets get put into the + current temp_slot_level, so that the free_temp_slots call will reuse + them. + +Tue Nov 21 13:32:03 1995 Mike Stump + + * class.c (finish_struct_1): Delay delta fixups for virtual bases + until after we have done the hard virtuals, to avoid a bogus `every + virtual function must have a unique final overrider' for virtual + functions that are only overridden by hard virtuals. + +Thu Nov 9 13:35:30 1995 Jason Merrill + + * pt.c (do_function_instantiation): Don't try to find a file-scope + template for a member function. + +Tue Nov 14 06:20:35 1995 Mike Stump + + * g++.c (main): Add handling of -nodefaultlibs. + +Mon Nov 13 15:45:34 1995 Mike Stump + + * cp-tree.h (INDIRECT_BIND): Add a way for the frontend to + distinguish between direct bindings of reference variables, and + indirect bindings of reference variables. + * cvt.c (build_up_reference): Use it. + * typeck.c (convert_arguments): Use it to indicate this is an + indirect binding. + * decl.c (cp_finish_decl): Ensure that we reuse stack slots as fast + as they are unused. + (expand_static_init): Likewise. + (cplus_expand_expr_stmt): Likewise. + * decl2.c (finish_file): Likewise. + * init.c (perform_member_init): Likewise. + (emit_base_init): Likewise. + (expand_aggr_vbase_init_1): Likewise. + +Fri Nov 10 09:18:09 1995 Brendan Kehoe + + * decl.c (push_namespace): Rewrite to use build_lang_decl, so we + get a DECL_LANG_SPECIFIC node. + * cp-tree.h (lang_decl_flags): Add new member `level'. + (NAMESPACE_LEVEL): Don't use decl.arguments, instead use the + decl_flags level member. + +Mon Nov 6 18:36:13 1995 Brendan Kehoe + + * call.c (build_method_call): Make sure instance has a + TYPE_LANG_SPECIFIC node before we dive into it. + +Sat Nov 4 20:01:52 1995 Jason Molenda + + * method.c (make_thunk): Use TREE_SET_CODE to set thunk's tree code. + +Thu Nov 2 17:56:57 1995 Mike Stump + + * decl.c (duplicate_decls): When smashing decls, smash staticness in + the usual way. + +Thu Nov 2 16:44:02 1995 Mike Stump + + * decl.c (poplevel): Handle the merging of subblocks of cleanups + when finishing blocks that have already been created (usually due to + the fixup goto code). Fixes bad debugging information. + +Wed Nov 1 12:33:53 1995 Jason Merrill + + * method.c (hack_identifier): Don't abort when we get a TREE_LIST + that's not a list of overloaded functions. + +Wed Nov 1 11:38:58 1995 Brendan Kehoe + + * decl2.c (mark_vtable_entries): Check DECL_LANG_SPECIFIC on fn + before trying to use DECL_ABSTRACT_VIRTUAL_P. + +Tue Oct 31 11:56:55 1995 Jason Merrill + + * decl2.c (mark_used): New function for hooking into setting of + TREE_USED on decls. + * call.c (build_method_call): Use it. + * class.c (instantiate_type): Likewise. + * init.c (build_offset_ref): Likewise. Don't call assemble_external + for all like-named functions. + * method.c (hack_identifier): Likewise. + (emit_thunk): Don't call assemble_external. + (make_thunk): Create thunk as a FUNCTION_DECL so that it + gets the right mode and ENCODE_SECTION_INFO works. + + * parse.y: Use mark_used. Pass operator names to do_identifier. + * lex.c (do_identifier): Handle operator names. + + * decl2.c (grokclassfn): Tweak __in_chrg attributes. + +Thu Oct 26 16:45:58 1995 Brendan Kehoe + + * errfn.c: Include stdio.h. + (cp_sprintf): Take out decl of sprintf, and cast sprintf to errorfn*. + +Wed Oct 25 18:58:41 1995 Mike Stump + + * typeck2.c (digest_init): Always convert initializers to the + right type. + +Wed Oct 25 13:25:24 1995 Mike Stump + + * init.c (member_init_ok_or_else): Don't allow member initializers + for indirect members, as it is invalid. + +Wed Oct 25 11:35:28 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Don't allow `friend signed ()'. + +Fri Oct 20 10:30:59 1995 Mike Stump + + * parse.y (for.init.statement): Catch compound statements inside for + initializations, if we're being pedantic. + +Fri Oct 20 10:03:42 1995 Mike Stump + + * decl.c (lookup_tag): Return NULL_TREE if we don't find what we are + looking for. + +Thu Oct 19 14:26:10 1995 Mike Stump + + * error.c (dump_expr): Don't core dump when a boolean expression is + used as a default argument. + +Thu Oct 19 10:36:30 1995 Jason Merrill + + * class.c (finish_struct_bits): Check aggregate_value_p instead of + RETURN_IN_MEMORY. + +Wed Oct 18 18:12:32 1995 Jason Merrill + + * class.c (finish_struct_bits): Also set TREE_ADDRESSABLE on a + BLKmode type that would otherwise be returned in registers. + +Mon Oct 16 12:32:19 1995 Brendan Kehoe + + * g++.c (WITHLIBC): New macro. + (main): Declare saw_libc. Use WITHLIBC if `-lc' was used; set + saw_libc and pass it at the end if it was set. + +Wed Oct 11 16:30:34 1995 Brendan Kehoe + + * parse.y (fn.def1): Call split_specs_attrs in + declmods notype_declarator case. + +Sun Nov 26 14:47:42 1995 Richard Kenner + + * Version 2.7.2 released. + +Mon Nov 20 14:05:00 1995 Mike Stump + + * g++.c (pfatal_with_name): Add missing third argument to concat. + +Thu Oct 26 13:59:54 1995 Mike Stump + + * init.c (expand_aggr_init): Handle cv qualifiers on the object's + type. + +Sat Nov 11 08:25:55 1995 Richard Kenner + + * Version 2.7.1 released. + +Thu Nov 2 17:02:47 1995 Jason Merrill + + * call.c (convert_harshness): Handle references to arrays. + +Fri Oct 27 14:20:21 1995 Jason Merrill + + * typeck.c (comp_target_types): Check multi-level pointer + conversions in both directions. + +Tue Oct 17 21:39:05 1995 Jason Merrill + + * parse.y (explicit_instantiation): Fix 'extern template' with no + return type. + +Mon Oct 16 14:35:20 1995 Jason Merrill + + * parse.y (explicit_instantiation): Support automatic instantiation + of constructors. + (named_class_head_*): Support out-of-class definition of nested + types. + +Wed Oct 11 12:20:56 1995 Mike Stump + + * search.c (envelope_add_decl): New routine. Fix so that + methods are hidden in the same way that other members are. + (dfs_pushdecls): Cleanup and move functionality out of line, + into envelope_add_decl. + +Tue Oct 10 15:46:01 1995 Mike Stump + + * typeck.c (mark_addressable): Only call assemble_external if we + have started the output file. + +Tue Oct 10 11:27:18 1995 Jason Merrill + + * decl.c (start_function): Fix earlier cv-quals change. + +Mon Oct 9 23:53:05 1995 Mike Stump + + * parse.y (complex_direct_notype_declarator): Only push the class if + we are not already in the class. + +Mon Oct 9 11:22:03 1995 Doug Evans + + * decl.c (duplicate_decls): Call merge_machine_decl_attributes. + Update olddecl's attributes too. + (grokdeclarator): #if 0 out call to build_decl_attribute_variant. + * typeck.c (common_type): Call merge_machine_type_attributes. + +Fri Oct 6 14:44:27 1995 Mike Stump + + * typeck.c (mark_addressable): Add missing call to + assemble_external. + +Wed Oct 4 15:06:39 1995 Mike Stump + + * decl.c (store_parm_decls): Make sure the unwinder start comes + before the exception specification start. + * except.c (expand_exception_blocks): Make sure the unwinder end + comes after the terminate protected catch clause region and after + the end of the exception specification region. + +Wed Oct 4 12:47:02 1995 Jason Merrill + + * lex.c (real_yylex): Fix identifier case for linemode. + (handle_sysv_pragma): Don't abort when we see a pragma we don't + recognize. + +Tue Oct 3 14:09:46 1995 Mike Stump + + * decl.c (store_parm_decls): Add a call to start_eh_unwinder. + * except.c (init_exception_processing): __throw doesn't take any + arguments. + (expand_builtin_throw): Likewise. Always use Pmode, instead of SImode + for all pointers. Use expand_builtin_return_addr to unwind the + first level off the stack. + (do_unwind): Always use Pmode, instead of SImode for all pointers. + (expand_exception_blocks): Add a call to end_eh_unwinder. + (start_eh_unwinder, end_eh_unwinder): New routines to build machine + independent stack unwinders for function/method calls. + +Mon Oct 2 17:20:42 1995 Mike Stump + + * tree.c (unsave_expr_now): Make sure we process the argument list + of any called functions. Fixes incorrect code generation for + cleanups. + +Mon Oct 2 13:04:16 1995 Mike Stump + + * typeck.c (get_member_function_from_ptrfunc): Save function if it + needs it. Cures core dump on things like (this->*(f()))(). + +Sat Sep 23 22:51:25 1995 Jason Merrill + + * decl.c (start_function): Conform to gcc cv-quals convention (no + expression has a cv-qualified type) in RESULT_DECLs. + * method.c (make_thunk): Likewise. + +Fri Sep 22 10:21:13 1995 Mike Stump + + * decl.c (pushtag): Add in the namespace name for the tag. + +Thu Sep 21 13:11:13 1995 Mike Stump + + * parse.y (maybe_base_class_list, base_class_list, base_class, + base_class_access_list): Make sure we see the typenames for base + classes. + * lex.c (see_typename): Instead of failing to see a typename when + there is no next token, perfer a typename, and get the next token. + +Wed Sep 20 12:35:27 1995 Michael Meissner + + * decl.c (init_decl_processing): Add __builtin_expect. + +Tue Sep 19 16:48:11 1995 Mike Stump + + * cvt.c (cp_convert_to_pointer): Don't allow leftover conversions to + or from pointer to member functions, they must all be handled before + this point. + +Fri Sep 15 17:14:47 1995 Brendan Kehoe + + * init.c (resolve_offset_ref): Fix wording of non-static member + being referenced as a static. + +Fri Sep 15 12:39:11 1995 Jason Merrill + + * typeck.c (build_indirect_ref): Only bash pointer if we actually + call build_expr_type_conversion. + +Thu Sep 14 18:24:56 1995 Jason Merrill + + * cvt.c (build_expr_type_conversion): Handle conversion from + reference. + * typeck.c (build_indirect_ref): Avoid infinite recursion. + +Thu Sep 14 17:23:28 1995 Mike Stump + + * decl.c (expand_start_early_try_stmts): New routine to start a try + block at the start of the function, for function-try-blocks. + * cp-tree.h (expand_start_early_try_stmts): Declare it. + * parse.y (function_try_block): Use it, instead of doing it here, as + we don't want to include rtl.h here, as that conflicts with RETURN + in the parser. + +Wed Sep 13 18:32:24 1995 Mike Stump + + * lex.c (reinit_parse_for_block): Support saving inline + function-try-blocks, uses peekyylex. + * parse.y (eat_saved_input): New rule, permit the parser to see that + END_OF_SAVED_INPUT is ok, as it can see this when parsing the + handlers of a function-try-block. + (fndef): Use it. + (component_decl): Make sure TRY and RETURN can come after fn.def2. + * spew.c (peekyylex): New routine to peek at what will come next. + +Wed Sep 13 16:52:06 1995 Jason Merrill + + * typeck.c (comptypes): Tighten up comparisons of template type + parms. + + * decl.c (duplicate_decls): Turn off whining about virtual functions + redeclared inline for now. + +Wed Sep 13 11:13:40 1995 Mike Stump + + * decl.c (store_in_parms): New routine to put things before we + put base inits. + * cp-tree.h (store_in_parms): Declare it. + * decl.c (store_parm_decls): Use it to makr sure the starting of the + eh spec comes before base inits. + (finish_function): Use sequences instead of the obsolete + reorder_insns. + * parse.y (fndef): Enhance readability and maintainability. Update + to include function_try_block syntax. + (function_try_block): Add. + +Tue Sep 12 17:43:07 1995 Brendan Kehoe + + * call.c (convert_harshness): Use comptypes, not ==, to check if + TYPE and PARMTYPE are equivalent on a function type. + +Tue Sep 12 17:31:33 1995 Douglas Rupp + + * Make-lang.in (cc1plus): Removed unnecessary $(exeext). + +Mon Sep 11 23:24:07 1995 Mike Stump + + * except.c (expand_throw): Never allocate storage for thrown pointer + to objects. + +Mon Sep 11 19:36:45 1995 Mike Stump + + * except.c (expand_start_catch_block): Pointers to objects come + back from catch matching already dereferenced, don't dereference + again. + +Mon Sep 11 15:46:28 1995 Mike Stump + + * except.c (expand_throw): Only decay the throw expression, don't do + any default conversions. This is so that one can throw and catch + characters, and not have them match integers. + +Mon Sep 11 13:46:45 1995 Mike Stump + + * error.c (dump_aggr_type): Deal with anonymous unions that don't + have a TYPE_NAME. + +Fri Sep 8 20:40:27 1995 Brendan Kehoe + + * lex.c (handle_sysv_pragma): Deal with getting a comma from yylex. + +Fri Sep 8 15:51:41 1995 Mike Stump + + * except.c (expand_end_eh_spec): Handle empty EH specifications. + +Fri Sep 8 15:27:22 1995 Mike Stump + + * cp-tree.h (expand_start_eh_spec): Declare new routine. + (expand_end_eh_spec): Likewise. + * decl.c (store_parm_decls): Call expand_start_eh_spec to process + exception specifications. + * except.c (expand_leftover_cleanups): Remove unused parameter. + (expand_end_catch_block): Likewise. + (expand_exception_blocks): Likewise. + (expand_start_eh_spec): New routine to mark the start of an + exception specification region. + (expand_end_eh_spec): New routine to mark the end of an exception + specification region. + (expand_exception_blocks): Call expand_end_eh_spec to process + exception specifications. + +Fri Sep 8 14:40:48 1995 Per Bothner + + * lex.c (do_identifier): Use global binding in preference of + dead for local variable. + +Wed Sep 6 19:32:59 1995 Mike Stump + + * cp-tree.h (build_exception_variant): Remove used first argument. + * decl.c (duplicate_decls): Likewise. + (grokfndecl): Likewise. + (revert_static_member_fn): Likewise. + * decl2.c (grok_method_quals): Likewise. + * tree.c (build_exception_variant): Likewise. + * typeck.c (common_type): Likewise. + * decl2.c (grokclassfn): After changing the type, call + build_exception_variant, if necessary. + +Tue Sep 5 15:56:27 1995 Mike Stump + + * except.c (expand_throw): Run cleanups for the throw expression. + +Wed Aug 30 15:24:38 1995 Stephen L. Favor + + * except.c (expand_builtin_throw): Moved gen_label_rtx calls beyond + the store_parm_decls call which does initialization in the emit_* + code concerning label numbering. + +Thu Aug 31 09:01:07 1995 Mike Stump + + * except.c (expand_internal_throw): Let the frontend be responsible + for managing all frontend EH parameters, the backend routine only + needs to deal with backend values. type and value are no longer + passed to __throw. + (init_exception_processing): Likewise. + (expand_start_all_catch): Likewise. + (expand_end_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + +Tue Aug 29 15:04:36 1995 Jason Merrill + + * cp-tree.h (DECL_REAL_CONTEXT): Give the real declaration context + for a decl. + * decl.c (cp_finish_decl): Use it. + +Tue Aug 29 10:30:27 1995 Mike Stump + + * except.c (expand_internal_throw): Oops, almost forgot type and + value are now trees. + +Mon Aug 28 17:57:45 1995 Brendan Kehoe + + Fix the attribute handling to make sure they get noted before we + create the function's RTL, in case they can affect that. + * decl.c (grokfndecl): New arg ATTRLIST. Run + cplus_decl_attributes before creating the decl's rtl. + (grokdeclarator): New arg ATTRLIST, passed down into grokfndecl. + (shadow_tag, groktypename, start_decl, start_method): Pass a + NULL_TREE to grokdeclarator's new last arg. + * decl2.c (grokfield): New arg ATTRLIST, passed into grokdeclarator. + (grokbitfield, grokoptypename): Pass a NULL_TREE to + grokdeclarator's new last arg. + * except.c (expand_start_catch_block): Likewise. + * pt.c (process_template_parm, end_template_decl, + do_function_instantiation): Likewise. + * cp-tree.h (grokfield): Add arg. + (grokdeclarator): Move the prototype from here... + * decl.h: ...to here. + * lex.c (cons_up_default_function): Pass NULL_TREE to grokfield + ATTRLIST argument. + * parse.y: Create a list for the grokfield arg where appropriate, + and pass it down instead of calling cplus_decl_attributes. + +Mon Aug 28 15:07:24 1995 Mike Stump + + * except.c: Always allow turning on exception handling. Allow cross + compilations to use EH. + +Thu Aug 24 17:39:24 1995 Mike Stump + + * except.c (saved_pc, saved_throw_type, saved_throw_value): Use + trees, instead of rtxs, and don't depend on using special machine + dependent registers. + (expand_internal_throw): Likewise. + (init_exception_processing): Likewise. + (expand_start_all_catch): Likewise. + (expand_end_all_catch): Likewise. + (expand_start_catch_block): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + +Wed Aug 23 17:25:51 1995 Jason Merrill + + * cvt.c (build_expr_type_conversion): Handle conversions to + reference types. + +Wed Aug 23 15:33:59 1995 Mike Stump + + * except.c (do_unwind): Work around backend bug with -fpic. + +Tue Aug 22 17:20:07 1995 Per Bothner + + * decl2.c (flag_new_for_scope): Add a new mode that follows ANSI + for-scoping, but supports (and warns about) old programs. + Make the new mode (with value 1) the default. + (lang_f_options): The on-value for flag_new_for_scope is now 2. + * cp-tree.h (DECL_DEAD_FOR_LOCAL, DECL_ERROR_REPORTED): New macros + (DECL_SHADOWED_FOR_VAR): Likewise. + * decl.c (struct binding_level): New fields dead_vars_from_for + and is_for_scope. + (note_level_for_for): New function. + (poplevel): Special processing if is_for_scope. + (pushdecl): Warn if for-scope variable shadows local. + * lex.c (do_identifier): Handle old (non-ANSI) for scoping, + and warn if conflicts. + * parse.y (FOR): Call note_level_for_for. + +Mon Aug 21 10:28:31 1995 Jason Merrill + + * decl2.c (import_export_inline): Class interface hackery does not + apply to synthesized methods. + +Sun Aug 20 16:29:00 1995 Mike Stump + + * search.c (virtual_context): Find the right context more often. + Solves a `recoverable compiler error, fixups for virtual function' + problem. + +Sun Aug 20 13:53:24 1995 Mike Stump + + * except.c (expand_start_all_catch): Ensure that we always transfer + control to the right EH handler, by rethrowing the end label on the + region, instead of hoping we are nested and falling through. + (expand_leftover_cleanups): Likewise. + (end_protect): Since we now rethrow the end label, put a + nop after it, so that outer regions are recognized. + * init.c (build_vec_delete_1): New routine to handle most of vector + deleting, all code moved here from build_vec_delete. + (build_array_eh_cleanup): Use build_vec_delete_1 to do all the real + work. + (expand_vec_init): If the array needs partial destructing, setup an + EH region to handle it. + (build_vec_delete): Move lots of code to build_vec_delete_1, use + build_vec_delete_1 to do the grunt work. + +Sat Aug 19 14:25:33 1995 Brendan Kehoe + + Handle decl attributes properly for function definitions without + previous attribute-loaded declarations. + * decl.c (start_function): New arg ATTRS. Add a call to + cplus_decl_attributes with it before we create the RTL. + * cp-tree.h (start_function): Update prototype. + * parse.y (fn.def1): Pass ATTRS into start_function instead of + trying to call cplus_decl_attributes too late. Pass a NULL_TREE + for other use. + * decl2.c (finish_file): Pass NULL_TREE as fourth arg to + start_function. + * method.c (synthesize_method): Likewise. + * except.c (expand_builtin_throw): Likewise for start on __throw. + +Sat Aug 19 13:36:08 1995 Mike Stump + + * class.c (set_rtti_entry): Turn on -fvtable-thunk -frtti support. + This changes -fvtable-thunks vtable layout, so a recompile will be + necessary, if you use -fvtable-thunks. + (get_vtable_entry): Use n, instead of i to be consistent with the + rest of the compiler. + (get_vtable_entry_n): Likewise. + (add_virtual_function): Add a slot for the tdesc, if -fvtable-thunks + are being used. + (finish_struct_1): Likewise. + (skip_rtti_stuff): New routine to collapse similar code from many + different parts of the compiler. I think I got them all. + (modify_one_vtable): Use it. + (fixup_vtable_deltas1): Likewise. + (override_one_vtable): Likewise. + * decl2.c (mark_vtable_entries): Likewise. + * tree.c (debug_binfo): Likewise. + * search.c (expand_upcast_fixups): Likewise. + (get_abstract_virtuals_1): Likewise. Use virtuals, instead of tmp to + consistent with the rest of the compiler. + (get_abstract_virtuals): Likewise. + * cp-tree.h (skip_rtti_stuff): New routine, declare it. + * gc.c (build_headof): Support -fvtable-thunk and -frtti together. + (build_typeid): Likewise. + (build_classof): Remove old style way of doing rtti. Remove support + for `classof' and `headof'. + * gxx.gperf: Likewise. + * hash.h: Likewise. + * parse.y: Likewise. + +Fri Aug 18 17:31:58 1995 Jason Merrill + + * decl.c (start_function): Clear ctor_label and dtor_label. + + * class.c (finish_struct_1): Fix handling of access decls. + +Tue Aug 15 19:21:54 1995 Jason Merrill + + * class.c (finish_struct): Only do minimal processing here, so it + can be used for class template definitions, as well. + (finish_struct_1): New function with the rest of the code. + +Tue Aug 15 09:46:16 1995 Mike Stump + + * class.c (prepare_fresh_vtable): On second though, always build the + offset (see Aug 10 change), unless -fvtable-thunks is given. It + does this by calling the new routine set_rtti_entry. + (finish_struct): Likewise. + (set_rtti_entry): New routine to update the rtti information at the + start of the vtable. + +Mon Aug 14 12:21:22 1995 Brendan Kehoe + + * error.c (dump_decl, case IDENTIFIER_NODE): Only work on a dtor + if it's declared in the C++ language spec. + (dump_function_decl): Likewise. + (dump_function_name): Likewise. + (ident_fndecl): Make sure we got something back from lookup_name. + * decl.c (start_function): Likewise. + +Fri Aug 11 16:52:15 1995 Jason Merrill + + * call.c (build_method_call): Don't call build_new when calling a + constructor without an instance. + +Thu Aug 10 20:00:17 1995 Mike Stump + + * class.c (prepare_fresh_vtable): Always build the offset to the + complete object, as it doesn't cost much. This allows dynamic_cast + to void * to work when -frtti isn't given. + (finish_struct): Likewise. + +Thu Aug 10 16:31:28 1995 Mike Stump + + * except.c (build_eh_type): Split out some functionality to new + routine named build_eh_type_type. + (build_eh_type_type): New routine. + (expand_start_catch_block): Use build_eh_type_type, as we never want + the dynamic type of the catch parameter, just the static type. + Fixes core dumps when -frtti is used and one catchs pointers to + classes. + +Thu Aug 10 14:55:29 1995 Mike Stump + + * except.c (expand_builtin_throw): Since we now use normal calling + conventions for __throw, we have to remove the first layer off the + stack, so that the next context we search for handlers is the outer + context instead of the context that had the call to __throw, if we + don't immediately find the desired context. + +Tue Aug 8 17:44:23 1995 Jason Merrill + + * tree.c (cp_expand_decl_cleanup): Returns int, not tree. + * cp-tree.h: Update. + + * parse.y (template_type_parm): Add support for `typename'. + +Tue Aug 8 12:06:31 1995 Mike Stump + + * except.c (expand_internal_throw): New internal routine to throw a + value. + (expand_end_all_catch, expand_leftover_cleanups): All throwers + changed to use `expand_internal_throw' instead of jumping to throw + label. + (expand_end_catch_block, expand_throw): Likewise. + (throw_label): Removed. + (expand_builtin_throw): Changed so that EH parameters are passed by + normal function call conventions. Completes Aug 4th work. + +Fri Aug 4 17:17:08 1995 Mike Stump + + * cp-tree.h (expand_builtin_throw): Declare it. + * decl2.c (finish_file): Call expand_builtin_throw. + * except.c (make_first_label): Remove. + (init_exception_processing): Don't use a LABEL_REF for throw_label, + instead use a SYMBOL_REF, this is so that we don't use LABEL_REFs in + other functions that don't really appear in those functions. This + solves a problem where cc1plus consumed exponential amounts of + memory when -Wall was used. + (expand_end_all_catch, expand_leftover_cleanups, + expand_end_catch_block, expand_throw): Change all uses of + throw_label to match new style. + (do_unwind): Rename parameter to inner_throw_label, as it is now + different from throw_label. Also, assume that our caller will wrap + the passed label with a LABEL_REF, if needed. + (expand_builtin_throw): Make external, change so that the generated + throw is now a real function. + (expand_exception_blocks): Never generate throw code inside another + function. + +Fri Aug 4 12:20:02 1995 Mike Stump + + * decl.c (grokdeclarator): Move checking of mutable const objects + and mutable static objects down, as we might decide during parsing + to unset staticp or constp (for example, when const is part of the + object being pointed to). + +Thu Aug 3 17:13:43 1995 Mike Stump + + * except.c (output_exception_table_entry): Enhance portability to + weird machines. + (emit_exception_table): Likewise. + +Thu Aug 3 16:41:38 1995 Mike Stump + + * typeck.c (build_ptrmemfunc): Handle casting of pointer to + non-virtual member functions. + +Wed Aug 2 11:58:25 1995 Mike Stump + + * gc.c (build_typeid): Strip cv qualifiers so that const T&, T&, T + and const T all match. + +Wed Aug 2 11:25:33 1995 Mike Stump + + * except.c (build_eh_type): Strip cv qualifiers so that const T&, + T&, T and const T all match. + +Tue Aug 1 14:20:16 1995 Mike Stump + + * except.c: Fix up comments, cleanup code and eliminate exceptNode, + exceptStack, exceptstack, push_except_stmts, pop_except_stmts, + new_except_stack, push_last_insn, pop_last_insn, insn_save_node and + InsnSave. Also, numerous speed improvements, and correctness + improvements. Double faulting in all situations should now be + handled correctly. + (expand_start_all_catch): Instead of having many terminate protected + regions, just have one. + (expand_start_catch_block): No longer have to protect + false_label_rtx, as it isn't used for EH region marking. + (expand_end_catch_block): Expand out EH cleanups here by using + expand_leftover_cleanups. + (expand_end_all_catch): Use sequences instead of playing with insn + links directly. + (expand_exception_blocks): Likewise. Also protect all catch clauses + with one terminate region. + +Mon Jul 31 13:24:30 1995 Jason Merrill + + * method.c (report_type_mismatch): Don't talk about an object + parameter for non-methods. + +Sun Jul 30 13:13:02 1995 Jason Merrill + + * class.c (finish_struct): Catch private and protected members of + anonymous unions here. + * decl2.c (finish_anon_union): And here. + * parse.y: Instead of here. + + * errfn.c (ARGSLIST): Support passing four args. + * error.c (cv_as_string): New function. + (cp_printers): Add it. + * call.c (build_method_call): Report 'const' at end of pseudo-decl. + + * method.c (report_type_mismatch): Deal with a bad_arg of 0. + + * init.c (expand_aggr_init): Handle volatile objects, too. + +Sat Jul 29 13:42:03 1995 Jason Merrill + + * decl.c (struct binding_level): Keep list of incomplete decls. + (print_binding_level): Use list_length to count them. + (pushdecl): Build up the list. + (hack_incomplete_structures): Walk it and prune completed decls. + +Fri Jul 28 15:26:44 1995 Jason Merrill + + * typeck.c (comp_target_types): Don't check const and volatile for + function types. + (comp_ptr_ttypes_real): Likewise. + +Thu Jul 27 15:40:48 1995 Jason Merrill + + * typeck.c (comp_target_types): Fix. + +Thu Jul 27 15:10:48 1995 Mike Stump + + * cp-tree.h (unsave_expr_now, build_unsave_expr, + cp_expand_decl_cleanup): Declare new routines. + * decl.c (cp_finish_decl, store_parm_decls, + hack_incomplete_structures): Change all cals from + expand_decl_cleanup to cp_expand_decl_cleanup. + * gc.c (protect_value_from_gc): Likewise. + * expr.c (cplus_expand_expr): Handle UNSAVE_EXPRs. + * tree.c (unsave_expr): New routine to build an UNSAVE_EXPR. + (unsave_expr_now): Backend routine used by tree expander. + (cp_expand_decl_cleanup): Wrap second argument in an UNSAVE_EXPR to + work around a limitation in the backend. The backend uses the + cleanups multiple times, on disjoint control flows, so we cannot + pass unsaved SAVE_EXPRs to the backend. + * tree.def (UNSAVE_EXPR): New tree code. + * typeck.c (c_expand_return): Move goto/return code up inside + conditional, as we don't always want to do this, we only want to do + this when we don't otherwise finish with this control flow. + +Thu Jul 27 10:38:43 1995 Brendan Kehoe + + * parse.y (typespec): Only complain about typeof if we're not + getting it from a system header. + +Thu Jul 27 10:26:23 1995 Doug Evans + + Clean up prefix attribute handling. + * parse.y (reserved_declspecs): Link prefix attributes with declspecs. + (declmods): Likewise. + (all rules that reference typed_declspecs and declmods): Call + split_specs_attrs or strip_attrs to separate declspecs and attrs. + (lang_extdef): Delete resetting of prefix_attributes. + (template_def, notype_declarator rule): Use NULL_TREE for + prefix_attributes. + (condition): Use NULL_TREE for prefix_attributes. + (setattrs): Deleted. + (nomods_initdcl0): Set prefix_attributes to NULL_TREE. + (component_decl): Delete resetting of prefix_attributes. + (component_decl_1, notype_components rule): Use NULL_TREE for + prefix_attributes. + (simple_stmt): Delete resetting of prefix_attributes. + +Mon Jul 24 13:37:53 1995 Jason Merrill + + * call.c (convert_harshness): Deal with reference conversions before + others. Actually do array->pointer decay. Call comp_target_types + with pointer types rather than their targets. + + * typeck.c (comp_target_types): Avoid assigning D const * to B *. + +Mon Jul 24 08:54:46 1995 Brendan Kehoe + + * pt.c (to_be_restored): Move decl to global scope. + +Sat Jul 22 12:22:11 1995 Jason Merrill + + * decl.c (start_decl): Put back clearing of DECL_IN_AGGR_P. + +Fri Jul 21 17:09:02 1995 Jason Merrill + + * decl.c (grokdeclarator): Downgrade error about 'extern int A::i' + to pedwarn. + + * pt.c (instantiate_template): Also avoid instantiation if the + function has already been declared to be a specialization. + + * decl2.c (check_classfn): Ignore cname argument, and return the + matching function. + + * decl.c (start_decl): Handle declarations of member functions + outside of the class (i.e. specialization declarations). + +Thu Jul 20 10:34:48 1995 Jason Merrill + + * class.c (finish_struct): Don't mess with the type of bitfields. + + * various.c: s/TYPE_POINTER_TO/build_pointer_type/. + +Thu Jul 20 01:43:10 1995 Mike Stump + + * init.c (expand_aggr_init): Assume LOOKUP_ONLYCONVERTING if init + is not a parameter list (TREE_LIST). + (expand_default_init): If LOOKUP_ONLYCONVERTING is set, then set + LOOKUP_NO_CONVERSION so that we don't allow two-level conversions, + but don't set it otherwise. + +Wed Jul 19 20:32:01 1995 Mike Stump + + * init.c (expand_default_init): Don't allow two-level conversions + during construction. + +Wed Jul 19 18:06:37 1995 Mike Stump + + * gc.c (build_headof): The type of dyncasting to a pointer to cv + void, should be pointer to cv void. + +Wed Jul 19 17:25:43 1995 Mike Stump + + * gc.c (build_dynamic_cast): Allow casting in const. + +Wed Jul 19 16:34:27 1995 Mike Stump + + * typeck.c (build_const_cast): If we are passed error_mark_node, + return it. + +Wed Jul 19 15:24:48 1995 Brendan Kehoe + + * class.c (push_nested_class): Make sure TYPE is non-nil. + + * cvt.c (type_promotes_to): Watch for error_mark_node on the + incoming TYPE. + +Wed Jul 19 13:23:12 1995 Gerald Baumgartner + + * cp-tree.h (SIGTABLE_VT_OFF_NAME): Renamed from SIGTABLE_OFFSET_NAME. + (SIGTABLE_VB_OFF_NAME): New macro. + (vt_off_identifier): Renamed from offset_identifier. + (vb_off_identifier): Added extern declaration. + + * decl.c (vt_off_identifier): Renamed from offset identifier. + (vb_off_identifier): New variable to hold the identifier for the + sigtable field vb_off. + (init_decl_processing): Initialize vb_off_identifier. + Renamed vt_off_identifier from offset_identifier. + * sig.c (build_signature_method_call): Renamed offset_identifier and + local variable offset to vt_off_identifier and vt_off, respectively. + * sig.c (build_signature_table_constructor): Renamed offset to vt_off. + + * decl.c (init_decl_processing): Add vb_off field to + sigtable_entry_type. Reorder fields so that pfn gets properly + aligned at a 64 bit boundary on the Alpha. + * sig.c (build_signature_table_constructor): Build the constructor + according to the new layout. Set the vb_off field to -1 for now. + + * decl.c (init_decl_processing): Align sigtable_entry_type on word + boundaries instead of double word boundaries to save space. + +Tue Jul 18 16:58:37 1995 Mike Stump + + * cvt.c (cp_convert): Always call build_cplus_new for a ctor. + +Tue Jul 18 14:24:53 1995 Brendan Kehoe + + * parse.y (opt.component_decl_list): Only forbid private/protected + in anonymous unions. We need to make this know when the type is + defined for an object, to not give the error. + +Mon Jul 17 14:22:44 1995 Brendan Kehoe + + * parse.y (opt.component_decl_list): Don't allow access control + as private or protected for union members. + +Sun Jul 16 14:01:00 1995 Jim Wilson + + * lex.c (check_newline): For 'p' case, move goto skipline line to + before end brace for 'pragma'. + +Fri Jul 7 13:55:58 1995 Mike Stump + + * g++.1: Tiny updates. + +Fri Jul 7 13:05:20 1995 Mike Stump + + * decl.c (cp_finish_decl): Only destruct local static variables if + they are constructed, and only construct the first time control + passes completely through its declaration (if not initialized with a + constant-expression). + (expand_static_init): Likewise. + +Wed Jul 5 14:05:04 1995 Brendan Kehoe + + * typeck.c (comptypes, case OFFSET_REF): If either offset basetype + is a TEMPLATE_TYPE_PARM, give a match. + +Fri Jun 30 15:42:57 1995 Mike Stump + + * method.c (build_overload_value): Handle encoding of null pointer + constants (or any pointer with a constant numeric value) for + templates. + +Fri Jun 30 13:45:51 1995 Brendan Kehoe + + * call.c (convert_harshness): Add QUAL_CODE when we're faced with + const vs non-const for void conversions. + +Fri Jun 30 10:19:52 1995 Mike Stump + + * except.c (expand_start_all_catch): Fix problem with finding an + outer nested try block when there is no code to separate it from an + inner try block. + +Fri Jun 30 02:22:26 1995 Mike Stump + + * search.c (dfs_pushdecls): Consume 2 or 3 orders of magnitude less + memory please when virtual bases are used. + +Thu Jun 29 19:03:47 1995 Mike Stump + + * class.c (build_vbase_path): Avoid testing things that cannot be + null to see if they are null. + * cvt.c (convert_pointer_to_vbase): Remove code that doesn't work. + * decl.c (finish_function): Pass a type into the new + convert_pointer_to_vbase instead of a binfo. + * search.c (convert_pointer_to_vbase): Rewritten to use get_vbase + and convert_pointer_to_real. + (expand_indirect_vtbls_init): Use convert_pointer_to_vbase instead + of the more cryptic call to get_vbase. + +Thu Jun 29 09:35:05 1995 Mike Stump + + * decl.c (BOOL_TYPE_SIZE): Fix broken SLOW_BYTE_ACCESS check. + +Thu Jun 29 03:43:55 1995 Jason Merrill + + * pt.c (instantiate_template): Don't strip 'this' twice. + + * pt.c (coerce_template_parms): Allow null pointer constants. + + * decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is + set. + +Wed Jun 28 18:39:03 1995 Jason Merrill + + * decl.c (revert_static_member_fn): Also remove 'this' from + DECL_ARGUMENTS. + * decl2.c (check_classfn): Don't revert this function until we get a + match. + +Wed Jun 28 14:07:27 1995 Brendan Kehoe + + * parse.y (component_decl): Clear PREFIX_ATTRIBUTES here. + +Wed Jun 28 11:05:13 1995 Mike Stump + + * decl2.c (finish_file): Handle global vector news. + * init.c (build_new): Encode vector news so that later we will know + how many elements there are. + +Mon Jun 26 13:38:06 1995 Jason Merrill + + * expr.c (cplus_expand_expr): Don't mess with temp slots. + + * decl2.c (warn_if_unknown_interface): Don't crash if tinst_for_decl + returns null. + + * decl2.c (check_classfn): Use revert_static_member_fn. + * decl.c (revert_static_member_fn): Diagnose static member functions + declared const or volatile. + + * decl2.c (grokfield): Check for missing default args here, too. + (check_default_args): Function to do the checking. + * decl.c (pushdecl): Use it. + + * decl.c (pushdecl): Don't warn about shadowing a member of `this' + if there is no `this'. + +Sun Jun 25 11:34:25 1995 Jason Merrill + + * call.c (build_method_call): Downgrade 'called before definition' + to a warning, as it ought to go away after Monterey. + +Sat Jun 24 14:18:42 1995 Jason Merrill + + * pt.c (coerce_template_parms): Don't do extra checking on pointer + to member arguments. + + * class.c (finish_struct): const and reference members don't prevent + a class from being an aggregate. + + * class.c (finish_struct): Signatures are always aggregates. + +Fri Jun 23 17:20:29 1995 Jason Merrill + + * decl2.c (check_classfn): Improve error message. + + * pt.c (tsubst): Handle PROMOTE_PROTOTYPES. + +Thu Jun 22 01:50:42 1995 Jason Merrill + + * typeck.c (comptypes): Don't ignore method quals. + + * class.c (finish_struct): Non-abstract virtuals are always USED. + + * decl.c (build_ptrmemfunc_type): The underlying union type isn't + IS_AGGR_TYPE, either. + * class.c (finish_struct): Use CLASSTYPE_NON_AGGREGATE instead. + * cp-tree.h: Likewise. + + * cp-tree.h (lang_type): Add aggregate. + (CLASSTYPE_AGGREGATE): New macro. + (TYPE_NON_AGGREGATE_CLASS): Likewise. + * class.c (finish_struct): Determine whether a class is an + aggregate. + * decl.c (cp_finish_decl): Check TYPE_NON_AGGREGATE_CLASS instead of + TYPE_NEEDS_CONSTRUCTING. + * typeck2.c (digest_init): Check TYPE_NON_AGGREGATE_CLASS for + subobjects, too. + + * pt.c (tsubst, PARM_TYPE): Propagate DECL_ARTIFICIAL. + + * decl.c (start_function): For pre-parsed functions, layout all of + the parm decls again. + (grokvardecl): TREE_PUBLIC depends on DECL_THIS_EXTERN, not + DECL_EXTERNAL. + + * pt.c (coerce_template_parms): Improve checking for invalid + template parms. + +Wed Jun 21 12:01:16 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Forbid declaration of a static member + with the same name as its enclosing class. + +Mon Jun 19 10:28:14 1995 Jason Merrill + + * decl.c (finish_function): Clear current_class_decl. + + * typeck.c (build_conditional_expr): Use convert (boolean_type_node + instead of truthvalue_conversion. + + * class.c (finish_struct): A data member with the same name as the + class doesn't suppress constructors. + +Fri Jun 16 18:11:39 1995 Gerald Baumgartner + + * decl.c (start_function): If current_class_decl is a signature + pointer, don't dereference it but set C_C_D to current_class_decl. + +Fri Jun 16 17:06:28 1995 Jason Merrill + + * decl.c (duplicate_decls): Complain about virtual functions + redeclared to be inline. + +Fri Jun 16 13:20:38 1995 Mike Stump + + * decl.c (get_unique_name): New routine to name unnamed namespaces. + (push_namespace): Use get_unique_name for naming unnamed namespaces. + +Thu Jun 15 15:00:41 1995 Jason Merrill + + * parse.y: Call cplus_decl_attributes with prefix_attributes where + appropriate. + +Wed Jun 14 19:24:49 1995 Mike Stump + + * search.c (get_vbase): New routine to switch hierarchies from the + CLASSTYPE_VBASECLASSES to the normal one. + (expand_indirect_vtbls_init): Use get_vbase to figure out how we + want to convert to a vbase pointer. + +Mon Jun 12 17:50:30 1995 Jason Merrill + + * pt.c (instantiate_class_template): Add the new instantiation to + template_classes. + (do_pending_expansions): Call instantiate_member_templates on all of + the classes in template_classes. + +Mon Jun 12 12:36:59 1995 Mike Stump + + * decl.c (complete_array_type): Fill in the TYPE_DOMAIN of our + TYPE_MAIN_VARIANT if it is not filled in. + * init.c (build_delete): If the TYPE_DOMAIN is not set, give an + error instead of core dumping. + +Mon Jun 12 10:41:40 1995 Jason Merrill + + * call.c (can_convert): Also check for distance > 0. + (can_convert_arg): Likewise. + (user_harshness): Likewise. + +Fri Jun 9 19:17:21 1995 Jason Merrill + + * g++.c (MATH_LIBRARY): Provide default. + (main): Always link with the math library if we link with libstdc++. + + * decl.c (start_function): Complain about redefinition of a function + even when the pending_inline version is compiled after the other + version. + +Thu Jun 8 15:44:38 1995 Jason Merrill + + * gc.c (build_dynamic_cast): Build up a reference to a parameter of + aggregate type. + +Wed Jun 7 15:31:57 1995 Brendan Kehoe + + * init.c (build_vec_delete): Resolve an offset ref before we try to + use it. + +Wed Jun 7 14:19:32 1995 Jason Merrill + + * typeck.c (build_modify_expr): If the class lacks a constructor or + assignment operator, return error_mark_node. + (common_type): Use build_cplus_array_type. + +Tue Jun 6 09:41:27 1995 Mike Stump + + * class.c (dont_allow_type_definitions): New variable set when types + cannot be defined. + (finish_struct): Use it. + * cp-tree.h (dont_allow_type_definitions): Define it. + * parse.y (primary, handler_seq): Set it. + +Mon Jun 5 18:49:38 1995 Mike Stump + + * method.c (build_opfncall): Use DECL_CHAIN, not TREE_CHAIN for + results from lookup_fnfields. Always give warning/error on bad + code. + +Mon Jun 5 11:39:37 1995 Brendan Kehoe + + * init.c (member_init_ok_or_else): Don't allow initialization of + an ancestor's member from within a constructor. + +Mon Jun 5 11:20:34 1995 Gerald Baumgartner + + * sig.c (build_signature_table_constructor): Use DECL_CONTEXT + instead of DECL_CLASS_CONTEXT for calculating the vfield offset so + abstract virtual functions are handled correctly. + + * sig.c (build_signature_table_constructor): Store the correct + delta in signature table entries. It does not yet work for + classes with virtual base classes as implementations of signatures. + (build_signature_method_call): Add the delta to the object_ptr + before generating the function call. + + * call.c (build_method_call): Make instance_ptr the signature + pointer itself instead of dereferencing the optr. + * sig.c (build_signature_method_call): Dereference the optr for the + direct and virtual calls. + + * sig.c (build_signature_table_constructor): Make the tag for + default implementations -1 instead of 2. + (build_signature_method_call): Change the generated conditional + expression correspondingly. + + * sig.c (build_signature_pointer_constructor): Deleted the sorry + message that said we can't handle multiple inheritance for + implementations of signatures + (build_signature_method_call): Use the offset from the sigtable + entry instead of the vptr field from the signature pointer for + building a virtual function call. + + * class.c (build_vfn_ref): Deleted signature specific code, we don't + call this function anymore from build_signature_method_call. + + * cp-tree.h (SIGNATURE_VPTR_NAME): Deleted. We use the right vptr + field in the object now instead of in the signature pointer/ref. + (build_vptr_ref): Deleted extern declaration. + * sig.c (build_vptr_ref): Deleted. + (build_signature_pointer_or_reference_type): Deleted construction of + the vptr field. + (build_signature_pointer_constructor): Deleted initialization of/ + assignment to the vptr field. + + * sig.c (build_signature_table_constructor): Convert the signature + table entry fields to their correct types. + + * sig.c (build_signature_table_constructor): Don't call digest_init + for the fields of a sigtable entry, it's wasted time. + + * sig.c (build_signature_table_constructor): Correctly set the + offset and index fields of a sigtable entry. Build the constructor + the way digest_init does, digest_init can't handle initializing an + anonymous union inside a struct. + (build_signature_method_call): Use the index field instead of the + delta field to get the vtable index. + + * decl.c (init_decl_processing): Fix number of fields for building + sigtable_entry_type. + + * cp-tree.h (tag_identifier, offset_identifier): Added extern decls. + (SIGTABLE_CODE_NAME): Renamed to SIGTABLE_TAG_NAME. + (SIGTABLE_PFN_NAME): Deleted, we'll use VTABLE_PFN_NAME instead. + * decl.c (tag_identifier, offset_identifier): New variables to + hold the identifiers for the sigtable fields tag and offset. + (init_decl_processing): Initialize these variables. + (init_decl_processing): Use these variables to build the + sigtable_entry_type structure. Rename the code and offset fields + to tag and delta, respectively; add offset and index fields. Changed + types of fields from short_integer_type_node to delta_type_node. + * sig.c (build_signature_table_constructor): Rename code and offset + to tag and delta, respectively. + (build_signature_method_call): Likewise. Use above variables. + +Thu Jun 1 17:03:51 1995 Jason Merrill + + * decl.c (lookup_name_real): Don't try to look anything up in an + erroneous object. + +Fri Jun 2 10:30:14 1995 Mike Stump + + * method.c (build_overload_int): New routine. Break out + functionality from build_overload_value so we can reuse it. + (build_overload_value): Handle pointer to member functions as value + parameters for templates. + (build_overload_identifier): Since template parameters are shared + among all instantiations, we have to substitute in the real types + in TREE_TYPE (parm). + pt.c (coerce_template_parms): Likewise. + (push_template_decls): Likewise. + (grok_template_type): Deleted as template parameters are shared + among all instantiations. + +Wed May 31 19:10:32 1995 Mike Stump + + * decl.c (grokdeclarator): Always give errors on constant overflow + for array indices. + +Wed May 31 11:39:43 1995 Jason Merrill + + * typeck.c (commonparms): Don't abort if simple_cst_equal returns < 0. + (build_c_cast): Don't tack on a NON_LVALUE_EXPR when casting to + reference type. + (build_indirect_ref): Fix check for *&. + +Fri Jun 16 06:54:03 1995 Mike Stump + + * Version 2.7.0 released. + +Fri Jun 16 15:07:29 1995 Richard Kenner + + * Make-lang.in (DEMANGLER_PROG): Add LIBS. + +Thu Jun 15 15:00:41 1995 Jason Merrill + + * decl.c (define_function): Don't set DECL_INTERFACE_KNOWN. + +Wed Jun 7 20:00:31 1995 Mike Stump + + * *.[chy]: Change all callers of finish_decl to cp_finish_decl. + * decl.c (finish_decl): New routine to handle call backs from the + mid end (declare_hidden_char_array). + +Wed Jun 7 19:02:50 1995 Jason Merrill + + * decl.c (start_function): Handle setting C_C_D here. + (set_C_C_D): Removed. + (struct saved_scope): Remove class_decl. + (push_to_top_level): Don't save current_class_decl. + (pop_from_top_level): Don't restore current_class_decl or C_C_D. + (struct cp_function): Add C_C_D. + (push_cp_function_context): Save C_C_D. + (pop_cp_function_context): Restore C_C_D. + +Fri Jun 2 11:05:58 1995 Jason Merrill + + * decl.c (set_C_C_D): New function. suspend_momentary before + building C_C_D. + (pop_from_top_level): Call it. + (start_function): Likewise. + (pop_cp_function_context): Likewise. + + * class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references + to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR. + + * decl.c (push_cp_function_context): Save current_class_decl. + (pop_cp_function_context): Restore current_class_decl and set C_C_D. + (pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D. + (start_function): Likewise. + + * class.c (popclass): Don't mess with current_class_decl, + current_vtable_decl, or C_C_D. + +Mon May 29 12:45:10 1995 Paul Eggert + + * Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG). + +Wed May 24 15:55:18 1995 Richard Kenner + + * decl.c (duplicate_decls): Check simple_cst_equal result against 0. + * decl2.c (finish_anon_union): Likewise. + * method.c (largest_union_member): Likewise. + +Wed May 24 14:41:11 1995 H.J. Lu + + * Make-lang.in (cxxmain.o): Replace single quotes with backslashes. + +Mon May 22 17:38:48 1995 Richard Kenner + + * Make-lang.in (g++, g++-cross, cc1plus, DEMANGLER_PROG): + Use $@ instead of output name so works even if have .exe. + (cxxmain.o): Use cp if ln -s fails. + (c++.install-man): Use $(exeext) in executable names. + (c++.mostlyclean, stage[1-4]): Use $(objext) in object file names. + * Makefile.in (../cc1plus): Use $(exeext) in name of executable. + +Wed May 24 01:39:03 1995 Jason Merrill + + * call.c (build_method_call): Parms can be null, duh. + +Tue May 23 01:32:09 1995 Jason Merrill + + * call.c (build_method_call): If convert_arguments failed, just bail. + +Fri May 19 10:31:11 1995 Jason Merrill + + * cvt.c (convert_force): Pass LOOKUP_NORMAL to cp_convert. + + * tree.c (copy_to_permanent): Oops. + +Fri May 19 10:01:07 1995 Brendan Kehoe + + * cp-tree.h (break_out_target_exprs): Add decl. + +Thu May 18 13:02:30 1995 Jason Merrill + + * decl.c (start_function): Move *all* interface handling stuff after + the pushdecl. + + * tree.c (mapcar): Renamed from make_deep_copy and generalized. + (perm_manip): Return t if permanent, otherwise 0. + (copy_to_permanent): Use them. + (bot_manip): Helper for break_out_target_exprs. + (break_out_target_exprs): New function. Uses mapcar. + + * typeck.c (convert_arguments): Use it. + + * method.c (hack_identifier): Use convert_from_reference to + dereference a reference. + +Wed May 17 17:54:54 1995 Mike Stump + + * call.c (convert_harshness): Move reference bashing before pointer + to member bashing. + +Wed May 17 16:57:53 1995 Mike Stump + + * cvt.c (convert_to_reference): Only complain, if complaints are + wanted. + * typeck.c (build_function_call_real): Likewise. If + LOOKUP_SPECULATIVELY is set and something won't work, return + NULL_TREE. + * cvt.c (cp_convert): Likewise. Pass flags down to build_method_call. + (convert): Pass LOOKUP_NORMAL to cp_convert. + * typeck.c (convert_for_assignment): Likewise. + (convert_force): Pass LOOKUP_COMPLAIN to cp_convert. + (convert_arguments): Get out early if we get an error_mark_node. + (convert_for_initialization): Use cp_convert instead of convert so + that we can pass flags down. + * cp-tree.h (LOOKUP_SPECULATIVELY): Added documentation. + +Wed May 17 01:43:58 1995 Jason Merrill + + * typeck2.c (store_init_value): Don't take the MAIN_VARIANT of the + decl type. + + * class.c (finish_struct): Don't complain about a class with no + user-defined constructors but with a member that has no default + constructor, as this is OK for aggregates. + + * expr.c (cplus_expand_expr, NEW_EXPR): If this is an explicit + constructor call, mark slot addressable. + +Tue May 16 18:37:51 1995 Douglas Rupp + + * g++.c: Changed WINNT to _WIN32. + +Tue May 16 12:40:16 1995 Jason Merrill + + * lex.c (handle_sysv_pragma): Don't use token_buffer. + +Tue May 16 12:05:26 1995 Mike Stump + + * call.c (resolve_scope_to_name): Add initial semantic support for + namespaces. + * class.c (finish_struct): Likewise. + * cp-tree.h (NAMESPACE_LEVEL): Likewise. + * cvt.c (build_up_reference, convert_to_reference): Likewise. + * decl.c (binding_level::namespace_p, suspend_binding_level): Likewise. + (resume_binding_level, toplevel_bindings_p): Likewise + (namespace_bindings_p, declare_namespace_level): Likewise. + (resume_level, push_namespace, pop_namespace): Likewise. + (pop_everything, pushtag, duplicate_decls, pushdecl): Likewise. + (implicitly_declare, lookup_namespace_name): Likewise. + (lookup_name_real, start_decl, make_temporary_for_reference): Likewise. + (obscure_complex_init, finish_decl, expand_static_init): Likewise. + (grokvardecl, grokdeclarator, parmlist_is_exprlist): Likewise. + (store_parm_decls, hack_incomplete_structures): Likewise. + * decl2.c (get_temp_name, finish_anon_union): Likewise. + (current_namespace, push_namespace, pop_namespace): Likewise. + (do_namespace_alias, do_toplevel_using_decl): Likewise. + (do_class_using_decl): Likewise. + * error.c (dump_decl): Likewise. + * init.c (build_member_call, build_offset_ref): Likewise. + * lex.c (identifier_type): Likewise. + * parse.y (lang_extdef, using_decl, extdef): Likewise. + (component_decl_1, nested_name_specifier_1): Likewise. + * spew.c (yylex): Likewise. + * tree.def (NAMESPACE_DECL): Likewise. + +Tue May 16 11:55:35 1995 Jason Merrill + + * decl.c (push_overloaded_decl): Return the new decl even if it + can't be pushed. + +Tue May 16 11:00:37 1995 Jason Merrill + + * typeck.c (decay_conversion): Split out from default_conversion. + (default_conversion): Call it. + (build_binary_op): Likewise. + (build_binary_op_nodefault): Use decay_conversion for truth ops. + +Mon May 15 12:47:56 1995 Jason Merrill + + * decl.c (warn_extern_redeclared_static): This is a pedwarn. + (duplicate_decls): Always use the old decl's linkage info. Don't + play with linkage of consts. + (pushdecl): Don't play with linkage of consts. + (redeclaration_error_message): Don't complain about an old public + decl and a new non-public decl here. + (grokvardecl): Handle linkage of consts here. + (grokdeclarator): An 'extern inline' is public. Pass constp to + grokvardecl. + (start_function): Wait until after the pushdecl to do some linkage + stuff. + + * decl2.c (import_export_vtable): Make duplicates weak rather than + static if supported. + (import_export_inline): Likewise. + * pt.c (do_pending_expansions): Likewise. + + * class.c (build_vbase_path): flag_assume_nonnull_objects only + affects reference conversion. + + * init.c (emit_base_init): Build up an RTL_EXPR and add it to + rtl_expr_chain. + * decl.c, decl2.c: s/base_init_insns/base_init_expr/. + +Tue May 16 07:06:28 1995 Paul Eggert + + * method.c (numeric_output_need_bar): Renamed from misspelling. + + * typeck.c (build_ptrmemfunc): Fix misspellings in messages. + +Sun May 14 10:26:22 1995 Richard Kenner + + * lang-options.h, lang-specs.h: New files. + +Thu May 11 00:31:48 1995 Jason Merrill + + * typeck.c (default_conversion): Don't check for BLKmode before + pulling out the decl_constant_value. + + * decl.c (start_function): Clear named_labels and shadowed_labels. + + * typeck.c (build_function_call_real): Also synthesize methods here. + +Wed May 10 00:55:59 1995 Jason Merrill + + * decl2.c (finish_file): Synthesize exported methods before the + reconsider loop. + + * parse.y: Move declaration of flag_new_for_scope to file scope. + +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. + +Mon May 8 12:41:52 1995 Jason Merrill + + * decl.c (define_function): Mark function decl artificial. + +Sun May 7 00:51:28 1995 Jason Merrill + + * parse.y (simple_stmt, FOR): Put back push/pop for condition scope. + + * decl2.c (grokclassfn): DECLs don't have cv-qualified types. + * tree.c (build_cplus_method_type): Likewise. + + * cp-tree.h (SET_DECL_ARTIFICIAL): Just set DECL_ARTIFICIAL to 1. + + * typeck.c (build_function_call_real): If convert_arguments failed, + just bail. + (convert_arguments): If one of the arguments is error_mark_node, + just bail. + +Sat May 6 02:39:41 1995 Jason Merrill + + * decl.c (duplicate_decls): Don't check DECL_NOT_REALLY_EXTERN for + decls that don't include it. + +Fri May 5 14:23:30 1995 Jason Merrill + + * decl.c (duplicate_decls): Decls that have DECL_INTERFACE_KNOWN or + DECL_NOT_REALLY_EXTERN set aren't extern decls. + + * typeck.c (build_indirect_ref): Don't call default_conversion for a + parameter of reference_type. + * cvt.c (convert_from_reference): Just use build_indirect_ref. + + * pt.c (do_type_instantiation): Only instantiate member functions + that actually come from templates. + +Fri May 5 09:46:05 1995 Mike Stump + + * parse.y: Generalized cleanup of poplevels, and compound statements + and compound statements in try blocks. Rewritten `for' rule so that + the scope of variables declared in the for clause is shortened to + span just to the end of the statement, instead of the whole + containing block. + +Fri May 5 00:37:14 1995 Jason Merrill + + * call.c (convert_harshness): Handle pointers to members better. + +Thu May 4 16:00:26 1995 Jason Merrill + + * decl2.c (delete_sanity): Do access control here. + * init.c (build_delete): Instead of here. + + * Make-lang.in: Build c++filt. + +Wed May 3 02:59:53 1995 Jason Merrill + + * decl2.c (cplus_decl_attributes): If we just modified a TYPE_DECL, + update our IDENTIFIER_TYPE_VALUE. + +Fri Apr 28 07:58:41 1995 Jason Merrill + + * lex.c (cons_up_default_function): Fix linkage of #pragma + implemented functions. + +Thu Apr 27 16:56:24 1995 Jason Merrill + + * method.c (build_overload_name): Simplify and fix repeated type + folding. + + * decl.c (grokdeclarator): Prohibit pointers to void or reference + members. + +Thu Apr 27 09:49:07 1995 Mike Stump + + * typeck2.c (process_init_constructor): Make sure initializers are + fully digested. + +Thu Apr 27 01:11:55 1995 Jason Merrill + + * lex.c (cons_up_default_function): Always defer synthesis. + +Thu Apr 27 00:20:37 1995 Jason Merrill + + * decl2.c (mark_inline_for_output): Don't play with pending_inline + stuff. + +Wed Apr 26 17:48:24 1995 Jason Merrill + + * call.c (user_harshness): New function; like build_type_conversion, + but doesn't actually build anything. + (compute_conversion_costs): Use it instead of build_type_conversion. + +Wed Apr 26 17:11:25 1995 Jason Merrill + + * typeck.c (build_function_call_real): Improve error message for + calling a non-function. + + * method.c (hack_identifier): Lose check for calling a data member. + +Wed Apr 26 16:59:13 1995 Mike Stump + + * typeck2.c (build_functional_cast): Remove very old cruft. + Seems like good code is generated without it. + +Wed Apr 26 00:47:16 1995 Jason Merrill + + * method.c (do_build_assign_ref): Fix handling of anonymous unions. + (do_build_copy_constructor): Likewise. + + * parse.y (simple_stmt, SWITCH): Call {push,pop}_switch. + + * decl.c (push_switch): New function. + (pop_switch): Likewise. + (define_case_label): Check for jumping over initialization. + + * call.c (build_method_call): Check for an inline function being + called before its definition has been seen. + * typeck.c (build_function_call_real): Likewise. + + * decl.c (duplicate_decls): Check for a function being redeclared + inline after its address has been taken. + + * typeck.c (build_conditional_expr): Handle related class lvalues. + +Tue Apr 25 13:20:45 1995 Jason Merrill + + * pt.c (do_pending_expansions): Don't expand unused templates. + + * parse.y (component_decl): Accept a lone semicolon. + +Tue Apr 25 00:25:56 1995 Jason Merrill + + * call.c (build_method_call): Don't allow an RTL_EXPR to serve as the + object parameter anymore. + + * expr.c (cplus_expand_expr): Don't create RTL_EXPRs with no insns. + +Mon Apr 24 12:35:48 1995 Jason Merrill + + * parse.y (simple_stmt, decl case): Clear prefix_attributes. + (lang_extdef): Likewise. + + * parse.y (maybe_parmlist): New rule for use in declarators where + this could either be a list of expressions or parameters. Calls + suspend_momentary before deciding which. + (direct_after_type_declarator): Use it. + (complex_direct_notype_declarator): Use it. + + * pt.c (tsubst): Propagate attributes const and noreturn. + + * typeck.c (build_modify_expr): If warn_synth, call build_opfncall + before doing the default thing. + +Thu Apr 27 21:49:36 1995 Doug Evans + + * typeck.c (common_type): Call lookup_attribute instead of + value_member. + +Tue Apr 25 18:07:43 1995 Richard Kenner + + * Make-lang.in: Change "realclean" to "maintainer-clean". + +Sun Apr 23 12:32:38 1995 Mike Stump + + * decl2.c (finish_file): Fix broken linked list handling. + +Fri Apr 21 18:08:43 1995 Jason Merrill + + * class.c (finish_base_struct): Don't set TYPE_HAS_COMPLEX_*_REF + as often. + (finish_struct): Likewise. + + * various: Use TYPE_HAS_TRIVIAL_* instead of TYPE_HAS_COMPLEX_*. + + * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): New macro. + (TYPE_HAS_TRIVIAL_ASSIGN_REF): New macro. + +Fri Apr 21 15:52:22 1995 Jason Merrill + + * typeck.c (c_expand_return): Only expand a returned TARGET_EXPR if + it is of the same type as the return value. + +Fri Apr 21 03:01:46 1995 Jason Merrill + + * decl2.c (finish_file): Reconsider if synthesizing a method wrote + out its assembly. + + * typeck.c (convert_for_initialization): Don't call a trivial copy + constructor. + + * typeck2.c (store_init_value): Only abort if the type has a + non-trivial copy constructor. + + * typeck.c (c_expand_return): If we're returning in a register and + the return value is a TARGET_EXPR, expand it. Only do + expand_aggr_init if we're returning in memory. + (expand_target_expr): Function to expand a TARGET_EXPR. + (build_modify_expr): Use it. + + * tree.c (build_cplus_new): Layout the slot. + + * expr.c (cplus_expand_expr): Use expand_call to expand the call + under a NEW_EXPR, so the target is not discarded. + +Thu Apr 20 14:59:31 1995 Mike Stump + + * gc.c (build_dynamic_cast): Tighten error checking. + +Thu Apr 20 11:23:54 1995 Jason Merrill + + * expr.c (cplus_expand_expr): Only abort if the returned target is + different from what we expected if the type has a non-trivial copy + constructor. + + * decl2.c (cplus_decl_attributes): Attributes applied to a template + really apply to the template's result. + + * tree.c (lvalue_p): Check IS_AGGR_TYPE instead of TREE_ADDRESSABLE + to decide whether to consider a CALL_EXPR an lvalue. + + * class.c (finish_struct_bits): Only set TREE_ADDRESSABLE if the + type has a non-trivial copy constructor. + + * decl.c (start_function): If interface_known, unset + DECL_NOT_REALLY_EXTERN on the function. + +Wed Apr 19 16:53:13 1995 Jason Merrill + + * pt.c (do_function_instantiation): Handle explicit instantiation of + member functions. + (do_type_instantiation): Handle 'inline template class foo', + meaning just spit out the vtable. + + * lex.c (cons_up_default_function): Set DECL_NOT_REALLY_EXTERN on + the consed functions. + + * decl2.c (import_export_inline): Set DECL_INTERFACE_KNOWN. + +Wed Apr 19 16:28:17 1995 Brendan Kehoe + + * call.c, class.c, decl2.c, gc.c, init.c, parse.y, pt.c, search.c, + typeck.c: Include output.h. + +Wed Apr 19 14:57:21 1995 Gerald Baumgartner + + * call.c (build_method_call): Allow a signature member functions to + be called from a default implementation. + +Wed Apr 19 10:21:17 1995 Jason Merrill + + * repo.c (finish_repo): Remember what directory we are in. + + * search.c (expand_upcast_fixups): Don't mess with abort_fndecl. + + * repo.c: Use obstacks instead of fixed-size buffers. Don't spit + out the second copy of the symbol name. Don't remember COLLECT_GCC. + +Wed Apr 19 02:32:40 1995 Mike Stump + + * search.c (virtual_context): New function to get the virtual + context of a function. + (expand_upcast_fixups): New function to generate runtime vtables. + (fixup_virtual_upcast_offsets): Likewise. + (expand_indirect_vtbls_init): Use fixup_virtual_upcast_offsets to + ensure that the this offsets for upcasts from virtual bases into + other virtual bases or non-virtual bases are correct at construction + time and destruction time. + * class.c (fixup_vtable_deltas): Modify to fixup all offsets in all + vtables in all virtual bases, instead of just one vtable in each + virtual base. + (fixup_vtable_deltas1): Likewise. + +Tue Apr 18 03:57:35 1995 Michael Meissner + + * Makefile.in (lex.o): Add dependency on c-pragma.h. + + * lex.c (handle_sysv_pragma): Use NULL_PTR and NULL_TREE as + appropriate, instead of 0. + +Mon Apr 17 12:28:42 1995 Jason Merrill + + * decl.c (pushdecl): Use decls_match, not duplicate_decls, for + comparing local and global decls. + +Fri Apr 14 01:46:52 1995 Jason Merrill + + * typeck.c (convert_arguments): Only prohibit passing to ... of + types with non-trivial copy constructors. + + * repo.c (repo_template_used): Don't try to mess with no id. + +Fri Apr 14 23:32:50 1995 Per Bothner + + * decl.c (duplicate_decls): Use cp_warning_at for redundant-decls. + +Thu Apr 13 15:37:42 1995 Brendan Kehoe + + * cp-tree.h (current_tinst_level): Delete declaration, since it's + static inside pt.c. + + * typeck.c (build_modify_expr): Catch incompatible array assignment. + + * parse.y (attribute_list, attrib): Rewrite actions to feed the + right stuff to decl_attributes. + +Thu Apr 13 11:24:10 1995 Jason Merrill + + * search.c (dfs_debug_mark): Check for magic virtual like + import_export_vtable. + + * typeck.c (build_binary_op_nodefault): Don't call cp_pedwarn with + four args. + +Wed Apr 12 12:02:57 1995 Jason Merrill + + * decl2.c (finish_file): Move prevtable pass before needs_messing_up + decision. + +Tue Apr 11 11:20:27 1995 Jason Merrill + + * decl.c (finish_decl): If we're writing out a static data member of + a class, we want the debug info for that class. + + * gc.c (build_t_desc): Check linkage of a class properly. + + * class.c (finish_struct): Set the 'headof' offset for the main + vtable properly. + (prepare_fresh_vtable): Fix typeinfo pointer here. + (modify_one_vtable): Instead of here. + +Mon Apr 10 12:15:59 1995 Jason Merrill + + * repo.c (repo_get_id): New function to return the interesting + identifier for a repo entity. + (repo_template_used): Use it. + (repo_template_instantiated): Mark the id as chosen. + (init_repo): Record whether or not the id was chosen. + (finish_repo): Note if an id was newly chosen. + + * pt.c (do_function_instantiation): Call repo_template_instantiated. + (do_type_instantiation): Likewise. Don't diagnose multiple + instantiation. + + * decl2.c (finish_file): Use DECL_NOT_REALLY_EXTERN when deciding + whether or not to synthesize a method. + + Undo these changes: + * class.c (finish_vtbls): Build more vtables if flag_rtti is on. + * class.c (modify_all_direct_vtables): Likewise. + * init.c (expand_direct_vtbls_init): Expand more vtables if + flag_rtti is on. + +Sat Apr 8 17:45:41 1995 Mike Stump + + * gc.c (build_headof): Use ptrdiff_type_node instead of + integer_type_node on pointer arithmetic. + +Sat Apr 8 11:57:04 1995 Jason Merrill + + * typeck.c (build_modify_expr): Undo previous change. + +Thu Apr 6 01:23:50 1995 Jason Merrill + + * Makefile.in (compiler): Remove ../cc1plus before rebuilding it. + + * repo.c (get_base_filename): Put the .rpo file in the directory + with the object file, not the source. + + * typeck.c (build_conditional_expr): Handle pmf's better. + + * repo.c (finish_repo): Also use ASM_OUTPUT_LABELREF to print out + the name of the symbol. + +Wed Apr 5 15:24:12 1995 Jason Merrill + + * repo.c (open_repo_file): Make repo filename DOS-compliant. + (*): Also write a new repo file if some previously-used + templates are no longer used. Only remember the identifier. + + * lex.c (cons_up_default_function): If this function belongs to a + template class, call repo_template_used for it. + + * repo.c (repo_template_used): Using a class means using its vtable, + if any. + (finish_repo): Likewise. + + * typeck.c (build_modify_expr): Only wrap TARGET_EXPRs in RTL_EXPRs + if the type has a complex copy constructor. + + * decl2.c (lang_decode_option): -frepo implies + -fno-implicit-templates. + + * decl.c (start_function): Clear current_{base,member}_init_list. + + * lex.c (init_lex): Also unset *_eq if ! flag_operator_names. + +Tue Apr 4 16:11:08 1995 Jason Merrill + + * decl.c (struct cp_function): Add {base,member}_init_list. + (push_cp_function_context): Save current_{base,member}_init_list. + (pop_cp_function_context): Restore them. + +Mon Apr 3 16:55:08 1995 Jason Merrill + + * repo.c (get_base_filename): Take filename parm, fix logic bug. + + * typeck.c (build_compound_expr): Do not warn about a compound expr + in which the first expression has no side effects. + (build_x_compound_expr): Warn here instead. + (build_conditional_expr): Don't warn about a conditional expression + between an enum and the type it promotes to. + + * init.c (build_new): Handle initialization of arrays of builtins + properly. + +Mon Apr 3 15:08:04 1995 Brendan Kehoe + + * repo.c: Include config.h to get definitions of bcopy and rindex + on systems that don't have them (e.g., SVR4). + +Mon Apr 3 14:41:55 1995 Mike Stump + + * decl2.c (finish_table): Pass NULL_TREE instead of init to + finish_decl so that it won't try and do error checking on the + initializer. + +Mon Apr 3 10:45:50 1995 Jason Merrill + + * repo.c (get_base_filename): Analyze COLLECT_GCC_OPTIONS to + determine whether this compile used -c -o. + (open_repo_file): Use get_base_filename. Remove the extension. + (finish_repo): Spit out the values of main_input_filename, + COLLECT_GCC and COLLECT_GCC_OPTIONS. + + * parse.y (structsp): Add TYPENAME_KEYWORD complex_type_name. + +Sun Apr 2 23:43:51 1995 Jason Merrill + + * search.c (compute_access): Don't try to do access control on + nested types. + +Fri Mar 31 10:14:23 1995 Jason Merrill + + * repo.c: New file to handle things repo. + + * pt.c (instantiate_template): Call repo_template_used if the + definition is accessible. + (mark_function_instantiated): Split out from + do_function_instantiation. + (mark_class_instantiated): Split out from do_type_instantiation. + + * parse.y (template_instantiate_once): Call repo_template_used. + + * lex.c (lang_init): Call init_repo. + + * decl2.c: Handle flag_use_repository. + (finish_file): Call finish_repo. + + * decl.c (start_method): Call repo_template_used if this is a + template method. + + * Makefile.in (CXX_OBJS): Add repo.o. + (repo.o): Add dependencies. + + * Make-lang.in (CXX_SRCS): Add repo.c. + + * decl.c (start_function): If DECL_INTERFACE_KNOWN and + DECL_NOT_REALLY_EXTERN are both set, unset DECL_EXTERNAL. + + * typeck.c (build_binary_op_nodefault): Identify the invalid operand + types used. + + * decl.c (duplicate_decls): Propagate DECL_NOT_REALLY_EXTERN. + +Thu Mar 30 17:54:42 1995 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Tidy up use of build_type + and result_type. When checking for comparison between signed + and unsigned, use result_type rather than the (possibly shortened) + type of op0. Also, don't warn about equality comparison of a + signed operand to an unsigned constant that fits in the signed + type. + + * method.c (do_build_copy_constructor): Reverse + current_base_init_list after we've built it up. + +Thu Mar 30 14:35:18 1995 Mike Stump + + * except.c (build_throw): Never warn about the value of throw not + being used. + +Thu Mar 30 13:16:54 1995 Mike Stump + + * except.c (expand_start_catch_block): Check for bad catch parameter + declarations. + +Thu Mar 30 13:06:11 1995 Jason Merrill + + * decl.c (finish_function): Only set DECL_NOT_REALLY_EXTERN if + DECL_EXTERNAL is not already set. + +Thu Mar 30 11:26:24 1995 Mike Stump + + * method.c (emit_thunk): Let poplevel know that the last level is + for a function so it can create a BLOCK_NODE and set DECL_INITIAL. + +Thu Mar 30 11:15:06 1995 Jason Merrill + + * decl2.c (import_export_inline): Don't set DECL_NOT_REALLY_EXTERN + here. + + * decl.c (grokdeclarator): OK, don't abort if we see a decl with + METHOD_TYPE. + (finish_function): Set DECL_EXTERNAL and DECL_NOT_REALLY_EXTERN on + all deferred inlines. + +Wed Mar 29 19:35:02 1995 Jason Merrill + + * cp-tree.h (DECL_THIS_INLINE): New macro. + (DECL_NOT_REALLY_EXTERN): New macro. + (DECL_THIS_STATIC): New macro. + + * decl.c: Lose all references to current_extern_inline. Break + inline semantics into DECL_INLINE for actual inlining and + DECL_THIS_INLINE for the linkage wierdness. Use DECL_THIS_STATIC. + * decl2.c: Use DECL_NOT_REALLY_EXTERN to indicate that we want to + emit an inline here. Associated changes. + * lex.c: Likewise. + * pt.c: Likewise. + * typeck.c: Likewise. + + * call.c (build_method_call): Don't bother trying to handle inlines + specially. + * cvt.c (convert_to_aggr): Likewise. + + * pt.c (do_function_instantiation): Handle instantiation of + public inlines, too. + +Wed Mar 29 16:04:25 1995 Mike Stump + + * except.c (init_exception_processing): Change the interface for + __throw_type_match and add decl for new rtti matching routine + __throw_type_match_rtti. + (build_eh_type): New routine to build a run time descriptor for the + expression given. + (expand_start_catch_block): Update to use new calling convention for + the matcher. + (expand_throw): Update to use build_eh_type. + +Mon Mar 27 07:14:33 1995 Warner Losh + + * g++.c: Removed __NetBSD__ from conditional. + Declare strerror if HAVE_STRERROR is defined; otherwise + declare sys_errlist and sys_nerr. + (my_strerror): New function. + +Tue Mar 28 14:16:35 1995 Jason Merrill + + * search.c (get_binfo): Don't try to be so clever. + + * tree.c (copy_to_permanent): Also suspend_momentary(). + + * cvt.c (cp_convert_to_pointer): Hand off to convert_fn_pointer even + if the types are the same. + + * decl.c (start_function): Handle extern inlines more like C++ says + we should. + + * init.c (build_member_call): Hand constructor calls off to + build_functional_cast. + + * typeck2.c (build_functional_cast): Use DECL_NESTED_TYPENAME to get + the name of the type. + +Tue Mar 28 13:13:56 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Check for the decl returned by + grokfndecl to be null before using build_decl_attribute_variant. + +Mon Mar 27 18:04:41 1995 Brendan Kehoe + + * init.c (build_new): Use build_pointer_type instead of + TYPE_POINTER_TO. + +Fri Mar 24 12:11:24 1995 Jason Merrill + + * typeck.c (build_conditional_expr): Handle pmfs. + (convert_for_assignment): Fix pmf support. + + * cvt.c (convert_fn_ptr): Support !flag_vtable_thunks. + (cp_convert_to_pointer): Handle pmfs. + (cp_convert): Pass pmfs to cp_convert_to_pointer. + + * typeck.c (common_type): Handle inheritance for pmfs. + + * typeck2.c (build_m_component_ref): Do access control. + + * typeck.c (comp_target_types): Check for conversion to void * + before checking trickier conversions. + + * decl.c (duplicate_decls): Propagate DECL_ABSTRACT_VIRTUAL_P. + + * pt.c (push_tinst_level): Complain if template instantiation depth + is greater than max_tinst_depth. + + * typeck.c (common_type): Assume that we can call common_type to + unify the target type of a pointer. + +Thu Mar 23 00:48:44 1995 Jason Merrill + + * decl2.c (finish_file): Don't synthesize methods at + finish_vtable_prevardecl time. Do synthesize methods that are not + used, but are public and not external. + + * cvt.c (build_type_conversion): Only give an error if for_sure. + + * typeck.c (comp_target_types): Only support pointer conversions if + nptrs > 0. + +Wed Mar 22 19:30:15 1995 Brendan Kehoe + + * init.c (build_new): Catch use of an initializer list where it + shouldn't be. + +Wed Mar 22 16:21:07 1995 Jason Merrill + + * init.c (build_new): Wrap alloc_expr in an RTL_EXPR if nelts is + non-constant. + + * decl2.c: temp_name_counter is now public. + + * decl.c (struct cp_function): Add temp_name_counter field. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + + * typeck.c (common_type): Handle unifying function types, and unify + unmatched things to void* with a compiler_error, rather than + silently like before. + +Wed Mar 22 15:10:34 1995 Mike Stump + + * decl2.c (finish_prevtable_vardecl, finish_vtable_vardecl): Revert + Brendan's last change and fix latent problem that causes TD entries + to not come out when the things that need them has yet to be + expanded. + +Wed Mar 22 15:12:00 1995 Jason Merrill + + * typeck.c (build_binary_op_nodefault, comparison ops): Update type0 + and type1, since we might have changed op0 or op1. + +Wed Mar 22 13:33:45 1995 Jason Merrill + + * typeck.c (common_type): Don't mess up templates. + +Wed Mar 22 04:56:00 1995 Jason Merrill + + * typeck.c (common_type): Handle ptms properly. Also handle + T* -> void*. + (build_binary_op_nodefault): New variable build_type controls what + type is given to the expression when it is created. Set this to + boolean_type_node for comparison ops instead of using result_type. + (comp_target_types): Allow T * -> void *. + + * cvt.c (cp_convert_to_pointer): Do access control when converting + ptms, too. + +Tue Mar 21 17:25:06 1995 Brendan Kehoe + + * parse.y (extern_lang_string): Catch use of linkage specs that + aren't all naming the same language. + + * class.c (finish_struct): Delete accidental duplicate code. + +Tue Mar 21 14:00:57 1995 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Disable pedwarns about + comparing functions and incomplete types. + + * decl.c (finish_function): Only unset current_function_decl if + !nested. + (duplicate_decls): Last change went too far; we only want to stop + checking for value/reference ambiguity. + +Tue Mar 21 01:26:39 1995 Mike Stump + + * gc.c (build_generic_desc): Zap the DECL_SIZE so that we can lay it + out fresh, as the new type may be larger. + +Mon Mar 20 19:01:10 1995 Jason Merrill + + * expr.c (extract_init): Try to expand the RTL for the + initialization and figure out what it will look like so we can avoid + run-time initialization. Disabled for now. + (extract_scalar_init): Helper for scalar initialization. + (extract_aggr_init): Helper for aggregate initialization. + + * decl.c (duplicate_decls): Don't complain about ambiguous + declarations. + (obscure_complex_init): Now returns a tree. Call extract_init if + we're optimizing and this is a toplevel decl. + (finish_decl): Update accordingly. + + * lex.c (check_newline): If we're just changing files (not pushing + or popping), update input_file_stack->name. + +Mon Mar 20 17:55:04 1995 Mike Stump + + * pt.c (type_unification): Only TEMPLATE_DECLs are handled right now + in the transitive unification code. + +Mon Mar 20 16:07:50 1995 Brendan Kehoe + + * decl.c (shadow_tag): Don't allow inline, virtual, or explicit on + non-functions. + (grokdeclarator): Don't allow friends to be defined in local classes. + +Sat Mar 18 04:03:33 1995 Jason Merrill + + * decl2.c (finish_prevtable_vardecl): Use DECL_DECLARED_STATIC + rather than DECL_SAVED_INSNS to decide whether or not this method + was declared inline. + + * method.c (synthesize_method): Turn off DECL_INLINE if + function_cannot_inline_p thinks we're too large. + + * typeck.c (build_indirect_ref): Use build_expr_type_conversion. + +Fri Mar 17 17:47:36 1995 Jason Merrill + + * class.c (instantiate_type): Handle pmfs. + + * typeck.c (convert_for_assignment): Check types when assigning one + pmf to another. + + * decl.c (define_label): Fix logic for printing out the name of the + label in an error message. + + * error.c (dump_expr): Support ARRAY_REF. + +Fri Mar 17 17:43:02 1995 Brendan Kehoe + + * decl2.c (finish_vtable_vardecl): Call build_t_desc here. + (finish_prevtable_vardecl): Instead of here. + +Fri Mar 17 14:40:45 1995 Jason Merrill + + * decl.c (expand_static_init): Also use expand_aggr_init if the + initializer is a TREE_LIST. + (grokdeclarator): Only pedwarn about extra qualification if -pedantic. + + * pt.c (unify): Fix unification of return type. + + * expr.c (fixup_result_decl): Use store_expr, rather than + emit_move_insn, to move the return value into the place where + callers will expect it. + +Thu Mar 16 22:05:25 1995 Jason Merrill + + * init.c (build_offset_ref): Call assmble_external on functions. + * typeck.c (build_component_ref): Likewise. + +Thu Mar 16 20:28:16 1995 Brendan Kehoe + + * decl.c (struct saved_scope): Add members base_init_list and + member_init_list. + (push_to_top_level): Save current_base_init_list and + current_member_init_list to them. + (pop_from_top_level): Put it back. + +Thu Mar 16 19:21:14 1995 Jason Merrill + + * pt.c (instantiate_template): Call assemble_external. + +Thu Mar 16 18:07:54 1995 Brendan Kehoe + + * class.c: Include rtl.h, to get NULL_RTX. + (finish_struct): Also zero out DECL_SAVED_INSNS, to avoid problems + on hosts with different sizes for each part of the union. + * tree.c: Also include rtl.h. + (layout_basetypes): Same change for DECL_SAVED_INSNS. + +Thu Mar 16 13:57:36 1995 Jason Merrill + + * pt.c (unify): Fix array domain unification for 64-bit targets. + + * decl2.c (finish_file): Push bizarre type decl before walking the + vtables the first time. + (walk_vtables): OK, don't set prev to vars if the vardecl_fn messed + with TREE_CHAIN (prev). + + * init.c (emit_base_init): Use convert_pointer_to_real instead of + convert_pointer_to when converting to a direct base. + +Wed Mar 15 20:26:29 1995 Mike Stump + + * pt.c (type_unification): Handle transitive unification better. + +Wed Mar 15 13:56:16 1995 Jason Merrill + + * decl2.c (walk_vtables): Always set prev to vars. + (mark_vtable_entries): Call assemble_external on the vtable entries. + + * class.c (finish_struct): Set the vtable's size to NULL_TREE before + calling layout_decl, so that it gets updated properly. + + Finally re-enable dynamic synthesis. This time it works. + * method.c (synthesize_method): Pass decl_function_context (fndecl) + to {push,pop}_cp_function_context. + * decl.c (push_cp_function_context): Now takes a tree argument. + (pop_cp_function_context): Likewise. + * call.c (build_method_call): Enable synthesis. + * lex.c (cons_up_default_function): Likewise. + +Tue Mar 14 19:14:19 1995 Doug Evans + + * parse.y (setattrs): Chain onto prefix_attributes rather than + setting it. + +Wed Mar 15 13:00:00 1995 Brendan Kehoe + + * decl.c (pushdecl): Check if the type of the VAR_DECL is an + error_mark_node before trying to read TYPE_LANG_SPECIFIC. + +Mon Mar 13 21:00:28 1995 Brendan Kehoe + + * decl.c (grokdeclarator, case ARRAY_REF): Wrap the exp with fold, + and convert the size and integer_one_node to the index type. + +Mon Mar 13 08:01:02 1995 Jason Merrill + + * typeck.c (get_member_function_from_ptrfunc): Save the instance + argument, and tack it onto the front of the COND_EXPR to make the + semantics come out right. Grab the instance argument from + '*instance_ptrptr', rather than having it passed in separately. + + * various: Change various consed-up comparison operations to have + boolean type. Remove the instance argument in calls to + get_member_function_from_ptrfunc. + + * error.c (dump_expr): Dump true and false as "true" and "false". + + * decl2.c (finish_file): Also set DECL_STATIC_FUNCTION_P on the + global init function. + + * decl.c (finish_function): Only set DECL_EXTERNAL here if the + inline function is public. + +Sat Mar 11 00:58:03 1995 Jason Merrill + + * init.c (is_friend): Be more careful about checking + DECL_CLASS_CONTEXT on non-member functions. + + * decl2.c (finish_vtable_vardecl): Don't bother calling + assemble_external here. + (prune_vtable_vardecl): New function that just splices out the + vtable decl from the top-level decls. + (import_export_inline): Unset DECL_EXTERNAL at first. + (finish_file): Don't bother calling assemble_external here. Do + splice out all of the vtables. + +Fri Mar 10 14:42:29 1995 Jason Merrill + + * decl.c (finish_function): If we're not emitting the function yet, + call assemble_external for it. + + * decl2.c (finish_prevtable_vardecl): Don't call mark_vtable_entries + here. + (finish_vtable_vardecl): Don't do the linkage deduction thing here. + Also don't splice out the current vtable if it is unused. + (finish_file): Move the second walk_vtables and the synthesis check + inside the 'reconsider' loop. Move thunk emission after the + 'reconsider' loop. + +Thu Mar 9 16:28:16 1995 Brendan Kehoe + + * pt.c (tsubst): Don't bother calling cp_build_type_variant, since it + was passing bogus values for readonly and volatile from the original + template decl, not the resultant type of the tsubst call. + + * class.c (duplicate_tag_error): Use cp_error_at to point out the + previous definition of the tag. + +Thu Mar 9 10:46:17 1995 Jason Merrill + + * decl.c (start_function): Clear base_init_insns and protect_list. + (struct cp_function): Add base_init_insns field. + (push_cp_function_context): Also save base_init_insns. + (pop_cp_function_context): Also restore base_init_insns. + +Wed Mar 8 13:31:44 1995 Jason Merrill + + * init.c (member_init_ok_or_else): Check for initializing a static + member here. + (emit_base_init): Instead of here. + +Tue Mar 7 16:03:26 1995 Jason Merrill + + * call.c (build_method_call): Disable synthesis as needed. + * lex.c (cons_up_default_function): Likewise. + +Tue Mar 7 10:14:29 1995 Brendan Kehoe + + * parse.y: New rules to allow attributes in a prefix position. + (prefix_attributes): New variable. Pass it into cplus_decl_attributes. + (setattr): New rule. + (reserved_declspecs, declmods): Catch attributes here. + * decl2.c (cplus_decl_attributes): Add PREFIX_ATTRIBUTES argument. + * decl.c (duplicate_decls): Pass DECL_MACHINE_ATTRIBUTES to + descendent typedef. + (grokdeclarator): Added code to support machine attributes. + * Makefile.in (stamp-parse): Expect 5 shift/reduce failures. + +Mon Mar 6 15:07:02 1995 Jason Merrill + + * call.c (build_method_call): Don't synthesize methods outside of a + function. + + Make base initialization more re-entrant so that synthesis on the + fly will work (and, eventually, template instantiation on the fly). + * init.c (sort_member_init): Don't bother with members that can't be + initialized. Reorganize a bit. Don't initialize base members here. + (sort_base_init): New function, like sort_member_init, but for base + classes. Steals some code from emit_base_init. + (emit_base_init): Simplify. Call sort_{member,base}_init before + doing any initialization, so we don't have to save + current_{member,base}_init_list in push_cp_function_context. + (expand_aggr_vbase_init_1): Adjust for sort_base_init. + (expand_aggr_vbase_init): Simplify. + * decl.c (struct cp_function): Add protect_list field. + (push_cp_function_context): Also save protect_list. + (pop_cp_function_context): Also restore protect_list. + * call.c (build_method_call): Enable synthesis at point of call. + * lex.c (cons_up_default_function): Likewise. + + * parse.y: Turn -ansi checks back into -pedantic checks. + + * init.c (build_new): Fix -fcheck-new for array new. + +Sat Mar 4 15:55:42 1995 Fergus Henderson + + * typeck.c (build_compound_expr): warn if left-hand operand of + comma expression has no side-effects. + +Fri Mar 3 15:16:45 1995 Jason Merrill + + * parse.y (primary): Change 'object qualified_id *' rules to 'object + overqualified_id *'. + +Fri Mar 3 12:48:17 1995 Brendan Kehoe + + * parse.y (unary_expr): Catch doing sizeof an overloaded function. + Make the error look the same as the one we issue in c_sizeof. + + * typeck.c (build_binary_op_nodefault): Give an error for trying + to compare a pointer-to-member to `void *'. + +Fri Mar 3 11:28:50 1995 Jason Merrill + + * typeck.c (build_unary_op): Handle bool increment with smoke and + mirrors here, rather than in expand_increment where it belongs, + because Kenner doesn't agree with me. + +Fri Mar 3 00:08:10 1995 Brendan Kehoe + + * decl.c (grokparms): Catch a PARM_DECL being used for a default + argument as well. + +Thu Mar 2 20:05:54 1995 Brendan Kehoe + + * init.c (build_new): Don't allow new on a function type. + + * parse.y (primary): Avoid a crash when seeing if the arg is of + the same type as that given for the typespec in an explicit dtor call. + +Thu Mar 2 00:49:38 1995 Jason Merrill + + * decl.c (finish_function): Change test for calling + mark_inline_for_output. + +Wed Mar 1 11:23:46 1995 Jason Merrill + + * typeck.c (build_modify_expr): Complain if + build_default_binary_type_conversion fails. + + * init.c (expand_default_init): Handle arguments of unknown type + properly. + + * cvt.c (build_expr_type_conversion): Only complain about ambiguity + if 'complain'. + * various: Pass 'complain'. + + * typeck.c (comptypes): Be more picky about comparing UPTs. + +Wed Mar 1 11:03:41 1995 Brendan Kehoe + + * decl.c (grokdeclarator): If declarator is null, say that the + type used has an incomplete type. + +Wed Mar 1 10:06:20 1995 Jason Merrill + + * pt.c (instantiate_template): Copy the template arguments to the + permanent_obstack. Also use simple_cst_equal to compare them when + looking for a previous instantiation. + + * tree.c (make_deep_copy): Support copying INTEGER_TYPEs (assuming + they are array domain types). + +Tue Feb 28 23:24:55 1995 Jason Merrill + + * cp-tree.h: Define WANT_* constants for passing to + build_expr_type_conversion. + * cvt.c (build_expr_type_conversion): New function to build + conversion to one of a group of suitable types. + (build_default_binary_type_conversion): Use it. + * decl2.c (grok_array_decl): Likewise. + * typeck.c (build_unary_op): Likewise. + (build_array_ref): Tidy up a bit. + (build_binary_op): Likewise. + +Tue Feb 28 19:57:31 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Don't allow decl of an argument as `void'. + +Tue Feb 28 17:23:36 1995 Jason Merrill + + * parse.y (typed_declspecs1): Add 'typespec reserved_typespecquals + reserved_declspecs' rule. + + * parse.y (expr_or_declarator): Remove notype_qualified_id rule. + (direct_notype_declarator): Likewise. + (complex_direct_notype_declarator): Add notype_qualified_id rule. + + * lex.c (real_yylex): Handle :> digraph properly. + +Tue Feb 28 12:26:29 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Check if it's a friend, not if it's + non-virtual, that's being initialized. Move the check up to + before FRIENDP would get cleared. Catch an unnamed var/field + being declared void. Say just `field' instead of `structure field' + in the error message. Only go for the operator name if DECLARATOR + is non-null. + +Tue Feb 28 00:08:01 1995 Jason Merrill + + * decl.c (start_function): Complain about abstract return type. + (grokdeclarator): Complain about declaring constructors and + destructors to be const or volatile. Complain about declaring + destructors to be static. + + * pt.c (uses_template_parms): Handle pmfs. + + * decl.c (grokdeclarator): Don't call variable_size for array bounds + that only depend on template constant parameters. + +Mon Feb 27 15:38:16 1995 Brendan Kehoe + + * error.c (dump_decl): Only look to see if it's a vtable if we + actually have a name to check out. + +Mon Feb 27 13:37:53 1995 Jason Merrill + + * cvt.c (convert_to_aggr): Lose misleading shortcut. + +Sun Feb 26 17:27:32 1995 Doug Evans + + * decl.c (set_nested_typename): Always set DECL_IGNORED_P, + not just for dwarf. + +Sun Feb 26 00:10:18 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Don't allow a static member to be + declared `register'. + + * init.c (make_friend_class): Move up to a pedwarn for the warning + about a class declaring friends with itself. + + * decl.c (grokdeclarator): You can't do `volatile friend class foo' + or `inline friend class foo'. Only try to make a friend out of + TYPE if we didn't already reset it to integer_type_node. + +Sat Feb 25 22:32:03 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Don't allow initialization of a + non-virtual function. + + * decl.c (start_function): Do a pedwarn if we're changing `main' + to have an int return type. + +Sat Feb 25 00:02:05 1995 Jason Merrill + + * typeck.c (build_modify_expr): Handle simple assignment from + TARGET_EXPRs by building up an RTL_EXPR to force expansion. Whew. + +Fri Feb 24 18:27:14 1995 Brendan Kehoe + + * decl.c (grokdeclarator): Also don't allow virtual outside of a + class decl for a scope method definition performed at global binding. + + * init.c (build_offset_ref): Don't allow creation of an OFFSET_REF + of a bitfield. + + * decl.c (grokdeclarator): Don't allow a const to be declared mutable. + + * typeck.c (build_binary_op): Return an error_mark_node if either + one of the args turned into an error_mark_node when we tried to + use default_conversion. + + * typeck.c (build_unary_op): Forbid using postfix -- on a bool. + + * decl.c (grokdeclarator): Allow `signed' and `unsigned' to be + used on `__wchar_t'. + +Fri Feb 24 13:59:53 1995 Mike Stump + + * except.c (end_protect_partials): Do it the right way. + +Wed Feb 22 15:42:56 1995 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Upgrade warning about + comparing distinct pointer types to pedwarn. + + * typeck2.c (digest_init): Cope with extra braces. + + * typeck.c (build_binary_op_nodefault): Use tree_int_cst_sgn instead + of INT_CST_LT (..., interger_zero_node). + +Wed Feb 22 14:45:52 1995 Brendan Kehoe + + * except.c [!TRY_NEW_EH] (end_protect_partials): Define dummy + function for systems that don't have EH. + +Tue Feb 21 19:18:31 1995 Jason Merrill + + * call.c (can_convert_arg): Like can_convert, but takes an arg as + well. + + * pt.c (type_unification): Allow implicit conversions for parameters + that do not depend on template parameters. + +Tue Feb 21 18:43:48 1995 Douglas Rupp + + * Make-lang.in, config-lang.in: ($exeext): New macro. + * Make-lang.in: Try a "cp" if "ln" fails. + * cp-tree.h (decl_attributes): Added argument. + * decl2.c (cplus_decl_attribute): Add arg to decl_attributes. + * cp/g++.c: Added #ifdefs for sys/file.h and process.h for NT. + Modified spawnvp to have to correct number of arguments for OS/2, NT. + +Tue Feb 21 18:36:55 1995 Mike Stump + + * decl.c (finish_function): Add calls to end_protect_partials to end + the exception region that protects constructors so that partially + constructed objects can be partially destructed when the constructor + throws an exception. + * init.c (perform_member_init, sort_member_init, emit_base_init): + Added support for partially constructed objects. + * init.c (build_partial_cleanup_for): New routine to do partial + cleanups of a base class. + * decl2.c (finish_file): Move the emitting of the exception table + down, after we emit all code that might have exception regions in + them. + * except.c (end_protect_partials, might_have_exceptions_p): New + routines. + (emit_exception_table): Always output table if called. + * cp-tree.h (protect_list, end_protect_partials, + might_have_exceptions_p, emit_exception_table): Added. + +Tue Feb 21 16:05:59 1995 Brendan Kehoe + + * gc.c (build_typeid): Pass a NULL_TREE, not the bogus, unused + address of a local variable. + * class.c (build_vfn_ref): Only try to build the PLUS_EXPR if we + were given a non-null PTR_TO_INSTPTR. + +Tue Feb 21 01:53:18 1995 Jason Merrill + + * decl.c (duplicate_decls): Always lay out the merged decl. + + * decl2.c (finish_vtable_vardecl): Don't do vtable hack on templates. + (finish_prevtable_vardecl): Likewise. + + * method.c (synthesize_method): Set interface_{unknown,only} + according to the settings for our class, not the file where it comes + from. + +Sat Feb 18 12:26:48 1995 Mike Stump + + * except.c: Handle systems that define __i386__ but not __i386. + +Fri Feb 17 15:31:31 1995 Jason Merrill + + * decl2.c (reparse_decl_as_expr): Support being called without a + type argument. + + * parse.y (primary): Add '(' expr_or_declarator ')'. Adds 4 r/r + conflicts. Sigh. + +Fri Feb 17 12:02:06 1995 Mike Stump + + * parse.y (template_def, fndef, fn.def1, return_init, condition, + initdcl0, initdcl, notype_initdcl0, nomods_initdcl0, + component_decl_1, after_type_component_declarator0, + notype_component_declarator0, after_type_component_declarator, + notype_component_declarator, after_type_component_declarator, + full_parm, maybe_raises, exception_specification_opt): Fix up, + include exception_specification_opt maybeasm maybe_attribute and + maybe_init if missing. Rename maybe_raises to + exception_specification_opt to match draft wording. Use maybe_init + to simplify rules. + +Fri Feb 17 01:54:46 1995 Jason Merrill + + * init.c (build_new): Set TREE_NO_UNUSED_WARNING on COMPOUND_EXPRs + built for news of scalar types. + +Thu Feb 16 17:48:28 1995 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Update code for warning + about signed/unsigned comparisons from C frontend. Realize that the + code in the C frontend is, if anything, even more bogus. Fix it. + (build_binary_op): Undo default_conversion if it wasn't useful. + + * typeck.c (build_unary_op, ADDR_EXPR): Lose bogus special case for + PRE*CREMENT_EXPR. + + * decl2.c (import_export_vtable): Don't try the vtable hack + if the class doesn't have any real non-inline virtual functions. + (finish_vtable_vardecl): Don't bother trying to find a non-inline + virtual function in a non-polymorphic class. + (finish_prevtable_vardecl): Likewise. + + * decl2.c (import_export_vtable): Use and set DECL_INTERFACE_KNOWN. + + * cp-tree.h (DECL_INTERFACE_KNOWN): Use DECL_LANG_FLAG_5. + + * init.c (expand_virtual_init): Always call assemble_external. + + * class.c (build_vfn_ref): Always call assemble_external. + (build_vtable): Always call import_export_vtable. + (prepare_fresh_vtable): Likewise. + (add_virtual_function): Don't bother setting TREE_ADDRESSABLE. + +Thu Feb 16 03:28:49 1995 Jason Merrill + + * class.c (finish_struct): Use TYPE_{MIN,MAX}_VALUE to determine + whether an enumerated type fits in a bitfield. + +Wed Feb 15 15:38:12 1995 Jason Merrill + + * class.c (grow_method): Update method_vec after growing the class + obstack. + +Wed Feb 15 13:42:59 1995 Mike Stump + + * parse.y (handler_seq): Push a level for the catch parameters. + +Wed Feb 15 12:42:57 1995 Jason Merrill + + * init.c (emit_base_init): Update BINFO_INHERITANCE_CHAIN on my + bases, in case they've been clobbered. + +Wed Feb 15 12:07:29 1995 Mike Stump + + * class.c (finish_base_struct): Set up BINFO_INHERITANCE_CHAIN here, + so that one day it will always be valid. + * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise. + + * cp-tree.h (copy_binfo): Removed, unused. + * tree.c (copy_binfo): Likewise. + +Wed Feb 15 00:05:30 1995 Jason Merrill + + * init.c (build_new): Save the allocation before calling + expand_vec_init on it. + + * decl.c (finish_enum): The TYPE_PRECISION of the enum type mush + match the TYPE_PRECISION of the underlying type for constant folding + to work. + +Tue Feb 14 15:31:25 1995 Mike Stump + + * except.c (push_eh_entry, expand_start_all_catch, + expand_leftover_cleanups, expand_end_catch_block): Keep track of + the context in which the exception region occurs. + (build_exception_table): If the region was not output, don't output + the entry in the eh table for it. + +Tue Feb 14 02:15:43 1995 Jason Merrill + + * init.c (expand_default_init): Only use a previous constructor call + if it's a call to our constructor. Does the word "Duh" mean + anything to you? + + * decl.c (grokparms): Fine, just don't call + convert_for_initialization at all. OK? Happy now? + +Mon Feb 13 02:23:44 1995 Jason Merrill + + * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Make sure that the class + method vector has a second element before returning it. + + * decl.c (grokparms): Don't strip REFERENCE_TYPE before calling + convert_for_initialization. + +Sun Feb 12 03:57:06 1995 Jason Merrill + + * typeck.c (build_modify_expr): Compare function name to + constructor_name (current_class_type) instead of current_class_name. + + * decl.c (grokparms): Don't do anything with the return value of + convert_for_initialization. + + * error.c (dump_decl): Also dump_readonly_or_volatile on the decl. + + * decl.c (duplicate_decls): Tweak error message. + + * typeck.c (build_const_cast): Implement checking. + (build_reinterpret_cast): Implement some checking. + + * cp-tree.h (CONV_FORCE_TEMP): Require a new temporary when + converting to the same aggregate type. + (CONV_STATIC_CAST): Include it. + (CONV_C_CAST): Likewise. + * cvt.c (convert_force): Use CONV_C_CAST instead of CONV_OLD_CONVERT. + (cp_convert): Only force a new temporary if CONV_FORCE_TEMP. + +Fri Feb 10 16:18:52 1995 Jason Merrill + + * typeck.c (build_c_cast): Use non_lvalue to tack something on + where necessary. + + * decl.c (auto_function): Now a function. + * except.c (init_exception_processing): terminate, unexpected, + set_terminate, and set_unexpected have C++ linkage. + + * typeck.c (build_unary_op, TRUTH_NOT_EXPR): Use convert instead of + truthvalue_conversion for converting to bool, as it handles + user-defined conversions properly. + (condition_conversion): Likewise. + + * except.c (expand_throw): Don't call convert_to_reference. + Pass the correct parameters to build_new. + + * method.c (do_build_assign_ref): Don't use access control when + converting to a base reference here. + (do_build_copy_constructor): Or here. + + * init.c (build_new): Unset TREE_READONLY on the dereferenced + pointer before assigning to it. + + * decl.c (maybe_build_cleanup): Don't bother stripping const here. + + * decl2.c (delete_sanity): You can now delete pointer to const. + +Fri Feb 10 13:28:38 1995 Jason Merrill + + * decl.c (finish_function): Don't rely on actual parameters being + evaluated left-to-right. + * except.c (expand_end_catch_block): Likewise. + +Fri Feb 10 00:52:04 1995 Jason Merrill + + * tree.c (real_lvalue_p): Like lvalue_p, but class temps aren't + considered lvalues. + * cvt.c (convert_to_reference): Use real_lvalue_p instead of + lvalue_p. + + * cvt.c (build_type_conversion_1): Don't call convert on aggregate + types. + (convert_to_reference): Fix erroneous text substitution. + + * typeck2.c (initializer_constant_valid_p): Update from C frontend. + Add new argument to all callers. + + * typeck.c (convert_arguments): Check for error_mark_node before + trying to do anything with the actual parameter. + + * typeck.c (condition_conversion): Build up a CLEANUP_POINT_EXPR and + fold it. + (bool_truthvalue_conversion): Remove. Fix all callers to call + truthvalue_conversion instead. + (various): Fold CLEANUP_POINT_EXPRs. + + * parse.y (conditions): Call condition_conversion rather than + building up a CLEANUP_POINT_EXPR. + + * pt.c (end_template_decl): Don't warn_if_unknown_interface here + under -falt-external-templates. + +Thu Feb 9 05:24:10 1995 Jason Merrill + + * init.c (build_new): Complain about new of const type without + initializer. Other cleanup. + + * call.c (compute_conversion_costs): Don't call + build_type_conversion with a reference type; convert to the target + type and check its lvaluetude. + * cvt.c (convert_to_reference): Likewise. + + * cvt.c (build_type_conversion_1): There will never be any need to + dereference references here now. + +Thu Feb 9 00:37:47 1995 Mike Stump + + * except.c (expand_builtin_throw): Make sure we only `use' the + value of return_val_rtx. + +Wed Feb 8 15:45:55 1995 Jason Merrill + + * parse.y (structsp): Don't complain about declaring a type being + defined to be a friend. + + * decl2.c (warn_if_unknown_interface): Note the template in question + and the point of instantiation, for -falt-external-templates. + * lex.c (reinit_parse_for_method): Pass the decl to + warn_if_unknown_interface. + * pt.c (instantiate_template): Likewise. + (end_template_decl): Likewise. + + * decl.c (set_nested_typename): Set IDENTIFIER_TYPE_VALUE on the + nested name again, to make local classes work a bit better. + + * typeck.c (build_function_call_real): Dereference reference after + checking for incomplete type. + + * init.c (build_new): Accept new of const and volatile types. + +Wed Feb 8 14:04:16 1995 Jason Merrill + + * decl.c (grokdeclarator): Fix error message. + +Wed Feb 8 03:16:15 1995 Jason Merrill + + * typeck.c (convert_for_initialization): Do bash arrays when + converting to a reference to non-array. + +Tue Feb 7 15:50:33 1995 Jason Merrill + + * cvt.c (cp_convert): Don't call convert_to_reference, or + automatically dereference references. Do pass reference conversions + to cp_convert_to_pointer. + (cp_convert_to_pointer): Support references. + + * call.c (build_method_call): Don't build up a reference to the + parameter here; let build_overload_call handle that. + + * typeck.c (build_c_cast): Call convert_to_reference directly if + converting to a reference type. + * method.c (do_build_copy_constructor): Likewise. + * method.c (do_build_copy_constructor): Likewise. + (do_build_assign_ref): Likewise. + + * call.c (build_method_call): Dereference a returned reference. + * typeck.c (build_function_call_real): Likewise. + + * decl.c (xref_basetypes): Check for unions with basetypes here. + (xref_tag): Instead of here. + + * pt.c (process_template_parm): Template type parm decls are + artificial. + +Mon Feb 6 04:32:09 1995 Jason Merrill + + * parse.y (typed_declspecs): Add missing semicolon. + (do_xref_defn): Resurrect. + (named_class_head_sans_basetype): Move template specialization + definition cases to named_class_head_sans_basetype_defn. + + * decl2.c (grokfield): Call pushdecl_class_level after setting the + TYPE_NAME, not before. + +Sun Feb 5 02:50:45 1995 Jason Merrill + + * call.c (convert_harshness): Don't call sorry here. Don't allow + conversions between function pointer types if pedantic. + + * pt.c (overload_template_name): Pass globalize=1 to xref_tag. + + * lex.c (cons_up_default_function): Use the full name for the return + type of op=. + + * decl.c (set_nested_typename): Don't worry about anonymous types, + as they already have a unique name. + (pushdecl): Remove redundant set_nested_typename + (xref_tag): Split out base handling into xref_basetypes. + + * cp-tree.h (TYPE_INCOMPLETE): New macro; TEMPLATE_TYPE_PARMs are + not considered incomplete even though their definition is unknown. + + * decl.c (xref_defn_tag): Lose. + (xref_tag): xref_next_defn = ! globalize. + (pushdecl): Don't set DECL_NESTED_TYPENAME on artificial decls. The + ones that should have it set will have it set by pushtag. + (pushdecl_class_level): Likewise. + (pushtag): Tidy up a bit. + (set_nested_typename): Push a decl for the nested typename from + here, rather than from xref_defn_tag. + + * parse.y (do_xref): Lose. + (named_class_head): If we see 'class foo:' we know it's a + definition, so don't worry about base lists for non-definitions. + + * pt.c (push_template_decls): Template parm decls are artificial. + + * decl.c (duplicate_decls): Restore check for qualifier + disagreement for non-functions. + (decls_match): Remove check for qualifier disagreement. + +Fri Feb 3 14:58:58 1995 Jason Merrill + + * decl.c (grok_reference_init): Convert initializer from + reference. + * typeck.c (convert_for_initialization): Likewise. + + * decl.c (duplicate_decls): Propagate DECL_NESTED_TYPENAME. + + * cvt.c (cp_convert): Don't convert to the same class type by just + tacking on a NOP_EXPR. + (convert_to_reference): Use comp_target_types instead of comptypes + so that we don't allow conversions two levels down. + +Thu Feb 2 15:07:58 1995 Jason Merrill + + * class.c (build_vbase_path): Bash types to make the backend happy. + * cvt.c (build_up_reference): Bash the types bashed by + build_vbase_path to be reference types instead of pointer types. + (convert_to_reference): Likewise. + + * typeck.c (build_c_cast): Don't strip NOPs if we're converting to a + reference type. + + * parse.y (structsp): Put back error for 'struct B: public A;'. + +Wed Feb 1 23:02:06 1995 Mike Stump + + * except.c: Add support for mips systems that don't define __mips + but do define mips, like Ultrix. + +Wed Feb 1 22:39:07 1995 Mike Stump + + * except.c: Add support for exception handling on the Alpha. + +Wed Feb 1 10:12:14 1995 Mike Stump + + * decl2.c (finish_file): Fix bug in Jan 31st change. + +Tue Jan 31 16:59:15 1995 Gerald Baumgartner + + * sig.c (build_signature_pointer_or_reference_type): Don't set + IS_AGGR_TYPE for signature pointers/reference so expand_default_init + doesn't expect to find a copy constructor. + * call.c (build_method_call): Treat signature pointers/reference + as if IS_AGGR_TYPE were set. + +Tue Jan 31 13:28:56 1995 Mike Stump + + * gc.c (get_typeid): Pawn off error messages to build_t_desc. + (build_t_desc): Inform the user here if they try and build + with -frtti and don't include . + + * decl2.c (finish_prevtable_vardecl): Support rescanning. + (finish_file): Move finish_prevtable_vardecl up to before the global + initializers are done as tdecls are initialized in the global + initializer. Also Pick up any new tdecls or vtables needed by + synthesized methods. + + * class.c (finish_struct): Simplify. We have to do rtti scanning at + end, so we might as well do all of it there. + +Tue Jan 31 05:35:02 1995 Jason Merrill + + * call.c (build_method_call): Fix -fthis-is-variable for 32-bit + targets, too. + +Tue Jan 31 00:11:04 1995 Mike Stump + + * decl2.c (finish_prevtable_vardecl): New routine, mostly split from + finish_vtable_vardecl. It has the first half functionality from + that routine. + * decl2.c (finish_vtable_vardecl): Update to not include stuff not + in finish_prevtable_vardecl. + * decl2.c (finish_file): Call finish_prevtable_vardecl. + * gc.c (build_generic_desc): Allow it to be called when not at the + global binding layer, but behave as if we were. + (build_t_desc): Rearrange a bit so that it really works and is + easier to follow. + * class.c (finish_struct): Don't decide on tdecls here, as we have + to wait until the end of the file in general to decide whether or + not they come out. + +Mon Jan 30 01:00:40 1995 Jason Merrill + + * init.c (build_delete): Check access to operator delete before + calling the destructor. + * method.c (build_opfncall, DELETE_EXPR): build_method is allowed to + return error_mark_node. + * call.c (build_method_call): Use the one-argument op delete even if + it's an error. + + * init.c (build_new): Fix -fthis-is-variable support. + * call.c (build_method_call): Likewise. + + * call.c (convert_harshness): Make conversion from a pointer to bool + worse than conversion to another pointer. + +Sat Jan 28 16:46:10 1995 Jason Merrill + + * init.c (build_new): Check new return value if -fcheck-new. + + * lex.c (check_newline): Clear end_of_file when we're done, too. + +Sat Jan 28 10:38:39 1995 Mike Stump + + * decl2.c (finish_vtable_vardecl): Make rtti TD tables follow + vtables whereever they go. + + * gc.c (build_t_desc): Remove old way of setting it up, as it wasn't + right. + +Sat Jan 28 09:10:44 1995 Mike Stump + + * decl2.c (finish_vtable_vardecl): Now set the + interface/implementation of vtables on the first virtual function, + if one exists, otherwise we use the old method. This is a major win + in terms of cutting down the size of objects and executables in + terms of text space and data space. Now most of the savings that + #pragma interface/implementation gives is automatic in a fair number + of cases. + +Sat Jan 28 04:57:33 1995 Jason Merrill + + * decl.c (grokdeclarator): Discard the template parameters in a + template constructor declaration so that the function is always + named constructor_name (ctype). + + * lex.c (check_newline): Use ungetc to put back the character before + calling HANDLE_PRAGMA. + +Fri Jan 27 17:23:47 1995 Mike Stump + + * decl2.c (check_classfn): If the cname is T and fn_name is T, + make sure we still match them. + +Fri Jan 27 16:32:10 1995 Jason Merrill + + * parse.y: Add END_OF_LINE token. + + * lex.c (check_newline): Set linemode when we see a # directive, and + unset it when we're done. Turn all 'return's into 'goto skipline'. + Fix all uses of '\n', since we won't see it anymore. Put back the + character we read before checking for a sysv or target pragma. + (real_yylex): If we see an EOF in linemode, return END_OF_LINE. + (handle_sysv_pragma): Don't look at the input stream; quit when we + see an END_OF_LINE token. + + * input.c (getch): Return EOF if we're in line mode and at the end + of a line. + (put_back): Don't put back an EOF. + +Thu Jan 26 19:26:34 1995 Mike Stump + + * except.c (expand_throw): Do the newing of the exception object + before we load the type descriptor or the address so that we don't + wipe any of the values out. + +Thu Jan 26 19:20:00 1995 Mike Stump + + * except.c (init_exception_processing): Don't use r12 on the rs6000. + +Tue Jan 24 16:36:31 1995 Jason Merrill + + * decl.c (grokparms): Don't try to build up a reference at this point. + + * typeck2.c (build_functional_cast): Don't assume that a NOP_EXPR + will suffice to convert from integer_zero_node. + +Wed Jan 25 15:02:09 1995 David S. Miller + + * class.c (instantiate_type): Change error message text. + * typeck2.c (store_init_value): Likewise. + +Mon Jan 23 21:57:14 1995 Mike Stump + + * pt.c (tsubst): When we copy a node, don't forget to copy + TREE_CHAIN, we use it later. + +Mon Jan 23 03:33:47 1995 Jason Merrill + + * typeck.c (convert_for_assignment): Initialize variable before use. + +Fri Jan 20 01:17:59 1995 Jason Merrill + + * g++.c (main): Link with both libstdc++ and libg++ if called as + something ending with "g++", otherwise only libstdc++. Move -lm to + the end of the line. + +Thu Jan 19 15:43:11 1995 Jason Merrill + + * call.c (build_method_call): Don't mess with 'this' before calling + compute_conversion_costs. + +Wed Jan 18 15:40:55 1995 Jason Merrill + + * search.c (get_matching_virtual): Give line number for previous + declaration. + + * call.c (convert_harshness): Handle conversions to references + better. + + * cvt.c (build_up_reference): OK, handle {MIN,MAX}_EXPR *properly*. + +Wed Jan 18 15:21:38 1995 Mike Stump + + * class.c (instantiate_type): Use DECL_CHAIN to walk lists instead, + as the TREE_CHAIN for methods will take us to the next differently + named function, DECL_CHAIN won't. + +Wed Jan 18 14:26:59 1995 Jason Merrill + + * tree.c (lvalue_p): Handle {MIN,MAX}_EXPR. + + * decl2.c (lang_decode_option): -Wall implies -Wparentheses. + warn_parentheses defaults to 0. + + * decl.c (grokparms): Put back call to require_instantiated_type. + +Tue Jan 17 19:56:15 1995 Mike Stump + + * except.c (exception_section): Use the data section on the rs6000. + Change calling convention for named_section. + +Wed Jan 17 18:20:57 1994 Fergus Henderson + + * cp-tree.h: Make if (x=0) warn with wall + * parse.y: Make if (x=0) warn with wall + +Tue Jan 17 14:12:00 1995 Jason Merrill + + * decl.c (BOOL_TYPE_SIZE): BITS_PER_WORD if SLOW_BYTE_ACCESS, + BITS_PER_UNIT otherwise. + + * search.c (get_matching_virtual): Don't check the binfo if the + types are the same. + + * cvt.c (cp_convert): Just call truthvalue_conversion to convert to + bool. + +Mon Jan 16 13:28:48 1995 Jason Merrill + + * various: Use boolean_type_node, boolean_true_node, + boolean_false_node. + + * search.c (get_matching_virtual): Allow covariant returns that + don't require pointer adjustment. + + * typeck.c (build_conditional_expr): Don't call default_conversion + on ifexp. + + * cvt.c (build_up_reference): Handle MIN_EXPR and MAX_EXPR. + + * decl.c (grokdeclarator): Upgrade warning about &const to pedwarn. + +Sun Jan 15 22:17:32 1995 David Binderman + + * pt.c (do_function_instantiation): Free targs once we're done. + +Sun Jan 15 22:17:32 1995 Jason Merrill + + * decl.c (BOOL_TYPE_SIZE): Defaults to BITS_PER_WORD. + (init_decl_processing): Use BOOL_TYPE_SIZE instead of CHAR_TYPE_SIZE + for bool. + +Sat Jan 14 05:33:55 1995 Jason Merrill + + * decl2.c (finish_file): We need to mess up if there are any + variables in the list, not just if there is one with a constructor. + +Fri Jan 13 14:42:55 1995 Jason Merrill + + * decl.c (duplicate_decls): Propagate DECL_STATIC_{CON,DE}STRUCTOR. + (finish_function): Handle DECL_STATIC_{CON,DE}STRUCTOR. + (finish_function): Trust rest_of_compilation. + + * decl2.c (finish_file): Also call functions designated as static + constructors/destructors. + + * decl.c (grokdeclarator): Allow access decls of operator functions. + (grokparms): Only do convert_for_initialization if the initializer + has a type. + (duplicate_decls): Put back push_obstacks_nochange call. + + * lex.c (real_yylex): Downgrade complaint about the escape sequence + being too large from pedwarn to warning. + + * decl.c (grokdeclarator): Don't complain about long long in system + headers. + + * lex.c (real_yylex): Handle digraphs. + +Thu Jan 12 12:17:24 1995 Jason Merrill + + * decl.c (init_decl_processing): -f{no-,}strict-prototype only + affects C linkage declarations now. + + * typeck.c (comp_target_types): Grok simple contravariant conversions. + (common_type): t1 and t2 are interchangeable. + + * various: Test return value of comp_target_types differently in + different places; it now returns -1 for a contravariant conversion + (which is fine in symmetric cases). + + (common_type): Prefer long double to double even when + they have the same precision. + + * decl.c (grokparms): Call convert_for_initialization to check + default arguments. + + * init.c (build_new): void_type_node has a size (of 0). + + * decl.c (decls_match): Also check for agreement of TREE_READONLY + and TREE_THIS_VOLATILE. + (push_class_level_binding): Properly handle shadowing of + nested tags by fields. + + * search.c (dfs_pushdecls): Likewise. + + * decl2.c (finish_file): Don't second-guess self-initialization. + + * cvt.c (convert_to_reference): Work with expr directly, rather than + a copy. + + * decl.c (push_overloaded_decl): Only shadow artificial TYPE_DECLs. + + * init.c (add_friend): Downgrade duplicate friend message from + pedwarn to warning. + + * decl.c (duplicate_decls): Push obstacks before calling common_type. + +Thu Jan 12 17:15:21 1995 Michael Ben-Gershon + + * except.c (push_eh_entry): Set LABEL_PRESERVE_P flag for + exception table labels. + (expand_start_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + * except.c (make_first_label): New function. + (expand_start_all_catch): Add a call to make_first_label() before + using a label as a jump destination. + (expand_end_all_catch): Likewise. + (expand_leftover_cleanups): Likewise. + (expand_end_catch_block): Likewise. + (expand_builtin_throw): Likewise. + (expand_throw): Likewise. + * except.c: Add ARM processor support for exception handling. + +Thu Jan 12 12:17:24 1995 Jason Merrill + + (complete_array_type): Copy code from C frontend. + + * lex.c (real_yylex): Don't multiply the length of a wide string + literal by WCHAR_BYTES. + + * decl.c (pushdecl): Check for redeclaration of wchar_t here. + (duplicate_decls): Instead of here. + (define_label): Complain about a label named wchar_t. + (grokdeclarator): Complain about declarations of + operator-function-ids as non-functions. + + * typeck.c (unary_complex_lvalue): Also wrap prefix -- and ++ in + COMPOUND_EXPRs. + (build_unary_op): Wrap unary plus in a NON_LVALUE_EXPR. + + * lex.c (real_yylex): Don't skip whitespace when reading the next + character after ->. + +Wed Jan 11 16:32:49 1995 Mike Stump + + * except.c: Allow cc1plus to be built with native compiler on rs6000. + (expand_start_all_catch): Add assemble_external calls for various + routines we call. + (expand_leftover_cleanups): Likewise. + (expand_start_catch_block): Likewise. + (do_unwind): Likewise. + (expand_builtin_throw): Likewise. + +Wed Jan 11 01:05:42 1995 Jason Merrill + + * decl.c (pushtag): Only look for a previous decl in the current + binding level. Use explicit global scope in DECL_NESTED_TYPENAME. + + * gxx.gperf: Add __signature__ and __sigof__ keywords. + + * decl2.c (lang_decode_option): -ansi does not set flag_no_asm. It + does set flag_no_gnu_keywords and flag_operator_names. + + * lex.c (init_lex): 'overload' is not a keyword unless -traditional. + Unset extension keywords if -fno-gnu-keywords. + Allow operator names ('bitand') if -foperator-names. + Never unset 'asm'; -fno-asm only affects 'typeof'. + + * decl.c (lookup_name_real): The got_object special lookup only + applies to types. + +Tue Jan 10 18:07:51 1995 Jason Merrill + + * spew.c (yylex): Also use DECL_NESTED_TYPENAME if got_object is set. + + * parse.y (primary): Unset got_object after all rules that use the + 'object' nonterminal. + (object): Set got_object. + + * lex.h: Declare got_object. + + * decl.c (lookup_name_real): Also lookup names in the context of an + object specified. + +Tue Jan 10 14:30:30 1995 Mike Stump + + * typeck.c (get_member_function_from_ptrfunc): Use ptrdiff_type_node + for things that have to be added to pointers, not size_type. Cures + problems with pointer to members on Alphas. + (build_binary_op_nodefault): Likewise. + (get_delta_difference_: Likewise. + (build_ptrmemfunc): Likewise. + +Tue Jan 10 01:49:25 1995 Jason Merrill + + * decl.c (pushtag): Stick the new decl in TYPE_NAME before pushing + it. + + * typeck.c (build_component_ref): Don't build up a COMPONENT_REF + when dealing with overloaded member functions; just act like + build_offset_ref. + (commonparms): Remove misleading comment. + + * decl.c (duplicate_decls): Complain about repeated default + arguments here. + (redeclaration_error_message): Instead of here. + (pushdecl): Complain about missing default arguments here. + (grokparms): Instead of here. + (lookup_name_current_level): Also match on DECL_ASSEMBLER_NAME. + (grok_reference_init): Do not complain about missing initializer if + declared 'extern'. + + * search.c (lookup_field): Don't return a TYPE_DECL if there is a + function alternative and want_type is not set. + +Mon Jan 9 18:16:23 1995 Jason Merrill + + * decl.c (pushtag): Don't set TYPE_NAME to an identifier. Do push + the decl when the type has no TYPE_NAME. + (lookup_nested_type): Don't assume that type has TYPE_NAME set. + (lookup_name_real): Call lookup_field with want_type = + prefer_type. + + * search.c (lookup_field): Handle want_type properly in the presence + of fields with the same name. + + * decl.c (set_nested_typename): Set nested name for file-scope types + to include leading ::. + (pushdecl): Set the nested typename if the decl doesn't have one, + rather than if the type's canonical decl doesn't have one. + +Mon Jan 9 03:44:33 1995 Jason Merrill + + * typeck.c (convert_for_assignment): Complain about contravariance + violation here. + (comp_target_types): Instead of here. + (build_unary_op): resolve_offset_ref before checking for a valid + type. + + * spew.c (yylex): Decrement looking_for_typename after we see a + _DEFN. + + * decl.c (pushdecl): Don't install an artificial TYPE_DECL in + IDENTIFIER_LOCAL_VALUE if we already have a decl with that name. + + * typeck.c (convert_for_assignment): Converting pointers to bool + does not need a cast. + +Sun Jan 8 18:16:45 1995 Jason Merrill + + * class.c (instantiate_type): Initialize nsubsts parm. + + * pt.c (do_function_instantiation): Likewise. + +Sat Jan 7 14:37:05 1995 Jason Merrill + + * pt.c (tsubst): Use TREE_STATIC instead of DECL_INLINE && + DECL_SAVED_INSNS to determine whether or not we've seen a definition + of this function. + (instantiate_template): Likewise. + + * call.c (convert_harshness): Allow const reference binding when + called from the overloading code, but not when called from + can_convert (since it isn't a conversion). + (convert_harshness): Put back some disabled code. + +Fri Jan 6 14:10:57 1995 Jason Merrill + + * call.c (convert_harshness): There is no implicit conversion from + void* to other pointer types (unless the parameter is (void*)0). + (convert_harshness): Non-lvalues do not convert to reference types. + + * class.c (finish_struct_methods): Still set + TYPE_HAS_{INT,REAL}_CONVERSION. + + * call.c (can_convert): Don't use aggregate initialization. + + * cp-tree.h: Declare lookup_conversions. + +Thu Jan 5 21:08:00 1995 Mike Stump + + * parse.y (simple_stmt): Fix duplicate case value error messages to + be more readable. + +Wed Jan 4 16:44:19 1995 Jason Merrill + + * cvt.c (build_type_conversion): Total rewrite to use + convert_harshness instead of reproducing conversion logic here. Now + much shorter. + + * call.c (convert_harshness): Support conversions to bool. + (can_convert): Checks whether a conversion is less harsh + than USER_CODE, for build_type_conversion. + + * search.c (add_conversions): Function for passing to dfs_walk which + adds all the type conversion operators in the current type to a list. + (lookup_conversions): Calls dfs_walk with add_conversions and return + the list. + (dfs_walk): Don't require a qfn. + + * cp-tree.h: Lose CLASSTYPE_CONVERSIONS hackery. + (CLASSTYPE_FIRST_CONVERSION): Points to elt 1 of CLASSTYPE_METHOD_VEC. + + * class.c (finish_struct_bits): Lose CLASSTYPE_CONVERSIONS hackery. + (grow_method): A separate function for building onto the growing + method vector. + (finish_struct_methods): Use it. Put all type conversion operators + right after the constructors. Perhaps we should sort the methods + alphabetically? + +Mon Jan 2 14:42:58 1995 Jason Merrill + + * call.c (build_method_call): Lose another misleading shortcut. + + +Copyright (C) 1995 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1996 b/gcc/cp/ChangeLog-1996 new file mode 100644 index 000000000..d13f24567 --- /dev/null +++ b/gcc/cp/ChangeLog-1996 @@ -0,0 +1,4053 @@ +Tue Dec 31 20:25:50 1996 Mike Stump + + * search.c (expand_upcast_fixups): Fix bogus code generation + problem where the generated code uses the wrong index into the + runtime built vtable on the stack. Old code could clobber random + stack values. + +Tue Dec 31 15:16:56 1996 Mike Stump + + * init.c (perform_member_init): Make sure the partial EH cleanups + live on the function_obstack. + +Fri Dec 27 10:31:40 1996 Paul Eggert + + * Make-lang.in (g++spec.o): Don't use $< with an explicit target; + this isn't portable to some versions of `make' (e.g. Solaris 2.5.1). + +Tue Dec 24 10:24:03 1996 Jeffrey A Law + + * decl.c (grokvardecl): Avoid ANSI style initialization. + +Sun Dec 22 04:22:06 1996 Jason Merrill + + * pt.c (tsubst): Tweak arg types for a FUNCTION_TYPE. + +Fri Dec 20 17:09:25 1996 Jason Merrill + + * pt.c (instantiate_class_template): Call grok_{ctor,op}_properties. + +Fri Dec 20 12:17:12 1996 Brendan Kehoe + + * g++spec.c (lang_specific_driver): Put missing hyphen in front of + arguments we compare against. Start the count of I at 1, not 0, + since argv[0] is still the command. + +Thu Dec 19 11:53:57 1996 Stan Shebs + + * lang-specs.h: Accept .cp as an C++ extension. + +Mon Dec 16 22:43:31 1996 Brendan Kehoe + + * cp-tree.h (ptr_reasonably_similar): Add decl. + +Thu Dec 12 15:00:35 1996 Brendan Kehoe + + * decl.c (grokvardecl): Change SPECBITS parm to be the SPECBITS_IN + pointer. New local SPECBITS with the parm's value. + (grokdeclarator): Pass &specbits down. + + * parse.y (expr_no_commas): Make sure $$ is not an error_mark_node + before we try to do C_SET_EXP_ORIGINAL_CODE on it. + + * search.c (envelope_add_decl): Check that the CLASSTYPE_CID of + CONTEXT is not 0 before we try to use TYPE_DERIVES_FROM. + + * decl.c (cplus_expand_expr_stmt): Only expand the expr if EXP is + not an error_mark_node. + +Sat Dec 7 17:20:22 1996 Jason Merrill + + * cp-tree.h (TYPE_MAIN_DECL): Use TYPE_STUB_DECL. + * *.c: Use TYPE_MAIN_DECL instead of TYPE_NAME where appropriate. + +Fri Dec 6 14:40:09 1996 Jason Merrill + + * decl.c (grokdeclarator): When giving an anonymous struct a name, + replace TYPE_NAME instead of TYPE_IDENTIFIER (so TYPE_STUB_DECL is + not affected). + + * typeck2.c (build_m_component_ref): If component is a pointer + to data member, resolve the OFFSET_REF now. + + * call.c (convert_like): Don't go into infinite recursion. + + * pt.c (coerce_template_parms): Use tsubst_expr for non-type args. + + * class.c (finish_struct_1): Set DECL_ARTIFICIAL on the vptr. + * tree.c (layout_basetypes): And on the vbase ptr. + +Thu Dec 5 02:11:28 1996 Jason Merrill + + * decl.c (BOOL_TYPE_SIZE): Define in terms of POINTER_SIZE or + CHAR_TYPE_SIZE so bool is always the same size as another type. + + * decl.c (pushtag): Set DECL_IGNORED_P for DWARF, too. + +Tue Dec 3 23:18:37 1996 Jason Merrill + + * decl2.c (grok_x_components): Remove synthesized methods from + TYPE_METHODS of an anonymous union, complain about member + functions. + * decl.c (shadow_tag): Wipe out memory of synthesized methods in + anonymous unions. + (finish_function): Just clear the DECL_RTL of our arguments. + +Fri Nov 29 21:54:17 1996 Jason Merrill + + * decl2.c (finish_file): Emit DWARF debugging info for static data + members. + + * pt.c (tsubst): If t is a stub decl, return the stub decl for type. + +Wed Nov 27 14:47:15 1996 Bob Manson + + * typeck.c (build_component_ref): Don't die if COMPONENT isn't a + IDENTIFIER_NODE. + +Wed Nov 27 16:05:19 1996 Michael Meissner + + * Make-lang.in (g++-cross$(exeext)): Fix typo. + +Wed Nov 27 08:14:00 1996 Brendan Kehoe + + Make the g++ driver now be a standalone program, rather than one + that tries to run the gcc driver after munging up the options. + * Make-lang.in (g++.c, g++spec.o): New rules. + (g++.o): New rule, based on gcc.o with -DLANG_SPECIFIC_DRIVER + added. + (g++$(exeext)): New rule, based on xgcc rule. + (g++-cross$(exeext)): Now just copies g++$(exeext) over. + * g++spec.c: New file. + * g++.c: Removed file. + +Tue Nov 26 19:01:09 1996 Mike Stump + + * cvt.c (build_up_reference): Arrange for any temporary values + that have been keep in registers until now to be put into memory. + +Mon Nov 25 15:16:41 1996 Kaveh R. Ghazi + + * Make-lang.in (c++.stage[1234]): Depend upon stage[1-4]-start, so + that make -j3 bootstrap works better. + +Sun Nov 24 02:09:39 1996 Jason Merrill + + * decl.c (pushtag): Do pushdecl for anon tags. + +Thu Nov 21 16:30:24 1996 Jason Merrill + + * typeck.c (c_expand_return): Fix logic. + (unary_complex_lvalue): Avoid unused warning on address of INIT_EXPR. + +Wed Nov 20 18:47:31 1996 Bob Manson + + * g++.c (main): Make sure arglist has a final NULL entry. Add + PEXECUTE_LAST to the flags passed to pexecute, as otherwise + stdin/stdout of the invoked program are redirected to + nowheresville. + +Tue Nov 19 16:12:44 1996 Jason Merrill + + * decl.c (implicitly_declare): Set DECL_ARTIFICIAL. + +Tue Nov 19 15:48:19 1996 Mike Stump + + * init.c (resolve_offset_ref): Handle obj.vfn better. + * typeck.c (build_component_ref): Set TREE_TYPE on result from + build_vfn_ref. + +Tue Nov 19 13:14:33 1996 Mike Stump + + * typeck.c (convert_for_assignment): Also handle anachronistic + implicit conversions from (::*)() to cv void*. + * cvt.c (cp_convert_to_pointer): Likewise. + +Mon Nov 18 17:05:26 1996 Jason Merrill + + * lex.c (handle_cp_pragma): Fix bogus warning. + +Mon Nov 18 16:10:43 1996 Mike Stump + + * cvt.c (cp_convert_to_pointer): Avoid thinking a POINTER_TYPE + (METHOD_TYPE) is a TYPE_PTRMEMFUNC_P. + +Thu Nov 14 23:18:17 1996 Jason Merrill + + * class.c (finish_struct_1): Support DWARF2_DEBUG. + * search.c (dfs_debug_mark): Likewise. + * decl2.c (finish_vtable_vardecl): Likewise. + * decl.c (pushtag, finish_enum): Likewise. + * lex.c (check_newline): Use debug_* instead of calling *out + functions directly. + +Thu Nov 14 15:21:46 1996 Brendan Kehoe + + * Make-lang.in (cplib2.ready): Add else clause to avoid problems + on some picky hosts. + +Wed Nov 13 12:32:07 1996 Jason Merrill + + * class.c (finish_struct_1): A class has a non-trivial copy + constructor if it has virtual functions. + + * cvt.c (cp_convert): Always call a constructor. + + * call.c (reference_binding): Still tack on a REF_BIND + for bad conversions. + (build_user_type_conversion_1): Propagate ICS_BAD_FLAG. + + * typeck.c (convert_arguments): Pass LOOKUP_ONLYCONVERTING. + (c_expand_return): Likewise. + * typeck2.c (digest_init): Likewise for { }. + * init.c (expand_aggr_init_1): Keep the CONSTRUCTOR handling. + * cvt.c (cp_convert): Handle failure better. + +Wed Nov 13 11:51:20 1996 Brendan Kehoe + + * g++.c (main): Also set PEXECUTE_SEARCH, to make the invocation + of GCC be path-relative. + +Wed Nov 13 11:27:16 1996 Michael Meissner + + * Make-lang.in (g++-cross): G++-cross doesn't need version.o, but + it does need choose-temp.o and pexecute.o. + +Wed Nov 13 07:53:38 1996 Brendan Kehoe + + * g++.c (error) [!HAVE_VPRINTF]: Put error back for the only time + that we still use it. + (P_tmpdir, R_OK, W_OK, X_OK) [__MSDOS__]: Delete unnecessary macros. + +Wed Nov 13 02:00:26 1996 Jason Merrill + + * init.c (expand_default_init): Avoid calling constructors to + initialize reference temps. + + * cvt.c (convert_to_reference): Fix. + +Tue Nov 12 19:10:07 1996 Jason Merrill + + * cvt.c (cp_convert): Simplify for flag_ansi_overloading. + (convert_to_reference): Likewise. + * typeck.c (convert_for_initialization): Likewise. + * init.c (expand_default_init): Likewise. + (expand_aggr_init_1): Likewise. + * cp-tree.h (CONV_NONCONVERTING): Lose. + * typeck.c (build_c_cast): Lose allow_nonconverting parm. + * *.c: Adjust. + * call.c (build_user_type_conversion_1): Assume LOOKUP_ONLYCONVERTING. + +Tue Nov 12 16:29:04 1996 Brendan Kehoe + + * pt.c (tsubst_expr): Reverse args to expand_start_catch_block. + +Tue Nov 12 15:26:17 1996 Jason Merrill + + * init.c (expand_aggr_init_1): Don't crash on non-constructor + TARGET_EXPR. + +Tue Nov 12 14:00:50 1996 Brendan Kehoe + + * g++.c: Include gansidecl.h. + (VPROTO, PVPROTO, VA_START): Delete. + (choose_temp_base_try, choose_temp_base, perror_exec, + run_dos) [__MSDOS__]: Delete fns. + (pfatal_with_name): Delete fn. + (temp_filename): Declare like in gcc.c. + (pexecute, pwait, choose_temp_base): Declare from gcc.c. + (error_count, signal_count): Define. + (error): Delete both definitions. + (PEXECUTE_{FIRST,LAST,SEARCH,VERBOSE}): Define from gcc.c. + (pfatal_pexecute): Add fn from gcc.c. + (main): Rename local VERBOSE var to VERBOSE_FLAG. Rewrite the + code to use the pexecute stuff also used by gcc.c. + (MIN_FATAL_STATUS): Define. + * Make-lang.in (g++): Add dependency on and linking with + choose-temp.o and pexecute.o. + + * cp-tree.h: Include gansidecl.h. + (STDIO_PROTO): Delete #undef/#define. + * cvt.c (NULL): Delete #undef/#define. + * expr.c (NULL): Likewise. + * init.c (NULL): Likewise. + * rtti.c (NULL): Likewise. + * xref.c (NULL): Likewise. + + * cp-tree.h (build_user_type_conversion): Add prototype. + * call.c (build_user_type_conversion): Delete prototype. Correct + decl of FLAGS arg to be an int. + * cvt.c (build_user_type_conversion): Likewise. + +Tue Nov 12 12:16:20 1996 Jason Merrill + + * cp-tree.def: Add TRY_BLOCK and HANDLER. + * except.c (expand_start_catch_block): Support templates. + * parse.y (try_block, handler_seq): Likewise. + * pt.c (tsubst_expr): Support TRY_BLOCK and HANDLER. + +Mon Nov 11 13:57:31 1996 Jason Merrill + + * pt.c (current_template_args): New fn. + (push_template_decl): Use it. + * decl.c (grokdeclarator): Use it. + + * decl2.c (build_expr_from_tree): Dereference ref vars. + + * decl.c (grokdeclarator): Generalize handling of TYPENAME_TYPEs in + the decl-specifier-seq. + + * decl.c (grok_op_properties): Don't force the type of a conversion + op to be complete. Don't warn about converting to the same type + for template instantiations. + + * decl2.c (finish_file): Don't call instantiate_decl on synthesized + methods. + +Mon Nov 11 13:20:34 1996 Bob Manson + + * typeck.c (get_delta_difference): Remove previous bogusness. + Don't give errors if force is set. + +Fri Nov 8 17:38:44 1996 Jason Merrill + + * decl2.c (finish_file): Don't emit debug info. + * decl.c (pushdecl): Lose obsolete code. + (grokdeclarator): Still do the long long thing after complaining. + * search.c (note_debug_info_needed): Don't do anything if we're in a + template. + * method.c (synthesize_method): For non-local classes, + push_to_top_level first. + +Fri Nov 8 11:52:28 1996 Bob Manson + + * typeck.c (get_delta_difference): Add no_error parameter. + (build_ptrmemfunc): Call get_delta_difference with no_error set; + we don't want error messages when converting unrelated + pointer-to-member functions. + +Thu Nov 7 11:16:24 1996 Mike Stump + + * error.c (dump_expr): Improve the wording on error messages that + involve pointer to member functions. + +Tue Nov 5 17:12:05 1996 Mike Stump + + * cvt.c (cp_convert_to_pointer): Move code for conversions from + (::*)() to void* or (*)() up a bit, so that we can convert from + METHOD_TYPEs as well. + +Tue Nov 5 14:54:17 1996 Jason Merrill + + * rtti.c (get_tinfo_fn): Make sure 'type' is permanent. + There are no 'member' types. + (get_tinfo_fn_dynamic): Diagnose typeid of overloaded fn. + (build_x_typeid): Handle errors. + +Mon Nov 4 17:43:12 1996 Mike Stump + + * typeck.c (convert_for_assignment): Handle anachronistic implicit + conversions from (::*)() to void* or (*)(). + * cvt.c (cp_convert_to_pointer): Likewise. + (cp_convert_to_pointer_force): Remove cp_convert_to_pointer + conversions from here. + * decl2.c (lang_decode_option): Add -W{no-,}pmf-conversions. + * lang-options.h: Likewise. + * decl2.c (warn_pmf2ptr): Define. + * cp-tree.h: Declare it. + * typeck2.c (digest_init): Allow pmfs down into + convert_for_initialization. + +Sun Nov 3 09:43:00 1996 Jason Merrill + + * typeck.c (c_expand_return): Fix for returning overloaded fn. + +Fri Nov 1 08:53:17 1996 Jason Merrill + + * cp-tree.h (DIRECT_BIND): Change from INDIRECT_BIND. + * decl.c (grok_reference_init): Pass DIRECT_BIND. + * cvt.c (build_up_reference): Don't mark 'this' addressable. Use + DIRECT_BIND. + * call.c (convert_like): Don't pass INDIRECT_BIND. + * typeck.c (convert_arguments): Likewise. + * typeck.c (mark_addressable): Allow &this if flag_this_is_variable. + +Thu Oct 31 17:08:49 1996 Jason Merrill + + * typeck.c (mark_addressable): Support TARGET_EXPR, unify with + similar code in build_up_ref. + * cvt.c (build_up_reference): Drastically simplify. + +Mon Oct 28 12:45:05 1996 Jeffrey A Law + + * typeck.c (signed_or_unsigned_type): If the given type already + as the correct signedness, then just return it. + + * typeck.c ({un,}signed_type): If can't do anything, call + signed_or_unsigned_type. + +Thu Oct 24 14:21:59 1996 Bob Manson + + * decl2.c (copy_assignment_arg_p): Don't buy the farm if + current_class_type is NULL. + +Wed Oct 23 00:43:10 1996 Jason Merrill + + * class.c (finish_struct_1): Avoid empty structs by adding a field + so layout_type gets the mode right. + + * typeck.c (c_expand_return): Drastically simplify. + +Mon Oct 21 22:34:02 1996 Jason Merrill + + * typeck.c (decay_conversion): Handle overloaded methods. + +Fri Oct 18 16:03:48 1996 Jason Merrill + + * call.c (build_over_call): A TARGET_EXPR has side-effects. + +Thu Oct 17 11:31:59 1996 Mike Stump + + * cvt.c (convert_to_pointer_force): Add code to support pointer to + member function to pointer to function conversions. + * init.c (resolve_offset_ref): Add code to allow faked up objects, + ignoring them if they are not used, and giving an error, if they + are needed. + * typeck.c (get_member_function_from_ptrfunc): Fold e1 to improve + code, and so that we can give an error, if we needed an object, + and one was not provided. + (build_c_cast): Don't call default_conversion when we want to + convert to pointer to function from a METHOD_TYPE. + +Mon Oct 14 00:28:51 1996 Jason Merrill + + * Make-lang.in (cplib2.ready): Fix logic. + + * decl.c (shadow_tag): Only complain about non-artificial function + members. + + * class.c (finish_struct_1): Add synthesized methods to TYPE_METHODS. + +Fri Oct 11 16:12:40 1996 Jason Merrill + + * expr.c (cplus_expand_expr): Pre-tweak call_target like + expand_inline_function would. + + * pt.c (mark_decl_instantiated): If extern_p, call + mark_inline_for_output. + +Thu Oct 10 15:58:08 1996 Mike Stump + + * typeck.c (unary_complex_lvalue): Add code to handle intermediate + pmd conversions. + + * typeck.c (get_delta_difference): Fix wording, as we can be used + for pointer to data members. + +Tue Oct 8 12:43:51 1996 Bob Manson + + * pt.c (tsubst): If the function decl isn't a member of this + template, return a copy of the decl (including copying the + lang-specific part) so we don't hose ourselves later. + +Thu Oct 3 16:24:28 1996 Jason Merrill + + * class.c (finish_struct): Remove DWARF-specific tag handling. + * decl.c (pushtag): Likewise. + (finish_function): Always clear DECL_ARGUMENTS on function decls with + no saved RTX. + * decl2.c (finish_file): Emit DWARF debugging info for static data + members. + +Wed Oct 2 21:58:01 1996 Bob Manson + + * decl.c (duplicate_decls): Make sure the old DECL_LANG_SPECIFIC + isn't the same as the new one before we whack it. + +Mon Sep 30 13:38:24 1996 Jason Merrill + + * class.c, cp-tree.h, cvt.c, decl.c, decl2.c, gxx.gperf, hash.h, + lex.c, method.c, parse.y, typeck.c, typeck2.c: Remove + warn_traditional and warn_strict_prototypes; remove ancient + 'overload' code; remove references to flag_traditional. + +Mon Sep 30 12:58:40 1996 Mike Stump + + * input.c (sub_getch): Handle 8-bit characters in string literals. + +Sun Sep 29 03:12:01 1996 Jason Merrill + + * tree.c (mapcar): Handle CONSTRUCTORs. + (copy_to_permanent): Handle expression_obstack properly. + + * Make-lang.in (cplib2.txt): Also depend on the headers. + + * rtti.c (get_tinfo_var): Don't assume that POINTER_SIZE == + INT_TYPE_SIZE. + (expand_class_desc): Use USItype for offset field. + * tinfo.h (struct __class_type_info): Likewise. + + * method.c (build_overload_int): TYPE_PRECISION should be applied + to types. + +Sat Sep 28 14:44:50 1996 Jason Merrill + + * call.c (build_new_op): A COND_EXPR involving void must be a + builtin. + +Fri Sep 27 16:40:30 1996 Jason Merrill + + * typeck.c (build_x_component_ref): New fn. + (build_object_ref): Use it. + * parse.y (primary): Use it. + * decl2.c (build_expr_from_tree): Use it. + * cp-tree.h: Declare it. + + * decl.c (start_decl): Variable-sized arrays cannot be initialized. + * error.c (dump_type_suffix): Handle variable arrays. + +Fri Sep 27 13:14:05 1996 Brendan Kehoe + + * Make-lang.in (exception.o): Put back compiling it with -fPIC. + +Fri Sep 27 03:00:09 1996 Jason Merrill + + * decl.c (lookup_name_real): Don't try to look up anything in a + TYPENAME_TYPE. + + * tinfo2.cc (__throw_type_match_rtti): Oops. + +Thu Sep 26 22:11:05 1996 Brendan Kehoe + + * Make-lang.in (exception.o): Use -fno-PIC for now. + +Thu Sep 26 10:59:00 1996 Jason Merrill + + * rtti.c (build_dynamic_cast): Pass tinfo fns rather than + calling them. + (get_tinfo_fn_dynamic): Extracted from build_typeid. + * tinfo2.cc (__dynamic_cast): Adjust. + + * rtti.c (build_typeid): Use resolves_to_fixed_type_p. + (build_x_typeid): Likewise. + + * parse.y: Call build_x_typeid instead of build_typeid. + * cp-tree.def: Add TYPEID_EXPR. + * pt.c (tsubst_copy): Handle typeid. + * decl2.c (build_expr_from_tree): Likewise. + * rtti.c (build_x_typeid): Throw bad_typeid from here. + (build_typeid): Not here. + * cp-tree.h: Declare build_x_typeid. + +Wed Sep 25 17:26:16 1996 Jason Merrill + + * call.c (convert_like): Pull out constant values. + + * tree.c (mapcar): Use build_cplus_array_type, not build_array_type. + +Wed Sep 25 17:28:53 1996 Michael Meissner + + * decl.c (init_decl_processing): Create short int types before + creating size_t in case a machine description needs to use + unsigned short for size_t. + +Tue Sep 24 18:18:44 1996 Jason Merrill + + * Make-lang.in (exception.o): Turn off pic. + + * tinfo2.cc (__throw_type_match_rtti): Fix cv-variants of the same + type, multi-level ptr conversions. + + * rtti.c (call_void_fn): Renamed and genericized from throw_bad_cast. + (throw_bad_cast): Use it. + (throw_bad_typeid): New fn. + (build_typeid): Throw bad_typeid as needed. + Use build_call. + (synthesize_tinfo_fn): Handle functions and arrays before checking + for cv-quals. + + * Remove .h from standard C++ headers, add new.h, move into inc + subdirectory. + + * exception*: Remove pointer from object, constructors. Add + default exception::what that uses type_info::name. Add + __throw_bad_typeid. + + * init.c (build_new): Don't add a cookie to new (void *) T[2]. + +Mon Sep 23 15:21:53 1996 Jason Merrill + + * Make-lang.in: Building C++ code depends on cc1plus. + +Mon Sep 23 12:38:40 1996 Brendan Kehoe + + * decl.c (struct saved_scope): Declare PROCESSING_TEMPLATE_DECL as + a HOST_WIDE_INT, not a tree. + +Mon Sep 23 12:36:02 1996 Jason Merrill + + * exception.cc: Don't include . + + * Make-lang.in (c++.clean): Remove cplib2.*. + +Mon Sep 23 09:42:19 1996 Doug Evans + + * parse.y (component_decl_1, component_costructor_declarator case): + Pass attributes/prefix_attributes in tree list. + +Mon Sep 23 01:18:50 1996 Jason Merrill + + * tinfo{,2}.cc: #include instead of . + +Sun Sep 22 05:31:22 1996 Jason Merrill + + * lex.c (do_identifier): Don't do deferred lookup in a template + header. + + * typeck2.c (store_init_value): Oops. + + * new.{h,cc}, exception.{h,cc}, typeinfo.h, tinfo{2.cc,.cc,.h}: + New files for C++ lang-support library. + * Make-lang.in (CXX_EXTRA_HEADERS): Define. + (CXX_LIB2FUNCS): Define. + And rules for building the C++ lang-support code. + * config-lang.in (headers): Define. + (lib2funcs): Define. + +Sat Sep 21 19:17:28 1996 Jason Merrill + + * decl2.c (build_expr_from_tree): If CONSTRUCTOR has a type, call + digest_init. + * pt.c (tsubst_copy): Compute type for CONSTRUCTOR. + * typeck2.c (store_init_value): Check for initializing pmf with { } + here. + (process_init_constructor): Not here. + +Thu Sep 19 16:41:07 1996 Jason Merrill + + * pt.c (begin_template_parm_list): Increment + processing_template_decl here. + (end_template_parm_list): Not here. + (process_template_parm): No need to add 1 to it now. + * *.c: Use processing_template_decl instead of current_template_parms + to check for being in a template. + + * pt.c (uses_template_parms): Handle SCOPE_REF. Fix CONSTRUCTOR. + (tsubst_copy): Handle CONSTRUCTOR. + (instantiate_decl): Set up context properly for variables. + * decl2.c (build_expr_from_tree): Handle CONSTRUCTOR. + * class.c (finish_struct): Reverse CLASSTYPE_TAGS. + +Wed Sep 18 13:30:20 1996 Brendan Kehoe + + * lex.c (enum tree_node_kind) [GATHER_STATISTICS]: Put the enum back. + +Wed Sep 18 04:24:07 1996 Jason Merrill + + * method.c (make_thunk): Call comdat_linkage before setting the + TREE_CODE. + + * decl2.c (comdat_linkage): Use make_decl_one_only. + (import_export_decl): Likewise. + * decl.c (init_decl_processing): Check supports_one_only instead of + SUPPORTS_WEAK. + +Sat Sep 14 08:34:41 1996 Jason Merrill + + * decl2.c (grokfield): Tighten checking for access decls. + + * decl.c (make_typename_type): Resolve references to + current_class_type. Set CLASSTYPE_GOT_SEMICOLON. + (lookup_name_real): Types that depend on a template parameter get + an implicit 'typename' unless they're in the current scope. + (start_decl_1): We don't care about incomplete types that depend + on a template parm. + (grokdeclarator): Resolve 'typename's in the type specifier that + refer to members of the current scope. + + * call.c (build_over_call): Remove 'inline called before + definition' diagnostic. + (build_method_call): Likewise. + * decl.c (duplicate_decls): Downgrade 'used before declared + inline' to a warning, only with -Winline. + +Fri Sep 13 17:31:40 1996 Stan Shebs + + * mpw-make.sed: Fix include paths, add @DASH_C_FLAG@ to compile. + +Wed Sep 11 22:38:13 1996 Gerald Baumgartner + + * call.c (build_method_call): When calling a signature + default implementation, as in other cases, let instance_ptr simply + be instance. + +Wed Sep 11 22:14:44 1996 Mike Stump + + * parse.y (simple_stmt): Cleanup and use do_poplevel (). + +Wed Sep 11 22:10:48 1996 Mike Stump + + * except.c (expand_start_catch_block): Add a pushlevel so that -g + works on hppa and SPARC. + +Wed Sep 11 10:18:06 1996 Brendan Kehoe + + * typeck.c (build_indirect_ref): Catch PTR being an error_mark_node. + +Mon Sep 9 19:51:14 1996 Gerald Baumgartner + + * call.c (build_over_call): Check first whether DECL_CONTEXT exists + before testing whether it's a signature. + +Sun Sep 8 16:06:57 1996 Gerald Baumgartner + + * call.c (build_new_method_call): Don't complain about signature + pointers and references not being an aggr type. + (build_this): If a signature pointer or reference was passed in, + just return it. + (build_new_method_call): If instance is a signature pointer, set + basetype to the signature type of instance. + * sig.c (build_signature_method_call): Deleted basetype and + instance parameters, they can be found as the DECL_CONTEXT of + function and as the first argument passed in. + * cp-tree.h: Changed declaration of build_signature_method_call. + * call.c (build_method_call): Deleted first two arguments in call + of build_signature_method_call. + (build_over_call): Added call to build_signature_method_call. + +Thu Sep 5 16:51:28 1996 Jason Merrill + + * typeck.c (build_c_cast): Don't tack a non_lvalue_expr onto a + target_expr. + +Thu Sep 5 10:05:38 1996 Brendan Kehoe + + * cvt.c (convert_to_reference): Use %#T, not %#D, for error. + +Wed Sep 4 17:16:09 1996 Bob Manson + + * except.c (expand_start_try_stmts): Move to except.c in the backend. + (expand_end_try_stmts): Remove. + + * init.c (perform_member_init): Use add_partial_entry () instead + of directly manipulating lists. + (emit_base_init): Likewise. + +Wed Sep 4 12:14:36 1996 Mike Stump + + * except.c (expand_exception_blocks): Always make sure USE and + CLOBBER insns that came at the end still do, the backend relies + upon this. + +Wed Sep 4 07:44:48 1996 Jason Merrill + + * call.c (build_over_call): We can only use a TARGET_EXPR of the + right type. + +Tue Sep 3 19:26:05 1996 Jason Merrill + + * cvt.c (convert_to_reference): Revert last change, don't complain + about temp without target decl. + +Tue Sep 3 10:22:56 1996 Mike Stump + + * decl.c (grokdeclarator): Don't core dump when void() is given. + +Tue Sep 3 02:38:56 1996 Jason Merrill + + * decl.c (copy_args_p): Don't crash. + +Fri Aug 30 14:26:57 1996 Mike Stump + + * pt.c (tsubst): And support template args inside the exception + specification. + + * pt.c (tsubst): Add support for exception specifications in + template functions. + +Fri Aug 30 10:01:55 1996 Mike Stump + + * cp-tree.def (DECL_STMT): Eliminate the throw spec field, only 3 + fields now. + * cp-tree.h (start_decl): Eliminate the throw spec parameter. + (start_function): Likewise. + (start_method): Likewise. + (grokfield): Likewise. + (make_call_declarator): Add throw spec parameter. + (set_quals_and_spec): Add routine. + * lex.c (set_quals_and_spec): Likewise. + * decl.h (grokdeclarator): Eliminate the throw spec parameter. + * decl.c (shadow_tag): Eliminate the throw spec parameter to + grokdeclarator. + (groktypename): Likewise. + (start_decl): Eliminate the throw spec parameter. Eliminate the + throw spec parameter to grokdeclarator. Eliminate the throw spec + field in DECL_STMT. + (cp_finish_decl): Eliminate the throw spec field in DECL_STMT. + (grokfndecl): Remove useless set of raises. + (grokdeclarator): Eliminate the throw spec parameter. Eliminate + the throw spec parameter to start_decl. Pull the throw spec out + of the call declarator. + (grokparms): Eliminate the throw spec parameter to grokdeclarator. + (start_function): Eliminate the throw spec parameter. Eliminate + the throw spec parameter to grokdeclarator. + (start_method): Likewise. + * decl2.c (grokfield): Likewise. + (grokbitfield): Eliminate the throw spec parameter to grokdeclarator. + (grokoptypename): Likewise. + (finish_file): Eliminate the throw spec parameter to + start_function. Add throw spec to make_call_declarator. + * except.c (init_exception_processing): Add throw spec to + make_call_declarator. Eliminate the throw spec parameter to + start_decl. + (expand_start_catch_block): Eliminate the throw spec parameter to + grokdeclarator. + (expand_builtin_throw): Add throw spec to make_call_declarator. + Eliminate the throw spec parameter to start_function. + (start_anon_func): Likewise. + * lex.c (make_call_declarator): Add throw spec parameter. + (set_quals_and_spec): New routine. + (cons_up_default_function): Add throw spec to make_call_declarator. + Eliminate the throw spec parameter to grokfield. + * method.c (synthesize_method): Eliminate the throw spec parameter + to start_function. + * pt.c (process_template_parm): Eliminate the throw spec parameter + to grokdeclarator. + (tsubst): Add throw spec to make_call_declarator. + (tsubst_expr): Eliminate the throw spec parameter to start_decl. + (do_function_instantiation): Eliminate the throw spec parameter to + grokdeclarator. Eliminate the throw spec parameter to + start_function. + * rtti.c (synthesize_tinfo_fn): Eliminate the throw spec parameter + to start_function. + * parse.y (datadef): Remove non-winning optimization. + (decl): Likewise. + (fndef): Remove ambiguous error productions uncovered by grammar + fixing. + (constructor_declarator): Add exception_specification_opt here. + (component_constructor_declarator): Likewise. + (direct_after_type_declarator): Likewise. + (complex_direct_notype_declarator): Likewise. + (direct_abstract_declarator): Likewise. + (fn.def1): Remove exception_specification_opt. + (fn.def2): Likewise. + (condition): Likewise. + (initdcl0): Likewise. + (initdcl): Likewise. + (notype_initdcl0): Likewise. + (nomods_initdcl0): Likewise. + (component_decl_1): Likewise. + (component_declarator): Likewise. + (after_type_component_declarator0): Likewise. + (after_type_component_declarator): Likewise. + (notype_component_declarator): Likewise. + +Wed Aug 28 01:40:30 1996 Jason Merrill + + * call.c (build_over_call): Also use an INIT_EXPR when + initializing anything from an rvalue. + + * call.c (build_over_call): Call stabilize_reference when building + an INIT_EXPR instead of calling the copy ctor. + + * call.c (joust): Extend the previous change to all comparisons. + + * decl2.c, method.c, lex.c: Use MAKE_DECL_ONE_ONLY and + NO_LINKAGE_HEURISTICS. + + * decl2.c (finish_file): Emit any statics that weren't already. + + * typeck.c (build_static_cast): Implement. + * tree.c (build_cplus_new): Handle getting a TARGET_EXPR. + * decl.c (grokparms): Use can_convert_arg instead of + implicit_conversion directly. + (copy_args_p): New fn. + * cvt.c (convert_to_reference): Don't complain about temp with + static_cast. + (build_up_reference): Handle TARGET_EXPRs. + * call.c (build_over_call): Elide unnecessary temps. + (can_convert*): Use new overloading code. + +Tue Aug 27 13:12:21 1996 Jason Merrill + + * call.c: Move TYPE_PTR*_MACROS ... + * cp-tree.h: To here. + * typeck.c (build_reinterpret_cast): Implement. + + * call.c (add_builtin_candidate): Use TYPE_PTROB_P instead of + ptr_complete_ob. + (joust): If we're comparing a function to a builtin and the worst + conversion for the builtin is worse than the worst conversion for the + function, take the function. + + * typeck.c (build_const_cast): Implement. + (comp_ptr_ttypes_const): Like comp_ptr_ttypes, for const_cast. + (comp_ptr_ttypes_reinterpret): Like cpt, for reinterpret_cast. + +Tue Aug 27 13:14:58 1996 Bob Manson + + * rtti.c (build_dynamic_cast): Don't try to dereference exprtype + too early. Make sure we explode if exprtype turns out to be a + NULL_TREE when it shouldn't be. + +Tue Aug 27 10:56:21 1996 Mike Stump + + * cp-tree.h: New routine make_call_declarator. + * lex.c (make_call_declarator): Define it. + * except.c (init_exception_processing): Use it. + (expand_builtin_throw): Likewise. + (start_anon_func): Likewise. + * decl2.c (finish_file): Likewise. + * lex.c (cons_up_default_function): Likewise. + * parse.y: Likewise. + * pt.c (tsubst): Likewise. + +Mon Aug 26 17:40:03 1996 Mike Stump + + * decl2.c (groktypefield): Remove unused code. + +Mon Aug 26 17:00:33 1996 Mike Stump + + * gxx.gperf: Change TYPE_QUAL into CV_QUALIFIER. + * parse.y: Likewise. Change maybe_type_qual into maybe_cv_qualifier. + Change type_quals into cv_qualifiers. Change nonempty_type_quals into + nonempty_cv_qualifiers. + * hash.h: Rebuild. + + * lex.c (make_pointer_declarator): Change type_quals into + cv_qualifiers. + (make_reference_declarator): Likewise. + +Thu Aug 22 01:09:22 1996 Jason Merrill + + * decl.c (start_function): Only check interface_* for templates + with flag_alt_external_templates. + + * call.c (build_new_op): Check for comparison of different enum types. + (build_over_call): Fix arg # output. + + * typeck.c (build_component_ref): Handle pre-found TYPE_DECL. + +Wed Aug 21 00:13:15 1996 Jason Merrill + + * call.c (build_new_op): Check for erroneous args. + + * call.c (build_new_method_call): Add missing args to cp_error. + + * tree.c (error_type): Don't print reference-to-array. + + * typeck.c (convert_for_assignment): Don't say contravariance for + removing const. + +Tue Aug 20 13:23:00 1996 Jason Merrill + + * call.c (build_over_call): Diagnose bad convs for `this'. + + * lex.c (cons_up_default_function): Set DECL_ARTIFICIAL + on _ctor_arg. + + * call.c (convert_like): Handle bad convs. + (build_over_call): Handle bad convs better. + + * decl2.c: -fansi-overloading is now the default. + + * call.c (build_new_method_call): Check for erroneous args. + + * pt.c (instantiate_class_template): Propagate + TYPE_USES_MULTIPLE_INHERITANCE. + +Tue Aug 20 13:09:57 1996 Mike Stump + + * call.c (enforce_access): Add static to routine. + +Sun Aug 18 14:35:54 1996 Jason Merrill + + * call.c (build_user_type_conversion_1): Fix bad handling. + (compare_ics): Likewise. + +Sat Aug 17 21:54:11 1996 Jason Merrill + + * call.c (standard_conversion): Oops. + +Sat Aug 17 16:28:11 1996 Geoffrey Noer + + * g++.c: Update test for win32 (&& ! cygwin32). + +Sat Aug 17 03:45:31 1996 Jason Merrill + + * typeck.c (comp_ptr_ttypes_real): Handle OFFSET_TYPEs properly. + (ptr_reasonably_similar): New fn. + * call.c (BAD_RANK): New rank. + (ICS_BAD_FLAG): New macro. + (standard_conversion): Handle almost-right pointer conversions. + (reference_binding): Handle bad rvalue bindings. + (add_*_candidate): Stuff. + (build_over_call): Pass bad conversions to convert_for_initialization. + (compare_ics): Handle bad convs. + (joust): Likewise. + +Fri Aug 16 15:02:19 1996 Bob Manson + + * init.c (expand_vec_init): Use ptrdiff_type_node instead of + integer_type_node when computing pointer offsets. + +Fri Aug 16 01:28:32 1996 Jason Merrill + + * tree.c (lvalue_type): New fn. + (error_type): New fn. + * call.c (op_error): Use error_type. + (add_conv_candidate): Use lvalue_type. + (add_builtin_candidates): Likewise. + * error.c (args_as_string): Use error_type. + +Thu Aug 15 17:27:13 1996 Jason Merrill + + * pt.c (instantiate_decl): Evaluate DECL_INITIAL of a VAR_DECL here. + (tsubst): Not here. + + * decl.c (init_decl_processing): With -ansi, __null's type is the + signed integral type with the same number of bits as a pointer. + Introduce a new variable null_node for it. + * cp-tree.h: Adjust. + * call.c (null_ptr_cst_p): Adjust. + +Thu Aug 15 17:09:54 1996 Mike Stump + + * except.c (do_unwind): Mark %i7 as used on the SPARC so we can + optimize. + +Thu Aug 15 01:36:49 1996 Jason Merrill + + * decl2.c (import_export_decl): Ignore #pragma interface for tinfo + fns of classes without virtual functions. + + * call.c (add_function_candidate): Handle `this' specially. + (compare_ics): Likewise. + +Tue Aug 13 12:16:10 1996 Jason Merrill + + * typeck.c (build_conditional_expr): Fix handling of __null. + + * decl2.c (comdat_linkage): New fn. + (import_export_vtable): Use it. + (import_export_decl): Use it. + * method.c (make_thunk): Use it. + +Mon Aug 12 00:09:18 1996 Jason Merrill + + * pt.c (end_template_decl): If we don't actually have parms, return. + * parse.y (template_header): Accept 'template <>'. + + * errfn.c: Allow 5 args. + +Sun Aug 11 15:20:58 1996 Jason Merrill + + * tree.c (make_temp_vec): New fn. + * pt.c (push_template_decl): Handle partial specs. + (instantiate_class_template): Likewise. + (more_specialized): Use get_bindings. + (more_specialized_class): New fn. + (get_class_bindings): New fn. + (most_specialized_class): New fn. + (do_function_instantiation): List candidates for ambiguous case. + * decl.c (duplicate_decls): Lose reference to DECL_TEMPLATE_MEMBERS. + (shadow_tag): Call push_template_decl for partial specializations. + * parse.y: Likewise. + * cp-tree.h (DECL_TEMPLATE_SPECIALIZATIONS): Replaces + DECL_TEMPLATE_MEMBERS. + * call.c (print_z_candidates): Reduce duplication. + +Fri Aug 9 14:36:08 1996 Jason Merrill + + * decl2.c (lang_decode_option): Allow -fansi-overloading. + +Thu Aug 8 17:04:18 1996 Jason Merrill + + * pt.c (get_bindings): New fn. + (most_specialized): Likewise. + (do_function_instantiation): Use them. + (add_maybe_template): New fn. + * cp-tree.h (DECL_MAYBE_TEMPLATE): New macro. + * call.c (build_new_op): Handle guiding decls. + (build_new_function_call): Likewise. + * decl2.c (finish_file): Likewise. + + * decl2.c (mark_used): Do synthesis here. + * call.c (build_method_call): Not here. + (build_over_call): Or here. + * typeck.c (build_function_call_real): Or here. + * tree.c (bot_manip): Call mark_used on functions used in default + args. + +Thu Aug 8 17:48:16 1996 Michael Meissner + + * decl2.c (import_export_vtable): Delete code that disabled vtable + heuristic on systems with ASM_OUTPUT_EXTERNAL. + +Wed Aug 7 12:44:11 1996 Jason Merrill + + * typeck.c (build_x_function_call): Handle static call context + better. + + * decl.c (finish_function): Set the DECL_CONTEXT of the result to + the function, not its outer block. + + * call.c (build_field_call): Pass fields on to build_opfncall + regardless of TYPE_OVERLOADS_CALL_EXPR. + (build_method_call): Pass on to build_new_method_call sooner. + + * typeck.c (build_ptrmemfunc): Just return what instantiate_type + gives us. + * class.c (instantiate_type): Don't put a POINTER_TYPE to + METHOD_TYPE on an expression. Also make a copy of rhs instead of + modifying it. + +Tue Aug 6 12:58:46 1996 Jason Merrill + + * call.c (compare_ics): Handle qual_conv after lvalue_conv. + (add_builtin_candidate): Don't take enums for ++. + (build_new_method_call): Handle non-aggregates and field calls. + Move new overloading code from... + * cvt.c: Here. + + * decl.c (grokparms): Don't check default args in templates. + +Mon Aug 5 17:17:06 1996 Jason Merrill + + * cvt.c (build_new_op): Fix args to build_unary_op. + (add_builtin_candidates): Don't call type_promotes_to on float. + + * decl.c (grokparms): Check the type of the default arg. + + * cvt.c (build_new_op): Pass non-overloaded cases on rather than + returning NULL_TREE. + + * typeck.c (build_x_binary_op): Avoid doing extra work. + (build_x_unary_op): Likewise. + (build_x_conditional_expr): Likewise. + * cvt.c (build_over_call): Return. + (add_builtin_candidate): Fix MEMBER_REF. + (build_new_op): Likewise. + +Mon Aug 5 17:07:47 1996 Mike Stump + + * method.c (build_overload_name): Put bug fix into code but leave + disabled for now so we can be bug compatible with older releases + that do repeats incorrectly. In the future, we can enable it. + +Mon Aug 5 13:46:28 1996 Jason Merrill + + * cvt.c (convert_like): Don't call build_cplus_new twice. + + * call.c, cp-tree.h, cvt.c, decl2.c, init.c, method.c, pt.c, typeck.c: + Control new overloading code with -fansi-overloading. + +Sun Aug 4 15:29:11 1996 Jason Merrill + + * cvt.c (build_over_call): Call build_cplus_new. + * call.c (build_method_call): Likewise. + * typeck.c (build_function_call_real): Likewise. + (build_conditional_expr): If both operands are TARGET_EXPRs, wrap + the COND_EXPR in a TARGET_EXPR so they use the same slot. + + * cvt.c (build_up_reference): Propagate INDIRECT_BIND to + recursive calls. + * typeck.c (complete_type): Propagate + TYPE_NEEDS_{CONSTRUCTING,DESTRUCTOR}. + +Sat Aug 3 14:05:07 1996 Jason Merrill + + * cvt.c (joust): More ?: kludging. Sigh. + (build_over_call): Don't try to synthesize global fns. + + * search.c (lookup_conversions): Use binfo marking. + +Sat Aug 3 12:33:42 1996 Bob Manson + + * search.c (build_mi_matrix): Use the correct value of cid + when determining the new mi_size. + +Sat Aug 3 01:27:41 1996 Jason Merrill + + * cvt.c (add_builtin_candidates): Do consider type conversion ops + for the first parms of += et al. + (strip_top_quals): New fn. + (reference_binding): Use it instead of TYPE_MAIN_VARIANT. + (implicit_conversion): Likewise. + (add_builtin_candidates): Be careful about arrays. + (build_new_method_call): Handle vtable optimization. + +Fri Aug 2 01:26:59 1996 Jason Merrill + + * cp-tree.h (LOOKUP_NO_TEMP_BIND): New flag. + * cvt.c (reference_binding): Use it. + (implicit_conversion): Use it. + (add_builtin_candidate, COND_EXPR): Use it. + + * cvt.c (build_new_function_call): Check for error args. + + * typeck.c (comptypes): Just check DERIVED_FROM_P, not UNIQUELY. + + * gxx.gperf: Add __null. + * hash.h: Regenerate. + * lex.h: Add RID_NULL. + * lex.c (init_lex): Create null_pointer_node here, stick it in + RID_NULL. + * decl.c (init_decl_processing): Still set its type here. + * cvt.c (cp_convert_to_pointer): Don't produce null_pointer_node. + (convert_to_pointer_force): Likewise. + (null_ptr_cst_p): Check for null_pointer_node; only accept (void*)0 + if (! pedantic). + * call.c (convert_harshness): Use null_ptr_cst_p. + * typeck.c (convert_for_assignment): Likewise. Don't produce + null_pointer_node. + + * error.c (args_as_string): Handle lists of actual args, too. + * cvt.c (null_ptr_cst): Support (void*)0 for now. + (build_user_type_conversion_1): Improve diagnostics. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (build_new_method_call): Likewise. Move call before def diagnostic... + (build_over_call): Here. + + * cvt.c (build_new_method_call): Don't complain about no match if + LOOKUP_SPECULATIVELY. + (build_over_call): Fix 'this' for virtual fn. + (build_new_method_call): Add diagnostic. + +Thu Aug 1 16:45:09 1996 Jason Merrill + + * cvt.c (add_function_candidate): Expect 'this' and 'in_chrg' for + constructors to be passed in. + (build_over_call): Likewise. + (build_user_type_conversion_1): Pass them in. + (convert_like): Likewise. + (build_object_call): Handle overloaded conversions. + (build_over_call): Pass the right args to build_vfn_ref. + (standard_conversion): Fix pmf convs. + (joust): Handle comparing statics and non-statics. + (build_new_method_call): New fn. + * call.c (build_method_call): Call it if NEW_OVER. + +Thu Aug 1 16:06:14 1996 Mike Stump + + * lex.c (do_identifier): Don't use %O on IDENTIFIER_OPNAME_Ps, use + %D instead. + +Thu Aug 1 15:24:02 1996 Mike Stump + + * except.c (expand_throw): Use maybe_build_cleanup_and_delete + instead of just maybe_build_cleanup so that we deallocate the + thrown object. + +Thu Aug 1 15:18:00 1996 Brendan Kehoe + + * decl2.c (finish_prevtable_vardecl): Make non-static for pt.c's use. + * cp-tree.h (finish_prevtable_vardecl): Add decl. + +Thu Aug 1 11:53:51 1996 Bob Manson + + * pt.c (instantiate_class_template): Call complete_type. Also, if + we're at the end of the file and we just instantiated a template + class with a vtable, call finish_prevtable_vardecl. + + * error.c (dump_decl): Don't explode (or explode more gracefully + as appropriate) if the object being dumped has a null type. + (dump_expr): Likewise. + + * search.c (build_mi_matrix): Ensure that mi_size is large enough, + by counting the number of nodes that we'll need before allocating + the array. + (lookup_fnfields): Fix comment. + (breadth_first_search): Fix comment. + +Wed Jul 31 09:57:05 1996 Jason Merrill + + * pt.c (instantiate_class_template): Propagate TYPE_PACKED and + TYPE_ALIGN. + * class.c (finish_struct): Call cplus_decl_attributes here. + (finish_struct_1): Not here. + * cp-tree.h: Adjust. + + * pt.c (type_unification): New parameter STRICT. + (unify): If STRICT, don't allow cv addition or base deduction. + * call.c, class.c, cvt.c, cp-tree.h: Adjust. + +Tue Jul 30 13:06:13 1996 Jason Merrill + + * search.c (get_template_base{_recursive}): New fns. + * pt.c (more_specialized): New fn. + (do_function_instantiation): Use it. + (unify): Handle base deduction. + * cvt.c (joust): Use more_specialized. + Don't arbitrarily choose between non-builtin candidates. + (build_over_call): Call require_complete_type. + + * decl.c (start_function): Statics are static even in a #pragma + interface file. + + * decl2.c (import_export_vtable): Disable vtable heuristic on + systems with ASM_OUTPUT_EXTERNAL. + + * cvt.c (compare_ics): Fix comparison of PMEM_CONV and BASE_CONV. + (standard_conversion): No std conv to enum type. + + * cvt.c (standard_conversion): Fix order of args to DERIVED_FROM_P + for ptm's. + + * cvt.c (reference_binding): Bind directly to a base subobject of + a class rvalue. + + * cvt.c (build_new_op): Enforce access control. + +Tue Jul 30 09:22:53 1996 Bob Manson + + * typeck2.c (process_init_constructor): When scanning the + union for a named field, skip things that aren't FIELD_DECLs. + + * method.c (synthesize_method): Don't scan fndecl's rtl if + we're at the end of the file; just assume the function can't + be inlined. + +Mon Jul 29 15:48:30 1996 Jason Merrill + + * cvt.c (build_builtin_candidate): Stick a dummy conversion in if + it failed. + + * cvt.c (build_user_type_conversion_1): Handle overloaded + conversion ops. + + * cvt.c (add_builtin_candidates): Don't consider type conversion + operators for the first parameter of operator=. + +Mon Jul 29 15:33:55 1996 Bob Manson + + * typeck.c (complete_type): Only call layout_type if we're not + expanding a template. + +Mon Jul 29 14:40:38 1996 Jason Merrill + + * cvt.c (compare_ics): Oops. + + * cvt.c (op_error): Oops. + + * cp-tree.def: Add RVALUE_CONV, rename EXACT_CONV to IDENTITY_CONV. + * cvt.c: Add IDENTITY_RANK before others. Use real_lvalue_p. + (build_conv): Use them. + (implicit_conversion): Use them. + (convert_like): Handle them. + (build_new_op): Handle builtin COND_EXPR again. + (add_builtin_candidates): Strip cv-quals. Fix oops. Include enums + in lists of types for COND_EXPR. + (add_builtin_candidate): Add enum candidates for COND_EXPR. + +Mon Jul 29 12:05:40 1996 Bob Manson + + * typeck.c (build_modify_expr): Always attempt to build a call to + the assignment operator, even if we're using a default one. + (convert_for_initialization): Call complete_type. + +Mon Jul 29 11:25:08 1996 Jason Merrill + + * cvt.c (reference_binding): A REF_BIND gets the reference type. + (implicit_conversion): Likewise. + (convert_like): Likewise. + (compare_ics): Likewise. + (compare_qual): Likewise. + (print_z_candidates): Handle no candidates. + (build_new_op): Don't handle builtin COND_EXPR for now. + +Sat Jul 27 11:27:47 1996 Stan Shebs + + * cvt.c (build_builtin_candidate): Init local var in an ANSI way. + +Fri Jul 26 01:07:22 1996 Jason Merrill + + * cvt.c (joust): If the candidates are the same, arbitrarily pick one. + + * cvt.c (build_builtin_candidate): Oops. + (build_new_op): Oops. + + * method.c (build_opfncall): Pass COND_EXPR on. + * cvt.c (build_builtin_candidate): Reorganize, support COND_EXPR. + (add_builtin_candidate{,s}): Likewise. + (add_builtin_candidates): Likewise. + (print_z_candidates, op_error, build_new_op): Likewise. + (type_decays_to): New fn. + * lex.c (init_lex): Just say ?: for COND_EXPR. + +Thu Jul 25 09:33:33 1996 Jason Merrill + + * typeck.c (complete_type): Call layout_type rather than building + a new array type. + + * cvt.c (add_builtin_candidate): Pointer arithmetic candidates + only use ptrdiff_t. + +Wed Jul 24 12:45:08 1996 Jason Merrill + + * cvt.c: Always compile the new overloading code (but don't use it). + (implicit_conversion): Add a BASE_CONV when converting to + the same class type. + (convert_like): Handle BASE_CONV. + +Tue Jul 23 12:46:30 1996 Jason Merrill + + * cvt.c (build_new_op): Support {MAX,MIN}_EXPR. + (add_builtin_candidate): Likewise. + + NEW_OVER changes: + * typeck.c (build_x_function_call): Try an operator function + whenever we call an object of class type. + * method.c (build_opfncall): Pass CALL_EXPRs through. + * cvt.c (implicit_conversion): Do const-ref case first. + (add_conv_candidate, build_object_call, op_error): New fns. + (ptr_complete_ob, TYPE_PTROB_P): void is not an object type. + ({add,build}_builtin_candidate{,s}, print_z_candidates): Display + builtin candidates. + (build_new_op): Handle CALL_EXPR. Don't try to decay void. + Fall back on preincrement handling. Use op_error. + Handle warn_synth. + (convert_like): Pass INDIRECT_BIND. Don't try to do anything with + an error_mark_node. + (build_over_call): Handle PROMOTE_PROTOTYPES and ellipsis promotions + properly. + +Mon Jul 22 16:21:55 1996 Bob Manson + + * pt.c (tsubst_expr): Handle CONTINUE_STMT. + +Mon Jul 22 15:38:58 1996 Mike Stump + + * typeck.c (build_component_ref_1): Use build_component_ref + instead of open coding it here. + +Mon Jul 22 12:18:54 1996 Jason Merrill + + * g++.c (main): Don't link with -lg++. + + NEW_OVER changes: + * cvt.c (convert_to_reference): Don't use convert_from_reference on + result of build_type_conversion. + (cp_convert): Only call build_method_call for ctors if + build_type_conversion failed. + (ptr_complete_ob): New function. + (TYPE_PTR{,OB,MEM}_P): New macros. + ({add,build}_builtin_candidate{,s}): New functions. + (print_z_candidates): Handle builtins. + (build_user_type_conversion_1): Don't use conversion fns for + converting to a base type. + (build_user_type_conversion_1): Set ICS_USER_FLAG on AMBIG_CONVs. + (build_user_type_conversion): Use convert_from_reference. + (build_new_op): New function. + (build_over_call): Fix handling of methods. + (compare_ics): Handle AMBIG_CONV properly. + * typeck2.c: Increment abort count. + * method.c (build_opfncall): Forward most requests to build_new_op. + * cp-tree.h (IS_OVERLOAD_TYPE): Tweak. + +Fri Jul 19 17:59:29 1996 Brendan Kehoe + + * error.c (dump_expr, case CONSTRUCTOR, case CAST_EXPR): Take out + invalid second argument to dump_expr_list. + +Fri Jul 19 14:04:05 1996 Mike Stump + + * decl.c (lookup_name_real): Make sure we do obj->X::i correctly. + +Thu Jul 18 14:48:23 1996 Bob Manson + + * decl2.c (import_export_vtable): ASM_OUTPUT_EXTERNAL, not + ASSEMBLE_EXTERNAL. + +Mon Jul 15 17:48:43 1996 Mike Stump + + * typeck2.c (process_init_constructor): New pedwarn for using { } + to initialize a pointer to member function. + * typeck.c (build_ptrmemfunc1): Avoid use of digest_init so that + we can avoid the new error. + +Mon Jul 15 15:42:03 1996 Mike Stump + + * typeck.c (build_ptrmemfunc1): New function to hide details of + pointer to member functions better. + +Mon Jul 15 14:23:02 1996 Mike Stump + + * init.c (resolve_offset_ref): Resolve OFFSET_REFs that are + methods into the actual method, as we know the implied object is + not used. + +Mon Jul 15 13:08:29 1996 Brendan Kehoe + + * parse.y (maybecomma_warn): Only emit the pedwarn if we're not + inside a system header. + +Fri Jul 12 16:30:05 1996 Bob Manson + + * call.c (build_method_call): Call complete_type on the + instance type. + +Thu Jul 11 17:16:40 1996 Mike Stump + + * typeck.c (build_component_ref): Always build up an OFFSET_REF + for obj_ptr->func so that we can know which object to use in a + method call. + +Wed Jul 10 19:36:37 1996 Mike Stump + + * typeck.c (build_ptrmemfunc): Remove sorry, now we can cast + around things. Also improve maintainability. + +Wed Jul 10 18:20:11 1996 Bob Manson + + * decl.c (grokdeclarator): Check for overflow when evaluating an + array dimension. + +Wed Jul 10 17:26:19 1996 Jason Merrill + + * cvt.c (cp_convert): Don't check for ambiguity with constructor + if NEW_OVER. + + * typeck.c (build_x_function_call): Pass function overload + questions to new overloading code if NEW_OVER. + * init.c (expand_aggr_init_1): Only check for type conversion ops + if we're doing copy-initialization (i.e. LOOKUP_ONLYCONVERTING). + Don't check for ambiguity with constructor if NEW_OVER. + * cvt.c (convert_to_reference): Dereference the result of a type + conversion operator. + (build_conv): Propagate ICS_USER_FLAG. + (implicit_conversion): Call instantiate_type. + Pass LOOKUP_ONLYCONVERTING instead of LOOKUP_NORMAL. + (add_function_candidate): Fix cv-quals on argtype. + (print_z_candidates): New function. + (build_new_function_call): Call it. + (build_user_type_conversion_1): If LOOKUP_ONLYCONVERTING, don't + consider non-converting constructors. + Call print_z_candidates. + Return an AMBIG_CONV for an ambiguous conversion. + (build_user_type_conversion): Handle AMBIG_CONV. + (convert_like): Fix test for building TARGET_EXPR. + Call instantiate_type. + Handle AMBIG_CONV and LVALUE_CONV. + (build_over_call): Handle 0 args and ellipsis. + * cp-tree.def: Add AMBIG_CONV. + +Tue Jul 9 17:48:48 1996 Mike Stump + + * decl.c (lookup_name_real): If we find mem in obj when parsing + `obj->mem', make sure we return the right value. + +Tue Jul 9 16:11:28 1996 Bob Manson + + * search.c (get_base_distance): Call complete_type. + +Tue Jul 9 12:46:34 1996 Mike Stump + + * decl.c (store_bindings): Make static. + +Mon Jul 8 16:42:31 1996 Jason Merrill + + * init.c (expand_aggr_init_1): Don't check type conversions if + NEW_OVER. + + * cvt.c (z_candidate): Put back template field. + (add_function_candidate): Set it. + (add_template_candidate): Likewise. + (joust): Use it. + (compare_qual): Handle references and pointers to members. + (compare_ics): Handle reference bindings. + + * decl.c (duplicate_decls): Propagate DECL_ONE_ONLY. + +Mon Jul 8 16:18:56 1996 Bob Manson + + * call.c (compute_conversion_costs): Call complete_type. + + * tree.c (vec_binfo_member): Use comptypes instead of comparing + pointers, so we can handle template parameters. + +Fri Jul 5 16:51:53 1996 Bob Manson + + * cvt.c (cp_convert_to_pointer): We have to call complete_type + here; let's make it explicit instead of a side effect of an + error check. + +Wed Jul 3 16:29:51 1996 Jason Merrill + + * cvt.c (z_candidate): Remove template field. + (reference_binding): Handle binding to temporary. + (implicit_conversion): Likewise. + (add_function_candidate): Handle artificial constructor parms. + Handle functions with too few parms. + (add_template_candidate): New function. + (build_user_type_conversion_1): Handle constructors. + (convert_like): Likewise. + (build_over_call): Likewise. + (build_new_function_call): Support templates. + (compare_ics): Fix reference, inheritance handling. + +Mon Jul 1 22:58:18 1996 Bob Manson + + * decl.c: Add signed_size_zero_node. + (init_decl_processing): Build it. + * class.c (prepare_fresh_vtable): Use it instead of size_zero_node + when we're trying to make a negative delta. + +Mon Jul 1 17:56:19 1996 Brendan Kehoe + + Stop doing this damn index==strchr variable name confusion. + * class.c (add_virtual_function): Change local var INDEX to be + named IDX. + (add_method): Likewise. + * lex.c (print_parse_statistics): Likewise. + * search.c (make_memoized_table_entry): Likewise. + (lookup_fnfields_here): Likewise. + (lookup_field): Likewise. + (lookup_fnfields): Likewise. + (get_baselinks): Likewise. + * sig.c (build_signature_table_constructor): Likewise. + (build_signature_method_call): Likewise. + * typeck.c (build_x_array_ref): Change INDEX parm to be named IDX. + (get_member_function_from_ptrfunc): Likewise. + (build_ptrmemfunc): Change local var INDEX to be IDX. + (c_expand_start_case): Likewise. + +Sat Jun 29 14:05:46 1996 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Move user-defined type conversion + handling to before extraction of TYPE_PTRMEMFUNC_FN_TYPE. + (convert_to_reference): Use build_type_conversion to convert to + the reference type directly. + (standard_conversion): Fix void* case, non-conversions. + (reference_binding): Fix expr == 0 case, non-conversions. + (convert_like): Support REF_BIND. + (compare_qual): Split out from compare_ics. + (compare_ics): Use it, handle icses with only a qual_conv. + + * init.c (expand_vec_init): Don't crash if decl is NULL. + +Fri Jun 28 11:52:51 1996 Stan Shebs + + * mpw-config.in: New file, configury for Mac MPW. + * mpw-make.sed: New file, makefile editing for MPW. + +Thu Jun 27 15:18:30 1996 Jason Merrill + + * pt.c (instantiate_class_template): Call repo_template_used. + + * search.c (lookup_conversions): Only lookup conversions in + complete types. + +Thu Jun 27 12:59:53 1996 Brendan Kehoe + + * cp-tree.def: Renamed from tree.def, to avoid confusion with + gcc's tree.def. + * cp-tree.h, lex.c: Include cp-tree.def. + * Makefile.in (CXX_TREE_H): Reference cp-tree.def. + +Wed Jun 26 18:29:47 1996 Bob Manson + + * init.c (build_vec_delete_1): Call complete_type. + +Mon Jun 24 17:17:32 1996 Mike Stump + + * except.c (start_anon_func): Make sure anonymous functions are + never external. + +Fri Jun 21 15:10:58 1996 Jason Merrill + + * decl.c (finish_function): If function_depth > 1, set nested. + + * decl2.c (grokbitfield): Revert Bob's change. + * class.c (finish_struct_1): Fix handling of named bitfield widths. + +Thu Jun 20 23:35:38 1996 Jason Merrill + + * pt.c (add_pending_template): Handle types. + (lookup_template_class): With -fexternal-templates, just add the class + to pending_templates instead of instantiating it now. + * decl2.c (finish_file): Handle types in pending_templates. + +Thu Jun 20 14:08:40 1996 Bob Manson + + * decl2.c (grokbitfield): Handle constant decls appropriately. + Give an appropriate error message now instead of spewing core + later. + +Thu Jun 20 13:01:51 1996 Jason Merrill + + * decl2.c: Don't turn on thunks by default for now. + +Wed Jun 19 11:37:04 1996 Jason Merrill + + * typeck.c (complete_type): Handle error_mark_node. + (common_type, OFFSET_TYPE): Handle template_type_parms. + +Tue Jun 18 10:02:15 1996 Jason Merrill + + * pt.c (instantiate_decl): If at_eof, call import_export_decl + regardless of DECL_INLINE. + + * typeck.c (mark_addressable): Set TREE_ADDRESSABLE on CONSTRUCTORs. + + * class.c (finish_struct_bits): Copy TYPE_SIZE. + + * rtti.c (build_dynamic_cast): Support templates. + * tree.def: Support DYNAMIC_CAST_EXPR. + * pt.c (tsubst_copy): Likewise. + * decl2.c (build_expr_from_tree): Likewise. + +Mon Jun 17 15:23:36 1996 Jason Merrill + + * typeck.c (build_static_cast): Support templates. + (build_const_cast): Likewise. + * tree.def: Support CONST/STATIC_CAST_EXPR. + * pt.c (tsubst_copy): Likewise. + * decl2.c (build_expr_from_tree): Likewise. + +Sun Jun 16 12:33:57 1996 Jason Merrill + + * decl2.c (finish_vtable_vardecl): Don't trust + TREE_SYMBOL_REFERENCED for vtables of local classes. + +Fri Jun 14 18:13:36 1996 Jason Merrill + + * pt.c (tsubst_copy): Handle operator T. + +Wed Jun 12 17:52:40 1996 Brendan Kehoe + + * init.c (build_delete): Move creation of PARMS inside test of + TYPE_HAS_DESTRUCTOR, since it's never used outside of that block. + +Tue Jun 11 15:09:18 1996 Bob Manson + + * typeck.c (build_conditional_expr): Don't assume that + the arguments to ?: are always pointers or records. + +Tue Jun 11 13:56:23 1996 Jason Merrill + + * decl2.c (import_export_decl): Still emit static/weak/comdat + copies of inline template functions with -fno-implicit-templates. + +Tue Jun 11 11:42:13 1996 Bob Manson + + * init.c (build_delete): Determine the complete basetype + path to the destructor we're calling. + +Fri Jun 7 15:30:10 1996 Bob Manson + + * decl.c (build_enumerator): Always copy the INTEGER_CST used to + initialize the enum, because we really and truly don't know where + it came from. + (start_enum): Don't copy integer_zero_node because + build_enumerator will do it. + +Fri Jun 7 11:11:09 1996 Jason Merrill + + * decl.c (finish_function): Do access control on base destructors. + + * pt.c (tsubst, case FUNCTION_DECL): Set up + IDENTIFIER_GLOBAL_VALUE for member functions so pushdecl doesn't + hose us. + +Fri Jun 7 10:37:33 1996 Mike Stump + + * cvt.c (build_up_reference): If we have already extended the + lifetime of the temporary, don't try it again. + * typeck.c (c_expand_return): Don't try and convert the return + value twice when we want a reference, once is enough. + +Tue Jun 4 15:41:45 1996 Jason Merrill + + * pt.c (tsubst_expr, case DECL_STMT): Don't pass + LOOKUP_ONLYCONVERTING at all for now. + + * search.c (add_conversions): Put the conversion function in + TREE_VALUE, the basetype in TREE_PURPOSE. + * cvt.c (build_type_conversion): Adjust. + * cvt.c (build_expr_type_conversion): Adjust. + * call.c (user_harshness): Adjust. + +Mon Jun 3 15:30:52 1996 Jason Merrill + + * method.c (emit_thunk): Pretend this is a FUNCTION_DECL for the + backend's benefit. + +Mon Jun 10 18:58:19 1996 Mike Stump + + * except.c (expand_start_catch_block): Add a dummy region, if we + get an error, so that we can avoid core dumping later. + +Fri May 31 14:56:13 1996 Mike Stump + + * cp-tree.h (OFFSET_REF): Remove. + * tree.def (CP_OFFSET_REF): Rename to OFFSET_REF. + * expr.c (cplus_expand_expr): Cleanup callers of expand_expr. + * init.c (expand_aggr_init_1): Likewise. + (build_new): Likewise. + * typeck.c (expand_target_expr): Likewise. + +Fri May 31 14:22:08 1996 Jason Merrill + + * typeck.c (build_modify_expr): Don't use TREE_VALUE on a + TARGET_EXPR. + +Wed May 29 17:04:33 1996 Mike Stump + + * cvt.c (build_up_reference): Redo how and when temporaries are + created. + * decl.c (grok_reference_init): Don't try and be smart about + running cleanups. + +Wed May 29 16:02:08 1996 Mike Stump + + * cvt.c (build_up_reference): Add NULL_TREE to all calls to build + (TARGET_EXPR...), now that it has 4 arguments. + * tree.c (build_cplus_new): Likewise. + +Thu May 23 16:40:30 1996 Jason Merrill + + * error.c (dump_expr, case CAST_EXPR): Handle T() properly. + + * pt.c (instantiate_decl): Don't call push/pop_cp_function_context. + * decl.c (struct saved_scope): Remove named_labels, + {base,member}_init_list. + (maybe_push_to_top_level): Don't set them. Call + push_cp_function_context if appropriate. + (pop_from_top_level): Likewise. + + * method.c (do_build_assign_ref): Remove obsolete check of + TYPE_HAS_ASSIGN_REF (basetype). + + * decl.c (grokfndecl): Diagnose user definition of + implicitly-declared methods. + +Thu May 23 12:13:08 1996 Bob Manson + + * method.c (do_build_copy_constructor): Add code to give + meaningful error messages instead of crashing. + (do_build_assign_ref): Don't synthesize assignment operators for + classes containing reference or const members. + + * class.c (struct base_info): Remove cant_synth_copy_ctor + and cant_synth_asn_ref. + (finish_base_struct): Remove the code that tries to conditionalize + synthesis of copy constructors & assignment operators based on + access permissions. Instead, let it fail when it tries to + synthesize the copy constructor. This will give meaningful error + messages instead of silently generating code to perform a bitcopy. + +Wed May 22 11:45:19 1996 Bob Manson + + * lex.c (real_yylex): Remove old-n-crufty #if 0 code for + determining types for constant values. + + * decl.c (struct named_label_list): Use instead of stuffing + random items into a TREE_LIST node. + (named_label_uses): Use the new struct. + (poplevel): Likewise. + (lookup_label): Likewise. + (define_label): Add an error message to tell the user the line + where the goto is located in addition to the destination of the + goto. + (init_decl_processing): Use NULL instead of NULL_TREE to initialize + named_label_uses. + (finish_function): Likewise. + + (start_decl): Complain about defining a static data member + in a different type from which it was declared. + +Wed May 22 09:33:23 1996 Jason Merrill + + * cvt.c (build_expr_type_conversion): Adjust. + +Tue May 21 11:21:56 1996 Jason Merrill + + * call.c (build_method_call): Always convert 'this' to the + appropriate type. + + * search.c (add_conversions): Put the conversion function in + TREE_VALUE, the type in TREE_PURPOSE. + * cvt.c (build_type_conversion): Adjust. + * call.c (user_harshness): Adjust. + + * method.c (emit_thunk): Call temporary_allocation and + permanent_allocation around the ASM_OUTPUT_MI_THUNK case, too. + + * tree.c (build_cplus_array_type): Handle tweaking of + TYPE_MAIN_VARIANT here. + * typeck.c (common_type): Not here. + + * typeck.c (complete_type): Only try to complete an array type if + it has a domain. + +Mon May 20 14:55:59 1996 Jason Merrill + + * decl.c (grokvardecl): Call complete_type. + (grokdeclarator): Call complete_type for PARM_DECLs. + +Fri May 17 16:41:17 1996 Jason Merrill + + * pt.c (instantiate_class_template): Re-set + CLASSTYPE_GOT_SEMICOLON after calling finish_struct_1. + +Fri May 17 14:56:55 1996 Mike Stump + + * cp-tree.h (cp_expand_decl_cleanup): Remove, the backend is now + smart enough to do it right. + * tree.c (cp_expand_decl_cleanup): Likewise. + * decl.c (cp_finish_decl): Use expand_decl_cleanup instead of + cp_expand_decl_cleanup. + (store_parm_decls): Likewise. + (hack_incomplete_structures): Likewise. + * except.c (push_eh_cleanup): Likewise. + +Fri May 17 13:13:51 1996 Mike Stump + + * expr.c (expand_expr, cond UNSAVE_EXPR): Move from the C++ + frontend to the backend where it belongs. + * tree.c (unsave_expr): Likewise. + (unsave_expr_now): Likewise. + * tree.def (UNSAVE_EXPR): Likewise. + * cp-tree.h (unsave_expr): Likewise. + (unsave_expr_now): Likewise. + +Fri May 17 11:02:41 1996 Mike Stump + + * init.c (emit_base_init): Make sure the partial EH cleanups live + on the function_obstack. + +Thu May 16 15:29:33 1996 Bob Manson + + * expr.c (do_case): Don't try to dereference null TREE_TYPEs + when checking for pointer types. + +Thu May 16 13:38:58 1996 Jason Merrill + + * pt.c (instantiate_class_template): Remove obsolete check for + access declarations. + +Thu May 16 13:34:15 1996 Mike Stump + + * call.c (build_overload_call): Simplify calls to + build_overload_call by removing last parameter. + (build_method_call): Likewise. + * cp-tree.h: Likewise. + * method.c (build_opfncall): Likewise. + * typeck.c (build_x_function_call): Likewise. + +Thu May 16 13:15:43 1996 Mike Stump + + * call.c (default_parm_conversions): Factor out common code. + (build_method_call): Use it. + (build_overload_call_real): Use it. + +Wed May 15 14:46:14 1996 Mike Stump + + * call.c (build_method_call): Allow implicit & on METHOD_TYPEs, + but pedwarn as the code is bogus. + * typeck.c (decay_conversion): Likewise. + (build_function_call_real): Use build_addr_func instead of + default_conversion. Don't allow pointer-to-method functions down + here. + (build_unary_op): Use real pointer-to-member functions instead of + fake ones. + (build_ptrmemfunc): Use build_addr_func instead of build_unary_op. + (convert_for_assignment): Removed some obsolete code. + * decl2.c (reparse_absdcl_as_expr): Pass current_class_ref to + build_x_function_call instead of current_class_ptr. Only call + digest_init once on an initializer, we do this just checking + TREE_TYPE. + (build_expr_from_tree): Pass current_class_ref to + build_x_function_call instead of current_class_ptr. + * init.c (build_member_call): Likewise. + * pase.y: Likewise. + * error.c (dump_expr): Handle OFFSET_REFs better. + * pt.c (unify): Handle pointer-to-member functions better. + * decl.c (finish_function): Clear out current_class_ref just like + we do for current_class_ptr. + + * typeck.c (get_delta_difference): Handle virtual bases better. + +Tue May 14 16:37:37 1996 Jason Merrill + + * sig.c (build_signature_table_constructor): Use the delta for + the original basetype for this virtual function with thunks. + (build_signature_method_call): We still need to adjust 'this' + with thunks. + +Tue May 14 16:27:25 1996 Mike Stump + + * call.c (build_addr_func): New routine. Used to get the `real' + address of a function or a method. Needed to avoid getting a + pointer-to-member function. + (build_call): New routine to build CALL_EXPRs. + (build_method_call): Use it. + * cvt.c (convert_to_aggr): Likewise. + * typeck.c (build_function_call_real): Likewise. + * sig.c (build_signature_table_constructor): Use build_addr_func. + * cp-tree.h (build_call, build_addr_func): Declare them. + +Tue May 14 12:47:47 1996 Mike Stump + + * cp-tree.h (LOOKUP_AGGR): Remove, unused. + * parse.y: Remove uses of LOOKUP_AGGR. + +Tue May 14 12:07:51 1996 Mike Stump + + * *.[chy]: Rename current_class_decl to current_class_ptr, and + C_C_D to current_class_ref. + +Mon May 13 16:55:23 1996 Jason Merrill + + * call.c (convert_harshness): Tighten up pointer conversions. + +Sat May 11 04:33:50 1996 Doug Evans + + * decl2.c (finish_vtable_vardecl): Surround DECL_ONE_ONLY with ifdef. + (finish_file): Likewise. + +Fri May 10 11:09:57 1996 Jason Merrill + + * cvt.c (convert_fn_ptr): We don't use thunks for pmfs. + + * method.c (emit_thunk): Set flag_omit_frame_pointer in default + code. + +Thu May 9 18:18:30 1996 Jason Merrill + + * decl2.c: Turn on thunks by default where supported. + +Tue May 7 20:39:57 1996 Mike Stump + + * cp-tree.h (build_overload_call_maybe): Removed. + * call.c (build_overload_call_real): Invert meaning of last arg to + be require_complete. + (build_overload_call): Likewise. + * typeck.c (build_x_function_call): Use build_overload_call_real + instead of build_overload_call_maybe. + +Mon May 6 01:23:32 1996 Jason Merrill + + * decl2.c (finish_file): Don't try to emit functions that haven't + been compiled. + +Fri May 3 09:30:13 1996 Jason Merrill + + * decl2.c (finish_vtable_vardecl): Oops. + + * decl.c (maybe_push_to_top_level): Do save previous_class_*. + Also store the bindings from previous_class_values. + (pop_from_top_level): Restore them. + +Thu May 2 21:56:49 1996 Jason Merrill + + * decl2.c (finish_vtable_vardecl): Only write out vtable if its + symbol has been referenced. + (finish_file): Re-join synthesis/vtable loop with inline emission + loop, disable inlining when an inline is output. + +Thu May 2 17:20:02 1996 Mike Stump + + * except.c (init_exception_processing): Setup saved_in_catch. + (push_eh_cleanup): Reset __eh_in_catch. + (expand_start_catch_block): Set __eh_in_catch. + +Thu May 2 16:21:17 1996 Mike Stump + + * except.c (push_eh_cleanup): Add tracking for whether or not we + have an active exception object. + (expand_builtin_throw): Use it to make sure a rethrow without an + exception object is caught. + +Thu May 2 11:26:41 1996 Jason Merrill + + * decl.c (maybe_push_to_top_level): Clear out class-level bindings + cache. + +Wed May 1 11:26:52 1996 Jason Merrill + + * decl2.c (finish_file): Also use sentries for vars with + DECL_ONE_ONLY or DECL_WEAK set (should any such happen to be + created). + + * lex.c (handle_cp_pragma): Disable #pragma + interface/implementation if SUPPORTS_ONE_ONLY > 1. + +Tue Apr 30 11:25:46 1996 Jason Merrill + + * method.c (emit_thunk): Wrap default case in + temporary/permanent_allocation. + + * method.c (make_thunk): Use DECL_ONE_ONLY. + (emit_thunk): Call assemble_end_function. + +Mon Apr 29 15:38:29 1996 Jason Merrill + + * decl2.c (import_export_vtable): Use DECL_ONE_ONLY. + (import_export_decl): Likewise. + (finish_prevtable_vardecl): Disable vtable hack if + SUPPORTS_ONE_ONLY > 1. + +Mon Apr 29 14:32:47 1996 Mike Stump + + * typeck.c (build_modify_expr): PREINCREMENT_EXPR and + PREDECREMENT_EXPRs take two arguments, not one. + +Mon Apr 29 00:27:53 1996 Jason Merrill + + * class.c (build_vtable_entry): Don't build thunks for abstract + virtuals. + + * lex.c (real_yylex): Fix handling of __PRETTY_FUNCTION__ like C + frontend. + +Sat Apr 27 16:45:35 1996 Jason Merrill + + * class.c (set_rtti_entry): Use size_zero_node. + (build_vtable): Likewise. + +Sat Apr 27 14:48:57 1996 Jason Merrill + + * class.c (finish_struct_1): Pass size_zero_node to set_rtti_entry. + (prepare_fresh_vtable): Likewise. + +Fri Apr 26 13:14:14 1996 Jason Merrill + + * method.c (emit_thunk): Call mark_used on the target function. + + * call.c (build_method_call): Don't warn about pending templates. + +Thu Apr 25 14:55:44 1996 Jason Merrill + + * decl2.c (finish_file): Fix list walking logic. + + * typeck2.c (check_for_new_type): Only warn if -pedantic. + +Wed Apr 24 15:41:15 1996 Bob Manson + + * class.c (finish_struct_1): Remove old code for + dont_allow_type_definitions. + * cp-tree.h: Likewise. + * spew.c: Make sure cp-tree.h is included before parse.h, so the + definition of flagged_type_tree is found before it is used. + * lex.c: Likewise. + * parse.y: Added the ftype member to the type union, and changed a + number of rules to use it instead of ttype. Added calls to + check_for_new_type() as appropriate. + * typeck2.c (check_for_new_type): New function for checking + if a newly defined type appears in the specified tree. + * cp-tree.h: Add new type flagged_type_tree. Add a prototype + for check_for_new_type(). + +Wed Apr 24 00:36:21 1996 Jason Merrill + + * decl2.c (finish_file): Only use a sentry if the decl is public. + + * pt.c (tsubst_expr, DECL_STMT): If we don't have an initializer, + don't pass LOOKUP_ONLYCONVERTING. + +Tue Apr 23 17:18:47 1996 Bob Manson + + * typeck.c (common_type): Fix the ARRAY_TYPE case so it + properly keeps track of const and volatile type modifiers. + +Tue Apr 23 10:52:56 1996 Jason Merrill + + * tree.c (cp_tree_equal): C++ version of simple_cst_equal. + * pt.c (comp_template_args): Use it. + + * rtti.c (get_tinfo_fn, build_dynamic_cast, expand_*_desc): Call + assemble_external for artificial function decls. + + * decl.c (cp_finish_decl): Oops. + +Mon Apr 22 17:28:27 1996 Jason Merrill + + * decl2.c (import_export_decl): Put static data member templates + into common storage, or make them weak, depending on whether they + are dynamically or statically initialized. + (get_sentry): New function. + (finish_file): Do import_export_decl for static data members before + building the init/fini functions. Don't init/fini a variable that's + EXTERNAL. Use a sentry for variables in common. Fix mismatching + push/pop_temp_slots. + * decl.c (cp_finish_decl): If DECL_NOT_REALLY_EXTERN, do the + expand_static_init thang. + * method.c (get_id_2): New function. + +Mon Apr 22 15:32:45 1996 Bob Manson + + * parse.y (empty_parms): Make sure we use C++-style prototypes + when we're declaring member functions. + +Sun Apr 21 10:08:22 1996 Jason Merrill + + * Makefile.in (CONFLICTS): 16 s/r conflicts. + * parse.y (self_template_type): New nonterminal. + +Thu Apr 18 08:56:54 1996 Jason Merrill + + * decl.c (make_typename_type): Handle getting a TYPE_DECL for a + name. + * parse.y (base_class.1): Allow 'typename foo::bar'. + + * lex.c (check_newline): Remove #pragma code that plays with the + input stream, since we now deal with tokens. Clear nextchar when + we're done. + (handle_cp_pragma): Use real_yylex. + (handle_sysv_pragma): Don't do skipline here. Only call real_yylex + in one place. + + * lex.c (check_for_missing_semicolon): Handle SELFNAME. + + * lex.c (handle_cp_pragma): Fix "#pragma implementation". + +Wed Apr 17 16:51:33 1996 Jason Merrill + + * parse.y: New token SELFNAME for potential constructor. + * spew.c (yylex): Handle it. + * lex.c (identifier_type): Produce it. + + * parse.y (complete_type_name): In :: case, don't push class binding. + (complex_type_name): Likewise. + +Wed Apr 17 15:02:40 1996 Mike Stump + + * typeck.c (build_reinterpret_cast): Handle pointer to member + functions. + +Wed Apr 17 12:28:26 1996 Brendan Kehoe + + * lex.c (handle_cp_pragma): New function, with decl, doing the cc1plus + pragmas. + (check_newline): Put the vtable/unit/implementation/interface pragma + code into handle_cp_pragma, replacing it with a call. + (handle_sysv_pragma): Give int return type, and take FINPUT and TOKEN + args. Get the next token after handling the pragma token. + +Wed Apr 17 10:28:34 1996 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Avoid doing base analysis on pmfs. + (convert_to_pointer_force): Likewise. + + * init.c (build_new): Fix array new without -fcheck-new. + +Tue Apr 16 13:44:58 1996 Jason Merrill + + * cp-tree.h, call.c, class.c, decl.c, parse.y, pt.c, rtti.c, + tree.c: Lose TYPE_NESTED_NAME. + + * parse.y (nested_name_specifier_1): Don't treat non-identifiers + as identifiers. + + * tree.def: Add VEC_INIT_EXPR. + * expr.c (cplus_expand_expr): Handle it. + * init.c (build_new): Use it instead of the RTL_EXPR nastiness and + the extra file-scope symbol nastiness. + +Mon Apr 15 16:21:29 1996 Jason Merrill + + * method.c (make_thunk): Thunks are static. + (emit_thunk): Use ASM_OUTPUT_MI_THUNK if it's defined. + + * decl2.c (mark_vtable_entries): Emit thunks as needed. + (finish_file): Don't emit them here. + +Sun Apr 14 11:34:39 1996 Jason Merrill + + * rtti.c (build_dynamic_cast): Handle null pointers. + (ifnonnull): New function. + +Fri Apr 12 09:08:27 1996 Bob Manson + + * call.c (build_method_call): Remember the original basetype we + were called with. Give an error message instead of trying + (incorrectly) to call a non-static member function through a + non-inherited class. + + * search.c (expand_upcast_fixups): Mark the new fixup as + DECL_ARTIFICIAL. + +Thu Apr 11 03:57:09 1996 Jason Merrill + + * init.c (build_new): Use a TARGET_EXPR for alloc_expr. + + * class.c (set_rtti_entry): Fix for thunks. + + * decl2.c (import_export_decl): Still emit typeinfo fns for + cv-variants of builtin types. + + * rtti.c (expand_class_desc): Set up base_info_type_node here. + (init_rtti_processing): Instead of here. + +Wed Apr 10 14:17:13 1996 Jason Merrill + + * rtti.c (init_rtti_processing): Do init regardless of -frtti. + (build_typeid): Only complain about taking dynamic typeid without + -frtti. + + * decl2.c: flag_rtti defaults to 1. + + * rtti.c (get_tinfo_var): The general class case is now smaller. + (init_rtti_processing): Pack the latter three fields of base_info + into 32 bits. + +Wed Apr 10 13:50:14 1996 Mike Stump + + * init.c (expand_member_init): Don't dump if name is NULL_TREE. + +Wed Apr 10 12:56:02 1996 Mike Stump + + * search.c (make_memoized_table_entry): Undefer the pop, if necessary. + (push_memoized_context): Split out code to undefer pop_type_level to + (clear_memoized_cache): here. + (pop_memoized_context): We can only handle one layer of deferral of + pop_type_level so clear the cache, if there was a previous level. + +Tue Apr 9 23:06:09 1996 Jason Merrill + + * rtti.c (init_rtti_processing): Build up base_info_type_node. + (expand_class_desc): Use one pointer to an array of base_info + structs, passed using a CONSTRUCTOR. + +Tue Apr 9 14:20:57 1996 Mike Stump + + * class.c (build_vbase_path): Remove block extern for + flag_assume_nonnull_objects here. + (build_vfn_ref): Split out functionality into build_vtbl_ref. + (build_vtbl_ref): New routine. + (build_vtable): Set up rtti info here. + (add_virtual_function): Note in CLASSTYPE_RTTI the best + place where we can get the rtti pointers from to avoid having to + search around for a place. + (finish_base_struct): Likewise. + (finish_struct_1): Likewise. Never create totally new vtables + with totally new vtable pointers for rtti. Disable code to layout + vtable pointers better until we want to break binary + compatibility. + * rtti.c (build_headof_sub): New routine to convert down to a + sub-object that has an rtti pointer in the vtable. + (build_headof): Use it. Also, use build_vtbl_ref now to be more + maintainable. + (build_dynamic_cast): Make sure we have saved it, if we need to. + * search.c (dfs_init_vbase_pointers): Disable code that deals with + a more efficient vtable layout, enable later. + * call.c (flag_assume_nonnull_objects): Moved declaration to + * cp-tree.h: here. Declare build_vtbl_ref. + * pt.c (instantiate_class_template): Use NULL_TREE instead of 0 in + function calls that want a tree. + +Tue Apr 9 12:10:26 1996 Jason Merrill + + * rtti.c (build_dynamic_cast): Handle downcasting to X* given + other X subobjects in the most derived type. Ack. + + * rtti.c (build_dynamic_cast): No need to strip cv-quals here, + get_typeid will do it for us. + (get_typeid_1): Break out call-building for expand_*_desc to use. + (get_typeid): Call it. + (expand_*_desc): Likewise. + * decl.c (init_decl_processing): Don't set TYPE_BUILT_IN on char * + and void *. + (init_decl_processing): Lose builtin_type_tdescs lossage. + * decl2.c (finish_vtable_vardecl): Remove obsolete code. + +Mon Apr 8 17:23:23 1996 Bob Manson + + * pt.c (tsubst): When calling set_nested_typename, use + TYPE_NESTED_NAME (current_class_type) instead of + current_class_name. + + * decl.c (pushdecl): Likewise. + (pushdecl_class_level): Likewise. + (grokdeclarator): Use NULL_TREE instead of 0 in the call to + set_nested_typename. + +Sun Apr 7 10:44:31 1996 Jason Merrill + + * rtti.c (synthesize_tinfo_fn): Handle arrays. + + * cp-tree.h (DECL_REALLY_EXTERN): New macro. + +Sat Apr 6 13:56:27 1996 Jason Merrill + + * rtti.c (throw_bad_cast): Use entry point __throw_bad_cast. + (init_rtti_processing): Lose bad_cast_type. + (build_dynamic_cast): Use throw_bad_cast. + + * rtti.c (synthesize_tinfo_fn): Handle enums and pmfs. + + * decl2.c (finish_file): Don't synthesize artificial functions + that are external and not inline. + + * rtti.c (get_tinfo_fn): If at_eof, call import_export_decl. + + * decl2.c (finish_file): Handle having new inlines added to + saved_inlines by synthesis. + + * rtti.c (get_bad_cast_node): Don't require . + +Fri Apr 5 17:02:09 1996 Jason Merrill + + RTTI rewrite to initialize nodes as needed, not require that + users #include , complete functionality and reduce wasted + space. + * rtti.c (init_rtti_processing): New fn. + (build_typeid): The vtable entry is now a function. + (get_tinfo_var): New fn. + (get_tinfo_fn): Likewise. + (get_typeid): Use it. + (build_dynamic_cast): Declare and use entry point __dynamic_cast. + (build_*_desc): Rename to expand_*_desc and rewrite to use entry + points __rtti_*. + (add_uninstantiated_desc, get_def_to_follow, build_t_desc): Lose. + (synthesize_tinfo_fn): New fn. + * method.c (build_t_desc_overload): Lose. + (build_overload_with_type): More generic. + * decl.c (init_decl_processing): Call init_rtti_processing. + * class.c (set_rtti_entry): Use get_tinfo_fn. + * decl2.c (mark_vtable_entries): Mark the rtti function. + (finish_prevtable_vardecl): Don't build_t_desc. + (import_export_decl): Handle tinfo functions. + (finish_file): Likewise. + * typeck.c (inline_conversion): New fn. + (build_function_call_real): Use it. + * cp-tree.h: Add decls. + + * method.c (hack_identifier): Also convert component_refs from + references. + + * lex.c (cons_up_default_function): Use the type, not the name, in + declspecs. + + * decl2.c (import_export_vtable): Fix weak vtables. + +Fri Apr 5 13:30:17 1996 Bob Manson + + * search.c (get_base_distance_recursive): Fix access checks for + protected bases. + +Fri Apr 5 11:02:06 1996 Brendan Kehoe + + * call.c (unary_complex_lvalue): Delete unneeded decl, it's in + cp-tree.h. + (convert_harshness): Add prototypes wrapped by PROTO. + * decl2.c (grok_function_init): Likewise. + (do_toplevel_using_decl): Change to void return type. + * class.c (build_vtable_entry): Remove decl of make_thunk. + (merge_overrides): Fix order of arg definitions. + (finish_vtbls): Likewise. + (fixup_vtable_deltas): Likewise. + (modify_all_direct_vtables): Likewise. + (modify_all_indirect_vtables): Likewise. + * search.c (get_base_distance_recursive): Likewise. + (get_abstract_virtuals_1): Likewise. + (fixup_virtual_upcast_offsets): Likewise. + (lookup_fnfields_1): Add prototypes wrapped by PROTO. + * init.c (perform_member_init): Fix order of arg definitions. + (expand_aggr_init_1): Add prototypes wrapped by PROTO. + * cp-tree.h (make_thunk): Add decl. + (overload_template_name, push_template_decl): Add decls. + (do_toplevel_using_decl): Change to void return type. + (vec_binfo_member): Add decl. + +Thu Apr 4 13:33:10 1996 Brendan Kehoe + + * typeck.c (mark_addressable, convert_for_assignment, + convert_for_initialization, pointer_int_sum, pointer_diff, + unary_complex_lvalue): Add prototypes wrapped by PROTO. + (convert_sequence): #if 0 fn decl, since definition also is. + +Thu Apr 4 11:00:53 1996 Mike Stump + + * rtti.c (build_dynamic_cast): Make sure we strip qualifiers on + cast to pointer types for type searching. + +Wed Apr 3 17:10:57 1996 Brendan Kehoe + + * typeck.c (get_delta_difference): Use cp_error, not error, in the + case where BINFO == 0. + +Wed Apr 3 12:01:02 1996 Mike Stump + + * call.c (build_method_call): Fix wording of error messages so + constructors come out right. + +Tue Apr 2 16:06:59 1996 Bob Manson + + * decl.c (push_overloaded_decl): Don't warn about hidden + constructors when both the type and the function are declared + in a system header file. + +Mon Apr 1 09:03:13 1996 Bob Manson + + * class.c (finish_struct_1): Propagate the TYPE_PACKED + flag for the type to the type's fields. + +Sat Mar 30 12:14:33 1996 Brendan Kehoe + + * parse.y (complex_parmlist, ELLIPSES): Take out ARM-based warning. + +Fri Mar 29 15:51:36 1996 Bob Manson + + * class.c (base_info, finish_base_struct): Replace + needs_virtual_dtor with base_has_virtual. + + (finish_struct_1): Remove the old code that tried to make default + destructors virtual. Use base_has_virtual when checking if we need + to add a vtable entry for the rtti code. + +Fri Mar 29 14:02:36 1996 Jason Merrill + + * pt.c (push_template_decl): Complain about template decl with + inappropriate declaration. + +Fri Mar 29 12:15:35 1996 Bob Manson + + * typeck.c (build_x_unary_op): Remove bogus check for taking + the address of a member function. + +Fri Mar 29 11:56:02 1996 Jason Merrill + + * parse.y (constructor_declarator): Only push the class if + we are not already in the class. + +Fri Mar 29 09:41:02 1996 Jeffrey A. Law + + * method.c (emit_thunk): Remove current_call_is_indirect nonsense. + Add additional argument to INIT_CUMULATIVE_ARGS. + +Thu Mar 28 16:41:39 1996 Jason Merrill + + * decl.c (shadow_tag): Fix error about anon union with methods. + + * parse.y (self_reference): Only generate a self-reference if this + is a non-template class. + (opt.component_decl_list): Only use it if it was generated. + + * parse.y (component_decl_1): Use constructor_declarator. + (fn.def2): Likewise. + (notype_component_declarator0): Likewise. + +Thu Mar 28 15:11:35 1996 Bob Manson + + * typeck.c (build_x_unary_op): Add checks for taking the address + of a TARGET_EXPR or of a member function, and give appropriate + warnings. + +Thu Mar 28 14:49:26 1996 Jason Merrill + + * pt.c (process_template_parm): Allow template type parms to be + used as types for template const parms. + +Wed Mar 27 15:51:19 1996 Mike Stump + + * init.c (expand_vec_init): Ensure the eh cleanups are on the + function_obstack. + +Wed Mar 27 10:14:30 1996 Jason Merrill + + * decl.c (lookup_name_real): Be even more picky about the + ambiguous lookup warning. + (grokdeclarator): Tweak SCOPE_REF constructor declarators here. + * parse.y (constructor_declarator): Rather than here. + + * parse.y (constructor_declarator): New nonterminal. + (fn.def1): Use it. + (explicit_instantiation): Likewise. + +Tue Mar 26 13:41:33 1996 Jason Merrill + + Add implicit declaration of class name at class scope. + * decl.c (lookup_name_real): Restrict pedwarn about ambiguous lookup. + * parse.y (self_reference): New nonterminal. + (opt.component_decl_list): Use it. + (fn.def1): Add nested_name_specifier type_name cases. + * class.c (build_self_reference): New function. + (finish_struct): Handle access_default later, move self-reference + decl to the end. + * pt.c (lookup_template_class): Handle getting a TYPE_DECL. + * cp-tree.h: Adjust. + + * pt.c (do_function_instantiation): Separate handling of member + functions and non-member functions properly. + +Mon Mar 25 14:23:22 1996 Jason Merrill + + * pt.c (process_template_parm): Improve error for 'volatile class K'. + + * class.c (finish_struct_1): Check the right slot for destructors. + + * decl.c (start_enum): Complain about enum templates. + +Mon Mar 25 13:25:31 1996 Mike Stump + + * init.c (resolve_offset_ref): Offset pointers to member data by one. + * typeck.c (unary_complex_lvalue): Likewise. + +Mon Mar 25 13:30:42 1996 Bob Manson + + * typeck.c (c_expand_return): Check for a returned local + array name, similar to the check for an ADDR_EXPR. + +Mon Mar 25 13:07:19 1996 Jason Merrill + + * decl.c (cp_finish_decl): Don't build cleanups for static + variables here. + +Fri Mar 22 17:57:55 1996 Mike Stump + + * typeck.c (build_modify_expr): Fix error messages to be more + accurate. + * cp-tree.h (assop_as_string): Parallel to op_as_string, but for + assignment operators. + * error.c (assop_as_string): Likewise. Add support for `%Q' for + assignment operators. + +Fri Mar 22 13:48:29 1996 Jason Merrill + + * decl.c (grokdeclarator): Call bad_specifiers for typedefs. Also + give an error if initialized. pedwarn about nested type with the + same name as its enclosing class. + + * pt.c (tsubst, case TYPE_DECL): Set DECL_CONTEXT. + + * typeck.c (require_complete_type): Be sure to instantiate the + MAIN_VARIANT of the type. + + * decl2.c (finish_file): Instantiate pending templates before + processing static constructors and destructors. + + * pt.c (instantiate_decl): Don't instantiate functions at toplevel + unless at_eof. + +Fri Mar 22 09:30:17 1996 Bob Manson + + * decl2.c (delete_sanity): If error_mark_node is passed + in as an expression, quit while we're ahead. + + * decl.c (grokdeclarator): Give an error message if `friend' + is combined with any storage class specifiers. + +Wed Mar 20 14:51:55 1996 Jason Merrill + + * parse.y (named_complex_class_head_sans_basetype): Don't crash on + definition of nonexistent nested type. + + * error.c (dump_decl, case TYPE_DECL): Fix decision for whether or + not to say 'typedef'. + +Wed Mar 20 00:11:47 1996 Brendan Kehoe + + * cp-tree.h (struct lang_type): Make search_slot a tree, not a char*. + * search.c (dfs_walk, dfs_init_vbase_pointers, + expand_upcast_fixups): Remove cast of CLASSTYPE_SEARCH_SLOT. + (dfs_find_vbases): Remove cast for CLASSTYPE_SEARCH_SLOT init. + +Tue Mar 19 17:56:03 1996 Jason Merrill + + * except.c (build_throw): Support minimal parse. + * pt.c (tsubst_copy): Support THROW_EXPR. + * decl2.c (build_expr_from_tree): Likewise. + + * pt.c (mangle_class_name_for_template): Always allocate + scratch_firstobj. + +Tue Mar 19 16:34:31 1996 Bob Manson + + * cvt.c (cp_convert_to_pointer): Give an appropriate error + when trying to cast from an incomplete type. + +Tue Mar 19 16:00:33 1996 Jason Merrill + + * pt.c (instantiate_class_template): Don't bother setting up + CLASSTYPE_TAGS explicitly, as the nested types will add + themselves. + +Tue Mar 19 15:48:43 1996 Bob Manson + + * decl.c (shadow_tag): Remove old error check for usage of + an enum without a previous declaration. + (xref_tag): Add error message about usage of enums without a + previous declaration. + +Tue Mar 19 09:21:35 1996 Jason Merrill + + * lex.c (do_identifier): Only do name consistency check if we're + parsing. + + * pt.c (push_template_decl): Don't crash if we get a member defn + that doesn't match. + + * decl.c (xref_tag_from_type): New function to do an xref without + always having to figure out code_type_node. + * cp-tree.h: Declare it. + * pt.c (instantiate_class_template): Use it for friend classes. + (lookup_template_class): Use it. + + * typeck2.c (build_functional_cast): Pull out a single parm before + passing it to build_c_cast. + +Tue Mar 19 09:07:15 1996 Bob Manson + + * expr.c (do_case): Give an error message if a pointer is + given as a case value. + +Mon Mar 18 21:57:54 1996 Jason Merrill + + * typeck.c (build_c_cast): Don't pull single TEMPLATE_DECL out of + an overload list. + + * lex.c (cons_up_default_function): Really, now, interface hackery + does not apply to synthesized methods. + +Mon Mar 18 18:20:57 1996 Mike Stump + + * call.c (build_method_call): Ctors and dtors now have special names + with respect to lookups. + * class.c (add_method): Likewise. + (grow_method): Likewise. + (finish_struct_methods): Likewise. + (warn_hidden): Likewise. + (finish_struct_1): Likewise. + * cvt.c (convert_to_reference): Likewise. + (convert_to_aggr): Likewise. + (cp_convert): Likewise. + * decl2.c (check_classfn): Likewise. + * init.c (expand_member_init): Likewise. + (expand_default_init): Likewise. + (expand_aggr_init_1): Likewise. + (build_offset_ref): Likewise. + (build_new): Likewise. + (build_delete): Likewise. + * lex.c (do_inline_function_hair): Likewise. + * search.c (lookup_field_1): Likewise. + (lookup_fnfields_here): Likewise. + (lookup_field): Likewise. + (lookup_fnfields): Likewise. + (get_virtual_destructor): Likewise. + (dfs_debug_mark): Likewise. + (dfs_pushdecls): Likewise. + (dfs_compress_decls): Likewise. + * tree.c (layout_basetypes): Likewise. + * typeck.c (build_component_ref): Likewise. + (build_x_function_call): Likewise. + (build_modify_expr): Likewise. + (convert_for_initialization): Likewise. + (build_functional_cast): Likewise. + * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Likewise. + (CTOR_NAME): New. + (DTOR_NAME): New. + * decl.c (ctor_identifier): New. + (dtor_identifier): New. + (init_decl_processing): Set them. + +Mon Mar 18 18:00:51 1996 Mike Stump + + * typeck.c (build_component_ref): Don't get confused by fields whose + context has no type name, like pointer to member functions. + +Mon Mar 18 13:19:03 1996 Jason Merrill + + * decl.c (grokdeclarator): Handle typedef without declarator. + + * pt.c (tsubst): Handle SCOPE_REF in declarator. + + * parse.y (bad_parm): Catch another case of missing `typename'. + + * lex.c (yyprint): Handle TYPE_DECLs. + + * decl.c (start_function): Don't try to be clever. + + * lex.c: Lose compiler_error_with_decl. + * typeck2.c: Lose error_with_aggr_type. + (incomplete_type_error): Use cp_* instead of old functions. + (readonly_error): Likewise. + * typeck.c (convert_arguments): Likewise. + * search.c (lookup_nested_field): Likewise. + * method.c (make_thunk): Likewise. + * decl.c (grokparms): Likewise. + * cp-tree.h: Update. + + * tree.c (min_tree_cons): Call copy_to_permanent for the purpose + and value. + +Mon Mar 18 11:25:52 1996 Bob Manson + + * method.c (build_opfncall): When deleting a pointer to an + array, build a new pointer to the tree past any ARRAY_TYPE + nodes. + +Mon Mar 18 10:11:46 1996 Brendan Kehoe + + * decl.c (lookup_name_real): Initialize local var TYPE to NULL_TREE. + +Fri Mar 15 11:03:57 1996 Jason Merrill + + * pt.c (instantiate_decl): Only call import_export_decl if at_eof + and ! DECL_INLINE. + + * decl.c (finish_function): Don't set nested based on + hack_decl_function_context. + * parse.y (function_try_block): Check for nested function. + (pending_inlines): Likewise. + + * decl2.c (build_expr_from_tree): If a unary op already has a + type, just return it. + + * decl2.c (finish_prevtable_vardecl): Use ADJUST_VTABLE_LINKAGE. + + * decl2.c (walk_vtables): vardecl_fn returns int; return 1 if it does. + (finish_file): Check the return value of walk_vtables. + (finish_prevtable_vardecl): Return int. + (finish_vtable_vardecl): Likewise. + (prune_vtable_vardecl): Likewise. + * lex.c (set_vardecl_interface_info): Likewise. + * cp-tree.h: Adjust return types. + + * class.c (delete_duplicate_fields_1): Don't complain about + duplicate nested types if they're the same type. + (finish_struct): Remove check for duplicate. + * decl2.c (grokfield): Don't check for typedef of anonymous type. + +Thu Mar 14 10:00:19 1996 Jason Merrill + + * cp-tree.h: Lose SIGNATURE_GROKKING_TYPEDEF. + + * decl.c (grokdeclarator): Lose special handling of class-level + typedef. Lose SIGNATURE_GROKKING_TYPEDEF. Set + SIGNATURE_HAS_OPAQUE_TYPEDECLS later. + + * cvt.c (convert_pointer_to_real): Retain cv-quals in conversion. + + * pt.c (tsubst_copy): Strip cv-quals from destructor name types. + + * search.c (compute_access): Fix handling of anonymous union + members. + * class.c (finish_struct_anon): Propagate TREE_{PRIVATE,PROTECTED} + from anonymous unions to their members. + + * typeck.c (build_x_function_call): For static member functions, + hand off to build_member_call. + +Wed Mar 13 14:03:34 1996 Jason Merrill + + * typeck.c (build_component_ref): Handle OFFSET_REFs. + + * init.c (expand_vec_init): Fix init == 0 case. + +Tue Mar 12 14:36:02 1996 Jason Merrill + + * init.c (build_new): pedwarn about init and array new. + (expand_vec_init): Handle lists, use convert_for_initialization. + + * typeck.c (convert_for_initialization): Pass LOOKUP_NO_CONVERSION + when converting to an aggregate type. + * cvt.c (cp_convert): Pass it through. + + * typeck.c (build_conditional_expr): Handle user-defined + conversions to slightly different types. + + * decl.c (grokdeclarator): Force an array type in a parm to be + permanent. + + * decl2.c (do_using_directive): Sorry. + (do_namespace_alias): Likewise. + * lex.c (real_yylex): Warn about using the `namespace' keyword. + +Sun Mar 10 22:26:09 1996 Jason Merrill + + * parse.y (datadef): Move call to note_list_got_semicolon up. + +Fri Mar 8 11:47:26 1996 Mike Stump + + * tree.c (unsave_expr): Don't unsave, UNSAVE_EXPRs. + +Fri Mar 8 11:29:06 1996 Mike Stump + + * decl.c (cp_finish_decl): The exception regions have to be + nested, not overlapping. We start the exception region for a + decl, after it has been fully built, and all temporaries for it + have been cleaned up. + +Thu Mar 7 17:46:06 1996 Mike Stump + + * tree.c (vec_binfo_member): Don't core dump if we have no bases. + +Thu Mar 7 14:11:49 1996 Jason Merrill + + * tree.def: Add RETURN_INIT. + * pt.c (instantiate_decl): Handle RETURN_INIT. + * decl.c (store_return_init): Handle minimal_parse_mode. + + * tree.c (cp_build_type_variant): Just return an error_mark_node. + * decl.c (make_typename_type): Don't try to get the file and line + of an identifier. + * typeck.c (comptypes): Handle TYPENAME_TYPE. + +Wed Mar 6 18:47:50 1996 Per Bothner + + * decl.c (poplevel): Make sure we clear out and restore old local + non-VAR_DECL values by default when they go out of scope. + +Wed Mar 6 09:57:36 1996 Jason Merrill + + * method.c (build_overload_value): Use DECL_ASSEMBLER_NAME in + referring to addresses of variables and functions. + + * error.c (dump_expr): Support SIZEOF_EXPR. + + * init.c (do_friend): Use the return value of check_classfn. + + * typeck.c (convert_arguments): Call complete_type. + + * method.c (hack_identifier): After giving an error, set value to + error_mark_node. + +Tue Mar 5 16:00:15 1996 Jason Merrill + + * tree.c (hack_decl_function_context): Kludge around DECL_CONTEXT + lossage for local classes. + * cp-tree.h: Declare it. + * decl.c (lookup_name_real): Evil, painful hack for local classes. + (grokfndecl): Set DECL_CLASS_CONTEXT and DECL_NO_STATIC_CHAIN here. + Use hack_decl_function_context. + (grokdeclarator): Don't set DECL_NO_STATIC_CHAIN here. + (start_function): Use hack_decl_function_context. + (finish_function): Likewise. + * method.c (synthesize_method): Likewise. + * lex.c (process_next_inline): Likewise. + (do_pending_inlines): Likewise. + * decl2.c (finish_file): Unset DECL_STATIC_FUNCTION_P when we're + done with it. + +Mon Mar 4 22:38:39 1996 Gerald Baumgartner + + * sig.c (build_signature_pointer_or_reference_type): Align + signature pointers/references on 8-byte boundaries so they can be + grabbed 2 words at a time on a SPARC. + +Tue Mar 5 10:21:01 1996 Jason Merrill + + * method.c (hack_identifier): Requiring a static chain is now a + hard error. + * decl.c (grokdeclarator): Set DECL_NO_STATIC_CHAIN on nested + functions. + +Mon Mar 4 20:03:33 1996 Jason Merrill + + * init.c (build_offset_ref): Call complete_type. + + * decl.c (pop_from_top_level): Always pop previous_class_type. + + * parse.y: Handle multiple decls in a for-init-statement. + * pt.c (tsubst_expr): Likewise. + + * pt.c (tsubst): Use tsubst_expr for the second operand of an + ARRAY_REF. + + * decl.c (maybe_push_to_top_level): Don't save previous_class_type. + (poplevel_class): Set it here. + (pop_from_top_level): Pop it here if we're returning to class scope. + * class.c (pushclass): Don't set it here. + + * decl.c (maybe_push_to_top_level): Save current_template_parms, + and clear it if !pseudo. + (pop_from_top_level): Restore it. + + * decl2.c (finish_file): Push the dummy each time we walk the list + of vtables. + + * error.c (dump_expr): Support LOOKUP_EXPR and actually do + something for CAST_EXPR. + +Mon Feb 19 14:49:18 1996 Rusty Russell + + * cvt.c (cp_convert): Warn about implicit conversion of the + address of a function to bool, as it is always true. + +Fri Feb 23 23:06:01 1996 Rusty Russell + + * typeck.c (c_expand_return): Fix warning for local externs returned. + +Mon Mar 4 15:03:11 1996 Jason Merrill + + * tree.c (mapcar): Propagate const and volatile properly. + + * typeck.c (complete_type): Be sure to instantiate the + MAIN_VARIANT of the type. + + * method.c (synthesize_method): Class interface hackery does not + apply to synthesized methods. + +Mon Mar 4 14:05:23 1996 Jason Merrill + + * pt.c (comp_template_args): Use comptypes rather than just + checking for TEMPLATE_TYPE_PARM equivalence. + + * typeck.c (build_x_function_call): Call complete_type before + checking TYPE_OVERLOADS_CALL_EXPR. + +Mon Mar 4 18:48:30 1996 Manfred Hollstein + + * g++.c (main): Check also for new define ALT_LIBM. + +Fri Mar 1 13:09:33 1996 Jason Merrill + + * pt.c (instantiate_class_template): If we don't have a pattern + yet, that's OK. + (coerce_template_parms): If we see a local class, bail. + + * decl.c (grok_reference_init): Make sure there's a type before + checking its code. + + * pt.c (do_function_instantiation): Avoid crashing on invalid decls. + (push_template_decl): Likewise. + + * parse.y (named_class_head): Set + CLASSTYPE_TEMPLATE_SPECIALIZATION here if we have basetypes. + + * decl.c (xref_tag): Diagnose redeclaration of template + type-parameter name. + + * error.c (dump_type): Handle anonymous template type parms. + + * pt.c (instantiate_template): Use TYPE_MAIN_DECL instead of + TYPE_STUB_DECL. + (coerce_template_parms): Likewise. + +Thu Feb 29 16:26:01 1996 Mike Stump + + * class.c (instantiate_type, case {ARRAY,INDIRECT}_REF, + case ADDR_EXPR): Don't modify rhs if a subinstantiation fails. + +Thu Feb 29 08:20:25 1996 Jason Merrill + + * pt.c (instantiate_template): Take the MAIN_VARIANT of the type + before trying to get its STUB_DECL. + (coerce_template_parms): Likewise. + + * parse.y (template_type_parm): If they didn't use 'class', + pretend they did after giving an error. + + * pt.c (coerce_template_parms): Diagnose use of local class. + + * decl.c (grok_reference_init): Use instantiate_type. + + * error.c (dump_expr): Handle TEMPLATE_DECLs. + + * parse.y (named_class_head): Diagnose mismatching types and tags. + + * decl.c (pushdecl): Type decls and class templates clash with + artificial type decls, not hide them. + + * decl.c (redeclaration_error_message): Diagnose redefinition of + templates properly. + (duplicate_decls): Diagnose disallowed overloads for template + functions, too. + + * decl.c (start_decl): Call complete_type before checking for a + destructor. + + * pt.c (tsubst): Use tsubst_expr on the elts of a VEC. + + * decl.c (xref_tag): A TEMPLATE_TYPE_PARM is a match. + +Wed Feb 28 09:28:44 1996 Jason Merrill + + * decl.c (grok_op_properties): Don't check for operator++(int) in + a template. + + * tree.c (perm_manip): Return a copy of variable and function + decls with external linkage. + + * tree.def: Change some of the min tree codes to type "1". + * pt.c (uses_template_parms): Handle 'e's, return 1 for LOOKUP_EXPRs. + * method.c (build_overload_int): Emit something arbitrary for + anything but an INTEGER_CST if we're in a template. + + * decl.c (cp_finish_decl): Call complete_type before deciding + whether or not to lay out the decl. + + * lex.c (do_identifier): Check for DECL_INITIAL before using it. + +Tue Feb 27 16:35:32 1996 Jason Merrill + + * typeck2.c (build_x_arrow): Call complete_type. + + * pt.c (add_pending_template): Broken out. + (lookup_template_class): If -fexternal-templates, call it for all + the methods of implemented types. + (instantiate_class_template): Instead of instantiating them here. + (instantiate_decl): Handle -fexternal-templates earlier. + +Tue Feb 27 15:51:32 1996 Brendan Kehoe + + * search.c, lex.c, decl.c, class.c, cp-tree.h: Don't wrap the + memoized lookup stuff inside GATHER_STATISTICS. + +Tue Feb 27 10:38:08 1996 Jason Merrill + + * decl.c (start_decl): Complain about array of incomplete type + here. + (grokdeclarator): Not here. + + * parse.y (template_parm): Expand full_parm inline so we can set + the rule's precedence. + + * pt.c (tsubst_expr): If we're in a template, just do tsubst_copy. + (tsubst): tsubst_expr the DECL_INITIAL of FIELD_DECLs. + * decl2.c (grokbitfield): Don't check for integer constant here. + * class.c (finish_struct_1): Check here. + + * decl.c (define_label): Make the min decl go on permanent_obstack. + + * pt.c (unify): Don't handle CONST_DECLs. + (uses_template_parms): Don't check DECL_INITIAL on a CONST_DECL. + (tsubst_copy): Likewise. + + * lex.c (do_identifier): Do pull the DECL_INITIAL out of a + CONST_DECL for a template parm. + +Mon Feb 26 12:48:18 1996 Jason Merrill + + * decl.c (grokdeclarator): Complain about array of incomplete type + here. + (start_decl_1): Not here. + + * pt.c (tsubst): Handle pointer-to-function declarators. + + * method.c (hack_identifier): If pedantic, diagnose local class + methods that require a static chain. + + * decl.c (grok_op_properties): No longer static. + * cp-tree.h: Declare it. + * pt.c (tsubst): Call it for operators. + Use tsubst_copy for TREE_VECs. + + * parse.y (template_arg): The expr has precedence like '>'. + +Fri Feb 23 14:51:52 1996 Jason Merrill + + * pt.c (coerce_template_parms): Don't coerce an expression using + template parms. + (uses_template_parms): Also check DECL_INITIAL in CONST_DECLs. + (tsubst): Don't use build_index_2_type if the max_value uses template + parms. + * method.c (build_overload_int): Emit something arbitrary for an + expression using template parms. + + * parse.y (template_close_bracket): New non-terminal to catch use + of '>>' instead of '> >' in template class names. + (template_type): Use it. + * Makefile.in (CONFLICTS): Causes one more r/r conflict. + + * tree.def: Add CAST_EXPR. + * typeck2.c (build_functional_cast): Use CAST_EXPR instead of + CONVERT_EXPR for minimal_parse_mode. + * typeck.c (build_c_cast): Likewise. + * pt.c (tsubst_copy): Likewise. + * decl2.c (build_expr_from_tree): Likewise. + * error.c (dump_expr): Likewise. + +Fri Feb 23 10:36:46 1996 Brendan Kehoe + + * except.c (SetTerminate, SetUnexpected): Put back global vars. + (init_exception_processing): Put back decl/init of + set_unexpected_fndecl and set_terminate_fndecl, needed to get the + fns from libstdc++. + + * decl.c (struct binding_level): Delete ACCEPT_ANY bitfield. + (declare_uninstantiated_type_level, uninstantiated_type_level_p): + Delete unused fns. + * cp-tree.h (declare_uninstantiated_type_level, + uninstantiated_type_level_p): Delete prototypes. + +Thu Feb 22 19:36:15 1996 Jason Merrill + + * pt.c (tsubst_expr): Add default return. + +Thu Feb 22 16:47:24 1996 Brendan Kehoe + + * error.c (fndecl_as_string): Delete unused arg CNAME. + * sig.c (build_signature_table_constructor, + build_signature_method_call): Fix calls. + + * class.c (the_null_vtable_entry): Delete var definition. + (init_class_processing): Delete tree the_null_vtable_entry init. + * decl.c (no_print_{functions, builtins}): Declare as static. + (__tp_desc_type_node): #if 0 var definition. + (init_type_desc): #if 0 init of __tp_desc_type_node. + (vb_off_identifier): Move var decl into init_decl_processing. + (current_function_assigns_this): Declare as static. + (int_ftype_ptr_ptr_int, void_ftype_ptr_int_int): Delete var decls. + (init_decl_processing): Delete init of void_ftype_ptr_ptr_int. + Move decls of string_ftype_ptr_ptr and int_ftype_string_string here. + * decl2.c (delete_sanity): Delete definition/mod of local var ELT_SIZE. + * init.c (BI_header_type, BI_header_size): Declare as static. + * pt.c (template_classes): Delete unused var. + (add_pending_template): Delete decl for non-existent fn. + (lookup_template_class): Delete vars CODE and TAG_CODE. + (instantiate_template): Delete unused var TARGS. + * cp-tree.h (vb_off_identifier, current_function_assigns_this): + Delete decls. + (__tp_desc_type_node): #if 0 var decl. + (fndecl_as_string): Fix prototype. + +Thu Feb 22 15:56:19 1996 Jason Merrill + + * tree.def: Add GOTO_STMT. + * pt.c (tsubst_expr): Support goto and labels. + * decl.c (define_label): Support minimal parsing. + * parse.y (simple_stmt): Likewise. + +Thu Feb 22 15:30:12 1996 Brendan Kehoe + + * xref.c (GNU_xref_member): Only define/set var I if + XREF_SHORT_MEMBER_NAMES is defined, to match when it's actually + used. + (GNU_xref_end_scope): Delete unused fifth arg TRNS. + (GNU_xref_end): Fix call. + * decl.c (poplevel, poplevel_class, finish_method): Fix calls. + * cp-tree.h (GNU_xref_end_scope): Fix prototype. + + * tree.c (build_exception_variant): Delete unused vars I, A, T, + T2, and CNAME. + (layout_vbasetypes): Delete unused var NONVIRTUAL_VAR_SIZE. + (mapcar): Delete unused var CODE. + (build_cplus_new): Delete unused arg WITH_CLEANUP_P. + (break_out_cleanups): Fix call. + (bot_manip): Likewise. + * call.c (build_method_call): Likewise. + * cvt.c (build_up_reference, convert_to_reference, cp_convert): + Likewise. + * typeck.c (unary_complex_lvalue, build_modify_expr, + convert_for_initialization): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * cp-tree.h (build_cplus_new): Fix prototype. + + * repo.c (open_repo_file): Delete unused var Q. + (repo_compile_flags, repo_template_declared, + repo_template_defined, repo_class_defined, repo_inline_used, + repo_vtable_used, repo_tinfo_used): #if 0 unused fns. + (repo_get_id, repo_vtable_used): Declare as static. + * cp-tree.h (mark_{decl,class}_instantiated, finish_repo): Add + prototypes. + +Thu Feb 22 14:53:35 1996 Jason Merrill + + * parse.y (pending_inlines): Add function_try_block case. + + * pt.c (unify): Fix for template const parms. + +Thu Feb 22 13:24:15 1996 Brendan Kehoe + + * lex.c (extract_interface_info): Delete forward decl. + (default_copy_constructor_body, default_assign_ref_body): Delete + decls for non-existent functions. + (synth_firstobj, inline_text_firstobjs): Delete unused vars. + (init_lex): Delete setting them. + (cons_up_default_function): Delete unused vars FUNC_BUF, + FUNC_LEN, and COMPLEX. Delete code setting COMPLEX. Delete old + #if 0'd synth code. + (toplevel, expression_obstack): Delete unused extern decls. + (tree_node_kind): Delete unused enum. + (tree_node_counts, tree_node_sizes): Wrap with #ifdef + GATHER_STATISTICS. + (tree_node_kind_names): Delete unused extern decl. + (synth_obstack): Delete unused var. + (init_lex): Don't set it. + (init_parse): Add decl before use. + (reduce_count): Only define #ifdef GATHER_STATISTICS && REDUCE_LENGTH. + (current_unit_{name, language}): Delete unused vars. + (check_newline): Don't bother setting them, just accept the #pragma. + * cp-tree.h (init_repo, peek_yylex): Add prototypes. + (current_unit_{name, language}): Delete decls. + + * search.c: Wrap all of the memoized functions, macros, and + variables inside #ifdef GATHER_STATISTICS. + (lookup_field, lookup_fnfields): Likewise. + (init_search_processing): Likewise. + (reinit_search_statistics): Wrap whole function. + * lex.c (reinit_lang_specific): Wrap call to reinit_search_statistics. + + * decl.c (finish_function): Only call pop_memoized_context if + GATHER_STATISTICS is defined. + (start_function): Likewise for push_memoized_context. + * class.c (pushclass, popclass): Likewise. + + * cp-tree.h (CLASSTYPE_MTABLE_ENTRY): Move definition from here... + * search.c (CLASSTYPE_MTABLE_ENTRY): ... to here. + + * cvt.c (cp_convert): Delete unused local var FORM. + * cp-tree.h (can_convert, can_convert_arg, real_lvalue_p): Add + prototypes. + +Thu Feb 22 13:19:44 1996 Jason Merrill + + * pt.c (do_poplevel): Oops; really return what we get from + poplevel this time. + +Thu Feb 22 11:41:44 1996 Brendan Kehoe + + * cp-tree.h (is_aggr_type): Add prototype. + + * cp-tree.h ({push,pop}_cp_function_context): Add decls. + * method.c ({push,pop}_cp_function_context): Delete decls. + * except.c (start_eh_unwinder, end_eh_unwinder): Declare as void. + (SetUnexpected, SetTerminate): Delete unused vars. + (init_exception_processing): Don't set SetUnexpected or + SetTerminate. Don't set SET_UNEXPECTED_FNDECL or SET_TERMINATE_FNDECL. + (output_exception_table_entry): Delete unused array LABEL. + (expand_internal_throw): Delete unused var PARAMS. + (expand_start_catch_block): Delete unused var CLEANUP. + (emit_exception_table): Delete unused var EH_NODE_DECL. + (expand_builtin_throw): Delete unused vars UNWIND_AND_THROW and + GOTO_UNWIND_AND_THROW. Don't set them. + (end_eh_unwinder): Add top decl. + (pop_rtl_from_perm): Delete unused decl of PERMANENT_OBSTACK. + (exception_section, push_rtl_perm, do_function_call, + lang_interim_eh, push_eh_cleanup, eh_outer_context, + expand_end_eh_spec, end_eh_unwinder): Declare as static. + (saved_pc, saved_throw_type, saved_throw_value, saved_cleanup, + throw_used): Likewise. + * cp-tree.h (expand_end_eh_spec): Delete prototype. + + * search.c (dfs_mark, dfs_mark_vtable_path, + dfs_unmark_vtable_path, dfs_mark_new_vtable, + dfs_unmark_new_vtable, dfs_clear_search_slot, + dfs_search_slot_nonempty_p, bfs_markedp, bfs_unmarkedp, + bfs_marked_vtable_pathp, bfs_unmarked_vtable_pathp, + bfs_marked_new_vtablep, bfs_unmarked_new_vtablep): #if 0 unused + functions. + (n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1, + n_calls_lookup_fnfields, n_calls_lookup_fnfields_1, + n_calls_get_base_type, n_outer_fields_searched, n_contexts_saved): + Only define #ifdef GATHER_STATISTICS. + (reinit_search_statistics): Only init some vars if GATHER_STATISTICS + is defined. + (vbase_decl): Delete var definition. + (init_search): Delete old decl. + (init_vbase_pointers): Delete building of VBASE_DECL, since it's + never actually used. + (expand_indirect_vtbls_init): Delete init of VBASE_DECL. + (get_base_distance_recursive): Delete unused fourth arg + BASETYPE_PATH. Fix call . + (get_base_distance): Fix call. + (push_class_decls): Delete unused var ID. + (make_memoized_table_entry): Declare as static. + (breadth_first_search): Declare as static. + (tree_has_any_destructor_p): Declare as static. + (pop_class_decls): Delete unused arg pop_class_decls. + * class.c (popclass): Fix call to pop_class_decls. + * cp-tree.h (make_memoized_table_entry, breadth_first_search, + tree_has_any_destructor_p): Delete prototypes. + + * rtti.c (build_ptmf_desc): Delete unused arg TYPE. + (build_t_desc): Fix call. Delete unused vars ELEMS and TT. + (build_dynamic_cast): Delete unused local vars TMP1 and RETVAL. + (build_user_desc): Delete unused var T. + (build_class_desc): Delete unused vars T and OFF. + (build_t_desc): Delete unused var NAME_STRING. + (build_headof): Make static. + (get_bad_cast_node): Likewise. + (get_def_to_follow): Likewise. + * cp-tree.h (init_type_desc): Add prototype. + (build_headof): Remove prototype. + +Thu Feb 22 00:54:22 1996 Jason Merrill + + * pt.c (tsubst): Only look for matching decls at file scope for + non-member functions. + + * call.c (build_scoped_method_call): Handle scoped destructor + calls in templates. + + * decl.c (*_top_level): Also save previous_class_values. + + * pt.c (tsubst_expr): Support do {} while loops. + * parse.y (simple_stmt): Likewise. + * tree.def: Likewise. + + * method.c (build_overload_identifier): For a class nested in a + template class, don't mangle in the template parms from our + context. + + * lex.c, cp-tree.h: Remove support for template instantiations in + the pending_inlines code. + * pt.c: Remove dead functions and unused arguments. + (uses_template_parms): TYPENAME_TYPEs always use template parms. + * parse.y: Stop passing anything to end_template_decl. + * tree.c (print_lang_statistics): Only print tinst info #ifdef + GATHER_STATISTICS. + +Wed Feb 21 16:57:33 1996 Brendan Kehoe + + * init.c (expand_recursive_init{,_1}): Delete decls. + (sort_member_init): Delete unused var INIT. + (emit_base_init): Delete unused var X. + (build_offset_ref): Delete unused var CNAME. + (sort_member_init): Delete unused var FIELDS_TO_UNMARK. + (emit_base_init): Delete unused local var BASE. Delete extern + decl of IN_CHARGE_IDENTIFIER. + (build_delete): Delete unused local var VIRTUAL_SIZE. + + * init.c (build_vec_delete): Delete unused third arg ELT_SIZE. + (build_delete): Fix call. + * decl2.c (delete_sanity): Likewise. + * cp-tree.h (build_vec_delete): Update prototype. + + * typeck.c (common_base_type): Delete unused var TMP. + (build_binary_op): Delete local var ARGS_SAVE. + (build_array_ref): Delete unused var ITYPE. + (c_expand_return): Delete unused var USE_TEMP. + + * typeck.c (compexcepttypes): Delete unused arg STRICT. + (comptypes): Fix calls. + * decl.c (duplicate_decls): Likewise. + * cp-tree.h (compexcepttypes): Delete extra arg. + + * decl2.c (check_classfn): Delete unused second arg CNAME. + * decl.c (start_decl, grokfndecl): Fix calls. + * init.c (do_friend): Likewise. + * cp-tree.h (check_classfn): Update prototype. + + * cp-tree.h (signature_error, import_export_vtable, + append_signature_fields, id_in_current_class, mark_used, + copy_assignment_arg_p): Add decls. + * decl2.c (mark_used): Delete decl. + + * class.c (n_*): Wrap with #ifdef GATHER_STATISTICS. + + * class.c (get_vtable_entry): Disable unused function. + (doing_hard_virtuals): Delete unused static global var. + (finish_struct_1): Don't init DOING_HARD_VIRTUALS. + (prepare_fresh_vtable): Delete unused vars PATH and RESULT. + (overrides): Delete unused vars RETTYPE and BASE_RETTYPE. + (modify_one_vtable): Delete unused var OLD_RTTI. + (finish_struct_anon): Delete unused vars OFFSET and X. + (finish_struct_bits): Delete unused var METHOD_VEC. + (get_basefndecls): Delete unused var PURPOSE. Delete unused + for-scope local variable METHODS. + + * call.c (user_harshness): Delete unused/unneeded arg PARM. + (ideal_candidate): Delete unused args BASETYPE and PARMS. + (build_method_call): Delete unused args passed into ideal_candidate. + (build_overload_call_real): Likewise. Delete unused var OVERLOAD_NAME. + * cp-tree.h (synthesize_method): Add decl. + + * decl.c (note_level_for_for): Give void return type. + (pushdecl_nonclass_level): Likewise. + (finish_function): Delete unused vars VFIELDS and ALLOCATED_THIS. + (poplevel): Delete unused var IMPLICIT_TRY_BLOCK. + (suspend_binding_level): Delete unused var LEVEL. + (duplicate_decls): Delete unused var CTYPE. + (duplicate_decls): Delete unused var PREVIOUS_C_DECL. + (init_decl_processing): Delete unused vars FLOAT_ENDLINK and + PTR_ENDLINK. + (grokdeclarator): Delete unused var C. + (grokdeclarator): Delete unused var SIZE_VARIES. + (grokparms): Delete unused var SAW_VOID. + (start_function): Delete unused var OLDDECL. + (cplus_expand_expr_stmt): Delete unused var + REMOVE_IMPLICIT_IMMEDIATELY. + + * cp-tree.h (pushdecl_nonclass_level): Fix prototype. + + * Makefile.in (CONFLICTS): Update to 12 shift/reduce. + +Wed Feb 21 00:06:17 1996 Jason Merrill + + * tree.c (build_min): Set TREE_COMPLEXITY to lineno. + (build_min_nt): Likewise. + * pt.c (do_pushlevel): Emit line note. + (do_poplevel): Return what we get from poplevel. + (tsubst_expr): Set lineno from TREE_COMPLEXITY in stmt nodes. + * parse.y: Use do_pushlevel and do_poplevel. + * cp-tree.h: Declare do_poplevel. + + * cp-tree.h: Declare at_eof. + * decl.c (cp_finish_decl): Pass it to rest_of_decl_compilation. + * decl2.c (import_export_decl): Renamed from import_export_inline. + (finish_file): Call it to do interface handling for statics. + * pt.c (tsubst_copy): Call mark_used on variables and functions + used here. + + * decl2.c (finish_file): Don't emit statics we can't generate. + * pt.c (instantiate_decl): Don't set interface on instantiations + we can't generate. + + * cp-tree.h (struct tinst_level): Change 'classname' to 'decl'. + * tree.c (print_lang_statistics): Print max template depth. + * pt.c (push_tinst_level): Dump entire instantiation context. + (instantiate_class_template): Use it and pop_tinst_level. + (instantiate_decl): Likewise. + + * call.c class.c cp-tree.h decl.c decl2.c error.c lex.c method.c + pt.c ptree.c tree.def: Remove all traces of UNINSTANTIATED_P_TYPE. + +Tue Feb 20 18:21:51 1996 Jason Merrill + + * call.c class.c cp-tree.h cvt.c decl.c decl2.c error.c expr.c + init.c lex.c method.c parse.y pt.c repo.c search.c spew.c tree.c + tree.def typeck.c typeck2.c xref.c: Massive, systemic changes for + the new template implementation. + +Tue Feb 20 17:14:29 1996 Brendan Kehoe + + * decl2.c (check_cp_case_value): Use STRIP_TYPE_NOPS. + +Thu Feb 15 18:44:42 1996 Mike Stump + + * decl.c (cp_finish_decl): Delay emitting the debug information for + a typedef that has been installed as the canonical typedef, if the + type has not yet been defined. + +Thu Feb 15 09:39:08 1996 Jason Merrill + + * decl2.c (grokfield): Still call pop_nested_class for access decls. + +Wed Feb 14 17:30:04 1996 Brendan Kehoe + + * decl.c (lookup_label): Call label_rtx. + + * decl.c (make_binding_level): New function. + (pushlevel, pushlevel_class): Call it instead of explicit + duplicate calls to xmalloc. + + * decl.c (init_decl_processing): Delete useless build_pointer_type + call. + + * decl.c (float_ftype_float, ldouble_ftype_ldouble): Add definitions. + (sizet_ftype_string): Delete variable. + (init_decl_processing): Add built-in functions fabsf, fabsl, + sqrtf, sqrtl, sinf, sin, sinl, cosf, cos, cosl. New local + variable strlen_ftype, used for strlen. + +Wed Feb 14 16:21:25 1996 Jason Merrill + + * decl.c (push_to_top_level): Start from current_binding_level + again for now; the stl hacks depend on g++ being broken in this + way, and it'll be fixed in the template rewrite. + + * tree.def: Add USING_DECL. + * decl2.c (do_class_using_decl): Implement. + (grokfield): Pass access decls off to do_class_using_decl instead of + grokdeclarator. + * error.c (dump_decl): Handle USING_DECLs. + * decl.c (grokdeclarator): Remove code for handling access decls. + * class.c (finish_struct_1): Adjust accordingly, treat using-decls + as access decls for now. + (finish_struct): Don't check USING_DECLs for other uses of the name. + + * search.c (get_matching_virtual): Use cp_error_at. + +Wed Feb 14 10:36:58 1996 Brendan Kehoe + + * typeck.c (comptypes): Default COMP_TYPE_ATTRIBUTES to 1, to + match c-typeck.c. + (self_promoting_args_p): Move the check that TYPE is non-nil + before trying to look at its main variant. + (unsigned_type, signed_type): Add checking of DI/SI/HI/QI nodes. + + * cp-tree.h (DECL_WAITING_FRIENDS, SET_DECL_WAITING_FRIENDS): + Delete macros. + * init.c (xref_friend, embrace_waiting_friends): Delete functions. + (do_friend): Delete call to xref_friend. + * class.c (finish_struct_1): Delete call to embrace_waiting_friends. + + * typeck.c (convert_sequence): #if 0 unused function. + + * cp-tree.h (DECL_IN_MEMORY_P): New macro w/ the check that used to + be in decl_in_memory_p. + (decl_in_memory_p): Delete decl. + * expr.c (decl_in_memory_p): Delete fn. + * typeck.c (mark_addressable): Use DECL_IN_MEMORY_P. + + * decl.c (cp_finish_decl): Use DECL_IN_MEMORY_P. + +Tue Feb 13 12:51:21 1996 Jason Merrill + + * class.c (finish_struct_1): Check for a pure-specifier on a + non-virtual function here. + + * decl2.c (grok_function_init): Don't check whether the function + is virtual here. + (grokfield): Don't call check_for_override here. + + * decl.c (push_to_top_level): Start from inner_binding_level, + check class_shadowed in class levels. + +Mon Feb 12 17:46:59 1996 Mike Stump + + * decl.c (resume_level): Ignore things that don't have names, instead + of core dumping. + +Mon Feb 12 15:47:44 1996 Brendan Kehoe + + * decl2.c (grokfield): Set DECL_VINDEX properly for FUNCTION_DECLs. + +Sat Feb 10 17:59:45 1996 Jason Merrill + + * class.c (finish_struct_1): Set DECL_VINDEX properly on a + synthesized dtor. + + * parse.y (complete_type_name): Bind global_scope earlier. + (complex_type_name): Likewise. + (qualified_type_name): Remove. + +Thu Feb 8 15:15:14 1996 Jason Merrill + + * decl.c (grokfndecl): Move code that looks for virtuals in base + classes... + * class.c (check_for_override): ... to a new function. + (finish_struct_1): Call it. + + * cp-tree.h: Declare warn_sign_compare. + + * typeck.c (build_binary_op_nodefault): Check warn_sign_compare + rather than extra_warnings to decide whether to warn about + comparison of signed and unsigned. + + * decl2.c (lang_decode_option): Handle warn_sign_compare. -Wall + implies -Wsign-compare. -Wall doesn't imply -W. + +Wed Feb 7 15:27:57 1996 Mike Stump + + * typeck.c (build_component_ref): Fix to handle anon unions in base + classes as well. + +Wed Feb 7 14:29:12 1996 Brendan Kehoe + + * class.c (resolves_to_fixed_type_p): Delete code dealing with + a WITH_CLEANUP_EXPR, since we don't generate them any more. + * cvt.c (build_up_reference): Likewise. + * decl.c (grok_reference_init): Likewise. + (cp_finish_decl): Likewise. + * error.c (dump_expr): Likewise. + * tree.c (real_lvalue_p): Likewise. + (lvalue_p): Likewise. + (build_cplus_new): Likewise. + (unsave_expr_now): Likewise. + * typeck.c (unary_complex_lvalue, build_modify_expr, + c_expand_return): Likewise. + +Tue Feb 6 13:39:22 1996 Brendan Kehoe + + Make the C++ front-end pay attention to attributes for structures. + * class.c (finish_struct): New argument ATTRIBUTES, passed down into + finish_struct_1. + (finish_struct_1): New argument ATTRIBUTES; call cplus_decl_attributes. + Take out old round_up_size use and setting the DECL_ALIGN possibly + using it. Take out setting of TYPE_ALIGN to round_up_size, which + can override what the attribute set. + * cp-tree.h (finish_struct): Update prototype. + * parse.y (template_instantiate_once): Pass a NULL_TREE for the + attributes to finish_struct. + (structsp): For a CLASS decl, add maybe_attribute to rule and pass that + value down into finish_struct. + * Makefile.in (CONFLICTS): Switch to 7 shift/reduce conflicts. + +Tue Feb 6 13:12:15 1996 Per Bothner + + * decl.c (poplevel): Re-word dead for local handling. + (pushdecl): Remove useless DECL_DEAD_FOR_LOCAL test. + (cp_finish_decl): If is_for_scope, check for duplicates so + we can disable is_for_scope. Otherwise, preserve_temp_slots. + + * lex.c (do_identifier): Use global binding in preference of + dead for local variable. + +Mon Feb 5 17:46:46 1996 Mike Stump + + * init.c (initializing_context): Handle anon union changes, the + context where fields of anon unions can be initialized now has to be + found by walking up the TYPE_CONTEXT chain. + +Fri Feb 2 14:54:04 1996 Doug Evans + + * decl.c (start_decl): #ifdef out code to set DECL_COMMON + if ASM_OUTPUT{,_ALIGNED}_BSS is defined. + (obscure_complex_init): If bss is supported, always set + DECL_INITIAL to error_mark_node. + +Thu Feb 1 16:19:56 1996 Brendan Kehoe + + * init.c (is_friend): Make sure there's a context before we see if + it's an aggr type. + +Thu Feb 1 15:44:53 1996 Mike Stump + + * init.c (is_friend): Classes are not friendly with nested classes. + +Thu Feb 1 15:27:37 1996 Doug Evans + + * lex.c (check_newline): Pass last character read to HANDLE_PRAGMA, + and record its result. + +Thu Feb 1 09:27:01 1996 Mike Stump + + * class.c (finish_struct_anon): Switch around code to not move anon + union elements around, nor mess up their contexts, nor offsets, + instead we now build up the right number of COMPONENT_REFs for all + the anon unions that may be present at build_component_ref time. + * typeck.c (lookup_anon_field): New routine to handle field lookup + on fields without names. We find them, based upon their unique type + instead. + * typeck.c (build_component_ref): Allow FIELD_DECL components. + Handle finding components in anonymous unions, and ensure that a + COMPONENT_REF is built for each level as necessary. + +Tue Jan 30 18:18:23 1996 Mike Stump + + * cvt.c (build_up_reference): Make the INDIRECT_BIND case come after + code that ensures that copy ctors are used if appropriate. + +Tue Jan 30 17:35:14 1996 Brendan Kehoe + + * init.c (build_vec_delete): Only give an error if base isn't an + error_mark_node. + +Mon Jan 29 17:09:06 1996 Mike Stump + + * spew.c (do_aggr): `new struct S;' isn't a forward declaration. + (yylex): If we see `new', keep slurping. + +Thu Jan 25 18:31:36 1996 Mike Stump + + * class.c (finish_struct_1): Move code for handling anon unions... + (finish_struct_anon): to here. Fixup so that we do the offset + calculations right, and so that the fields are physically moved to + the containers's chain. + +Thu Jan 25 18:27:37 1996 Brendan Kehoe + + * decl.c (grokdeclarator): Avoid trying to get an operand off an + identifier node. + +Wed Jan 24 11:25:30 1996 Jim Wilson + + * typeck.c (pointer_int_sum): Use TYPE_PRECISION (sizetype) not + POINTER_SIZE to agree with expr.c. + +Thu Jan 25 13:01:23 1996 Mike Stump + + * search.c (lookup_field): Don't report ambiguities if protect is 0, + instead return NULL_TREE. + +Wed Jan 24 13:01:26 1996 Mike Stump + + * class.c (finish_struct_1): Call warn_hidden if we want warnings + about overloaded virtual functions. + (warn_hidden): New routine to warn of virtual functions that are + hidden by other virtual functions, that are not overridden. + (get_basefndecls): New routine, used by warn_hidden. + (mark_overriders): New routine, used by warn_hidden. + * search.c (get_matching_virtual): Remove old warning that just + isn't very useful. + +Tue Jan 23 12:26:10 1996 Brendan Kehoe + + * decl.c (output_builtin_tdesc_entries): #if 0 the function definition. + + * typeck.c (null_ptr_cst_p): Delete unused fn. + (build_function_call_maybe): Delete unused fn. + + * expr.c (extract_init): #if 0 the code after unconditional return 0 + for now. + + Delete old cadillac code. + * edsel.c: Remove file. + * Make-lang.in (CXX_SRCS): Take edsel.c off the list. + * Makefile.in (CXX_OBJS): Delete edsel.o. + (edsel.o): Delete rule. + * cp-tree.h (flag_cadillac): Delete var decl. + * lang-options.h: Delete "-fcadillac" and "-fno-cadillac". + * decl2.c (flag_cadillac): Delete var definition. + (lang_decode_option): Delete handling of -fcadillac and -fno-cadillac. + (grokfield): Delete code depending on flag_cadillac. + (finish_anon_union): Likewise. + * class.c (finish_struct_1): Likewise. + (pushclass): Likewise. + (popclass): Likewise. + (push_lang_context): Likewise. + (pop_lang_context): Likewise. + * decl.c (init_decl_processing): Likewise. + (start_decl): Likewise. + (cp_finish_decl): Likewise. + (xref_tag): Likewise. + (finish_enum): Likewise. + (start_function): Likewise. + (finish_function): Likewise. + (finish_stmt): Likewise. + * lex.c (lang_init): Likewise. + (check_newline): Likewise. + + * lex.c (do_pending_inlines): Delete synthesized method kludge. + + Delete defunct, ancient garbage collection implementation. + * rtti.c: New file with the RTTI stuff from gc.c. + * gc.c: Removed file (moved the remaining stuff into rtti.c). + * Makefile.in (CXX_OBJS): Replace gc.o with rtti.o. + (rtti.o): New rule, replacing gc.o. + * Make-lang.in (CXX_SRCS): Replace gc.c with rtti.c. + * cp-tree.h: Delete gc-related fn decls. + (DECL_GC_OFFSET): Delete macro. + (flag_gc): Delete extern decl. + * decl.c (current_function_obstack_index): Delete var decl. + (current_function_obstack_usage): Delete var decl. + (start_function): Delete clearing of current_function_obstack_index + and current_function_obstack_usage. + (init_decl_processing): Delete code relying on -fgc. + Delete call to init_gc_processing. + (cp_finish_decl): Delete calls to build_static_gc_entry and + type_needs_gc_entry. Delete gc code setting DECL_GC_OFFSET. + (store_parm_decls): Delete -fgc calls to cp_expand_decl_cleanup + and to expand_expr of a __gc_main call. + (maybe_gc_cleanup): Delete var decl. + (finish_function): Delete call to expand_gc_prologue_and_epilogue. + * decl2.c (flag_gc): Delete var decl. + (lang_f_options): Delete offering of -fgc. + (lang_decode_option): Delete -fgc and -fno-gc handling. + (get_temp_regvar): Delete gc code. + * init.c (build_new): Delete gc code. + * lex.c (init_lex): Delete checking of flag_gc. + + * typeck.c (convert_arguments): Delete gc code. + (build_component_addr): Delete -fgc warning. + (build_modify_expr): Delete gc code. + + * decl2.c (build_push_scope): Delete fn. + * cp-tree.h (build_push_scope): Delete decl. + + * search.c (clear_search_slots): Delete fn. + * cp-tree.h (clear_search_slots): Delete decl. + + * search.c (tree_needs_constructor_p): Delete fn. + * cp-tree.h (tree_needs_constructor_p): Delete decl. + + * tree.c (id_cmp): Delete fn. + + * tree.c (set_fnaddr_from_vtable_entry): Delete fn. + * cp-tree.h (set_fnaddr_from_vtable_entry): Delete decl. + + * tree.c (decl_value_member): Delete fn. + * cp-tree.h (decl_value_member): Delete decl. + + * tree.c (list_hash_lookup_or_cons): Delete fn. + * cp-tree.h (list_hash_lookup_or_cons): Delete decl. + + * method.c (cplus_exception_name): Delete fn. + (EXCEPTION_NAME_{PREFIX, LENGTH}): Delete macros. + + * spew.c (shift_tokens): Delete fn. + +Mon Jan 22 17:49:33 1996 Jason Merrill + + * except.c (init_exception_processing): Pass 1 to needs_pop in calls + to cp_finish_decl. + * parse.y: Likewise. + +Mon Jan 22 17:34:29 1996 Brendan Kehoe + + * tree.c (build_cplus_staticfn_type): Delete function definition; + never used. + * cp-tree.h (build_cplus_staticfn_type): Delete decl. + + * tree.c (virtual_member): Delete function definition; never used. + * cp-tree.h (virtual_member): Delete decl. + +Fri Jan 19 18:03:14 1996 Mike Stump + + * typeck.c (build_component_ref): Handle getting vbase pointers + out of complex multiple inheritance better. + +Fri Jan 19 16:27:40 1996 Mike Stump + + * typeck.c (build_object_ref): Make sure we use the real type, not + any reference type. + +Fri Jan 19 16:01:47 1996 Mike Stump + + * tree.c (build_exception_variant): Don't create new types if we + don't have to, also build new types on the right obstack. + +Fri Jan 19 14:09:44 1996 Jason Merrill + + * decl.c (store_bindings): Split out from push_to_top_level. + (push_to_top_level): Call it for b->type_shadowed on class binding + levels. + +Fri Jan 19 13:53:14 1996 Mike Stump + + * search.c (expand_upcast_fixups): Fix so that offsets stored in + vbase_offsets are always right. Fixes a problem where virtual base + upcasting and downcasting could be wrong during conversions on this + during virtual function dispatch at ctor/dtor time when dynamic + vtable fixups for deltas are needed. This only sounds easier than + it is. :-) + (fixup_virtual_upcast_offsets): Change to reflect new calling + convention for expand_upcast_fixups. + +Fri Jan 19 12:23:08 1996 Brendan Kehoe + + * decl2.c (grokbitfield): Strip the NOPs from WIDTH before we + check that it's usable as the bitfield width. + +Wed Jan 17 21:22:40 1996 Brendan Kehoe + + * decl2.c (grokfield): Call cplus_decl_attributes with the attrlist. + Pass a null tree to grokdeclarator for its ATTRLIST arg, since it's + only ever used for functions in it. + +Wed Jan 17 12:10:38 1996 Jason Merrill + + * parse.y (qualified_type_name): Use the TYPE_DECL, not the type. + (nested_type): Likewise. + (nested_name_specifier): Use lastiddecl. + + * decl.c (grokdeclarator): Adjust accordingly. + * init.c (expand_member_init): Likewise. + * parse.y (base_class): Likewise. + * typeck2.c (build_functional_cast): Likewise. + + * typeck2.c (build_functional_cast): Fill in name after we've + checked for non-aggr type. + +Wed Jan 17 10:18:01 1996 Mike Stump + + * decl2.c (warn_pointer_arith): Default to on. + +Tue Jan 16 12:45:38 1996 Jason Merrill + + * lex.c (is_rid): New function. + * decl.c (grokdeclarator): Diagnose reserved words used as + declarator-ids. + +Tue Jan 16 11:39:40 1996 Jason Merrill + + * tree.c (get_decl_list): Don't lose cv-quals. + + * decl.c (grokdeclarator): Fix SCOPE_REF handling and diagnose + typespecs used as declarator-ids. + +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 + + * typeck.c (build_object_ref): Finish what I started. + + * parse.y (qualified_type_name): Don't check TYPE_BUILT_IN. + + * decl2.c (constructor_name_full): Handle TEMPLATE_TYPE_PARMs. + + * decl.c (grokdeclarator): Also accept TEMPLATE_TYPE_PARM as a + scope. + +Mon Jan 15 16:19:32 1996 Jason Merrill + + * decl.c (xref_tag): Handle passing a type in directly. + + * parse.y (qualified_type_name): Pull out the type. + (nested_type): Likewise. + Take types directly instead of as identifiers. + * call.c (build_scoped_method_call): Take types directly instead of + as identifiers. + * decl.c (xref_basetypes): Likewise. + * init.c (expand_member_init): Likewise. + (build_member_call): Likewise. + (build_offset_ref): Likewise. + * typeck2.c (build_scoped_ref): Likewise, remove bogus code. + * method.c (do_build_assign_ref): Likewise. + * decl.c (grokdeclarator): Handle a type appearing as the + declarator-id for constructors. + * method.c (do_build_copy_constructor): current_base_init_list now + uses the types directly, not their names. + * init.c (sort_base_init): Likewise. + (expand_member_init): Likewise. + * init.c (is_aggr_type): New function, like is_aggr_typedef. + +Mon Jan 15 08:45:01 1996 Jeffrey A Law + + * tree.c (layout_basetypes): Call build_lang_field_decl instead + of build_lang_decl if first arg is a FIELD_DECL. + +Thu Jan 11 14:55:07 1996 Brendan Kehoe + + * decl.c (cp_finish_decl): Only clear TREE_USED if DECL_NAME is + non-empty. + * except.c (expand_start_catch_block): Set TREE_USED to avoid + warnings about the catch handler. + +Mon Jan 8 17:35:12 1996 Jason Merrill + + * typeck.c (build_modify_expr): Use a COMPOUND_EXPR instead of + expand_target_expr. + +Thu Jan 4 12:30:32 1996 Brendan Kehoe + + Fix access control to use trees rather than integers. + * class.c (access_{default, public, protected, private, + default_virtual, public_virtual, private_virtual}_node): Add + definitions. + (init_class_processing): Do creation of those nodes. + * cp-tree.h (access_type): Delete enum decl. + (access_{default, public, protected, private, default_virtual, + public_virtual, private_virtual}_node): Add decls. + (compute_access): Change return type. + * search.c (compute_access): Have tree return type, instead of enum. + (lookup_field): Declare THIS_V and NEW_V to be tree nodes. + * lex.c (real_yylex): Use yylval.ttype for giving the value of the + access_* node for each of RID_{PUBLIC, PRIVATE, PROTECTED}. + * parse.y (VISSPEC): Make ttype rather than itype. + (base_class_access_list): Likewise. + * *.[cy]: Change all refs of `access_public' to `access_public_node', + etc. + * call.c (build_method_call): Make ACCESS be a tree. + * class.c (alter_access, finish_struct_1, filter_struct): Likewise. + * cvt.c (convert_to_aggr): Likewise. + * init.c (build_offset_ref, resolve_offset_ref, build_delete): + Likewise. + * method.c (hack_identifier): Likewise. + * typeck.c (build_component_ref_1, build_component_ref): ): Likewise. + +Thu Jan 4 11:02:20 1996 Mike Stump + + * typeck.c (pointer_int_sum, pointer_diff): Make code agree with C + frontend, and make it more consistent with respect to + warn_pointer_arith. + +Tue Jan 2 00:13:38 1996 Rusty Russell + + * decl.c (pushdecl): Check for duplicate parameter names. + +Wed Jan 3 09:25:48 1996 Mike Stump + + * decl.c (expand_static_init): Call assemble_external for atexit. + +Wed Jan 3 07:55:19 1996 Mike Stump + + * except.c (do_unwind): Remove some generated dead code. + (eh_outer_context): New routine, factor out some common code from + expand_builtin_throw and end_eh_unwinder. Add code to do return + address masking for the PA. + (expand_builtin_throw): Use eh_outer_context instead of open coding + it here. + (end_eh_unwinder): Likewise. + +Tue Jan 2 17:00:56 1996 Mike Stump + + * except.c (expand_throw): Call assemble_external for __empty, if we + use it. + + +Copyright (C) 1996 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1997 b/gcc/cp/ChangeLog-1997 new file mode 100644 index 000000000..2c34b8db4 --- /dev/null +++ b/gcc/cp/ChangeLog-1997 @@ -0,0 +1,2614 @@ +Mon Dec 22 11:36:27 1997 Kaveh R. Ghazi + + * call.c (add_builtin_candidate): Add default case in enumeration + switch. + (build_new_op): Likewise. + (convert_like): Likewise. + * cvt.c (build_expr_type_conversion): Likewise. + * tree.c (real_lvalue_p): Likewise. + (lvalue_p): Likewise. + (cp_tree_equal): Likewise. + * typeck.c (comptypes): Likewise. + (build_component_ref): Likewise. + (build_function_call_real): Likewise. + (build_binary_op_nodefault): Likewise. + (build_unary_op): Likewise. + (build_modify_expr): Likewise. + * typeck2.c (initializer_constant_valid_p): Likewise. + +Sun Dec 21 15:59:00 1997 Nick Clifton + + * decl2.c (lang_decode_option): Add support for -Wunknown-pragmas. + +Thu Dec 18 14:51:50 1997 Mark Mitchell + + * pt.c (coerce_template_parms): Make sure to digest_init if + possible. + + * decl.c (duplicate_decls): Make the newdecl virtual if the + olddecl was, just as is done with other attributes of olddecl. + +Thu Dec 18 14:43:19 1997 Jason Merrill + + * typeck.c (unary_complex_lvalue): Ignore op0 when taking the + address of an OFFSET_REF. + + * cp-tree.def: Add AGGR_INIT_EXPR. + * error.c, tree.c, typeck.c: Replace uses of NEW_EXPR with + AGGR_INIT_EXPR where appropriate. + * expr.c (cplus_expand_expr): Likewise. Simplify. + + * decl2.c (finish_file): Remove call to register_exception_table. + +Wed Dec 17 17:08:52 1997 Benjamin Kosnik + + * pt.c (instantiate_class_template): Don't do injection when + processing_template_decl is true, as pollutes current_binding_level + for base classes. + +Wed Dec 17 21:17:39 1997 Peter Schmid + + * pt.c (maybe_fold_nontype_arg): Add prototype. + +Tue Dec 16 10:31:20 1997 Jason Merrill + + * tree.c (mapcar): Handle TRY_CATCH_EXPR et al. + * error.c (dump_expr): Likewise. + +Mon Dec 15 12:22:04 1997 Jason Merrill + + * typeck.c (build_function_call_real): Remove "inline called before + definition" pedwarn. + + * pt.c (coerce_template_parms): Use maybe_fold_nontype_arg. + +Sun Dec 14 22:34:20 1997 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Fix base conversion of pm's. + + * pt.c (type_unification_real): Change __null to type void* with + a warning. + +Sun Dec 14 20:38:35 1997 Mark Mitchell + + * call.c (implicit_conversion): Don't call + build_user_type_conversion_1 with a NULL expr, since it will + crash. + + * pt.c (unify): Don't try to unify array bounds if either array is + unbounded. + +Fri Dec 12 16:09:14 1997 Jason Merrill + + * errfn.c (cp_pedwarn, cp_pedwarn_at, cp_error_at, cp_warning_at): + Replace extern decls with casts. + + * decl.c (expand_start_early_try_stmts): Don't mess with a sequence. + Update last_parm_cleanup_insn. + (store_after_parms): Remove. + * cp-tree.h: Adjust. + +Thu Dec 11 22:18:37 1997 Jason Merrill + + * decl2.c (comdat_linkage): Also set DECL_COMDAT. + (finish_file): Check DECL_COMDAT instead of weak|one_only. + (import_export_vtable): Use make_decl_one_only instead of + comdat_linkage for win32 tweak. + (import_export_decl): Likewise. + * pt.c (mark_decl_instantiated): Likewise. + + * decl2.c (finish_file): Lose handling of templates in pending_statics. + +Thu Dec 11 21:12:09 1997 Jason Merrill + + * decl2.c (finish_file): Lose call to expand_builtin_throw. + * except.c (expand_builtin_throw): Remove. + * cp-tree.h: Remove ptr_ptr_type_node. + * decl.c: Likewise. + +Thu Dec 11 20:43:33 1997 Teemu Torma + + * decl.c (ptr_ptr_type_node): Define. + (init_decl_processing): Initialize it. + * cp-tree.h: Declare it. + * exception.cc (__cp_exception_info): Use __get_eh_info. + (__cp_push_exception): Likewise. + (__cp_pop_exception): Likewise. + + From Scott Snyder : + * except.c (expand_builtin_throw): Use get_saved_pc_ref instead of + saved_pc. + (init_exception_processing): Removed saved_pc initialization. + +Wed Dec 10 11:04:45 1997 Jason Merrill + + * pt.c (instantiate_decl): Defer all templates but inline functions. + +Mon Dec 8 23:17:13 1997 Jason Merrill + + * init.c (expand_vec_init): Don't fold a list of parameters. + + * decl.c (copy_args_p): Handle copy elision for types with virtual + bases. + * call.c (build_over_call): Likewise. + +Sun Dec 7 22:38:12 1997 Mark Mitchell + + * pt.c (lookup_template_function): Copy the template arguments, + not just the list containing them, to the permanent obstack. + +Sun Dec 7 15:53:06 1997 Jason Merrill + + * except.c (expand_start_catch_block): suspend_momentary for the + terminate handler. + + * error.c (dump_decl): Handle LOOKUP_EXPR. + +Sun Dec 7 15:45:07 1997 Mark Mitchell + + * rtti.c (build_dynamic_cast): Copy the cast-to type to the + permanent obstack if we are processing a template decl. + * typeck.c (build_static_cast): Likewise. + (build_const_cast): Likewise. + (build_reinterpret_cast): Likewise. + + * pt.c (coerce_template_parms): Coerce some expressions, even + when processing_template_decl. + +Sun Dec 7 01:46:33 1997 Bruno Haible + + * typeck.c (build_binary_op_nodefault, pointer_diff): Symmetric + handling of pointer difference expressions. + + * typeck.c (comp_target_types): Comparison of function/method types + is independent of nptrs. + +Sun Dec 7 01:40:27 1997 Mark Mitchell + + * pt.c (tsubst): Avoid creating pointer to reference and + reference to reference types. + +Sat Dec 6 01:29:37 1997 Jason Merrill + + * parse.y (do_id): New nonterminal. + (template_id): Use it. + +Fri Dec 5 01:17:34 1997 Jason Merrill + + * parse.y (template_id): do_identifier for PFUNCNAMEs, too. + * spew.c (yylex): Don't do_identifier here. + * decl2.c (build_expr_from_tree): Revert last change. + + * decl2.c (build_expr_from_tree): Expand the name for a method call. + * parse.y (object_template_id): Don't try to take the DECL_NAME. + +Wed Dec 3 20:02:39 1997 Jason Merrill + + * init.c (build_new): Use a TARGET_EXPR instead of SAVE_EXPR for + alloc_expr. + * call.c (build_op_delete_call): Adjust. + + * except.c (expand_end_catch_block): Lose rethrow region. + (expand_start_catch_block): Likewise. + (expand_end_catch_block): Don't expand_leftover_cleanups. + +Wed Dec 3 13:24:04 1997 Benjamin Kosnik + + * pt.c (tsubst): Remove tree_cons call (places redundant info into + DECL_TEMPLATE_INSTANTIATION). + +Wed Dec 3 11:44:52 1997 Jason Merrill + + * tree.c (is_overloaded_fn): Handle getting a fn template. + (really_overloaded_fn): Likewise. + * error.c (dump_decl): Handle TEMPLATE_ID_EXPRs better. + * pt.c (check_explicit_specialization): Tweak. + (determine_explicit_specialization): Tweak. + + * tree.c, cp-tree.h (get_target_expr): New fn. + +Wed Dec 3 08:47:27 1997 Paul Eggert + + * pt.c (check_explicit_specialization): Fix misspelling in + diagnostic: `preceeded'. + * typeck.c (get_delta_difference): Fix misspelling in diagnostic: + `conversiona'. + +1997-12-02 Mark Mitchell + + * pt.c (determine_explicit_specialization): Avoid an internal + error for bad specializations. + + * method.c (build_overload_value): Handle SCOPE_REF. + +Tue Dec 2 19:18:50 1997 Mike Stump + + * class.c (prepare_fresh_vtable): Enable even more complex MI + vtable names. + +Tue Dec 2 01:37:19 1997 Jason Merrill + + * exception.cc (__check_eh_spec): Optimize a bit. + + * exception.cc (__cp_pop_exception): Lose handler arg. + * except.c (do_pop_exception): Likewise. + (push_eh_cleanup): Let the cleanup mechanism supply the handler. + (expand_end_catch_block): Likewise. + +Fri Nov 28 01:58:14 1997 Jason Merrill + + * pt.c (check_explicit_specialization): Complain about using a + template-id for a non-specialization. + +Fri Nov 28 12:35:19 1997 Scott Christley + + * repo.c: Prototype rindex only if needed. + * xref.c: Likewise. + +Fri Nov 28 01:56:35 1997 Bruno Haible + + * error.c (dump_decl): Handle TEMPLATE_ID_EXPR. + +Thu Nov 27 00:59:46 1997 Jason Merrill + + * typeck.c (build_const_cast): Handle references here instead of + handing off to convert_to_reference. + + * except.c: Lose Unexpected, SetTerminate, SetUnexpected, + TerminateFunctionCall. + (init_exception_processing): Likewise. Terminate et al are now + the fns, not ADDR_EXPRs. + (various): Lose redundant assemble_external calls. + (do_unwind): s/BuiltinReturnAddress/builtin_return_address_fndecl/. + + * cp-tree.h (struct lang_decl_flags): Add comdat. + (DECL_COMDAT): New macro. + * decl.c (duplicate_decls): Propagate it. + (cp_finish_decl): Handle it. + * decl2.c (import_export_decl): Just set DECL_COMDAT on VAR_DECLs. + + * class.c: Remove static pending_hard_virtuals. + (add_virtual_function): Take pointers to pending_virtuals + and pending_hard_virtuals. + (finish_struct_1): Pass them. Declare pending_hard_virtuals. + +Wed Nov 26 20:28:49 1997 Jason Merrill + + * decl2.c (import_export_vtable): If we support one_only but not + weak symbols, mark instantiated template vtables one_only. + (import_export_decl): Likewise for tinfo functions. + (finish_vtable_vardecl): Also write out vtables from explicitly + instantiated template classes. + * pt.c (mark_class_instantiated): Revert last change. + + * except.c (expand_throw): Call mark_used on the destructor. + +Wed Nov 26 15:13:48 1997 Jeffrey A Law (law@cygnus.com) + + * lex.c (lang_init): Enable flag_exceptions by default if no + command line switch was specified. + +1997-11-26 Mark Mitchell + + * pt.c (unify): Handle `void' template parameters in + specializations. + +Wed Nov 26 01:11:24 1997 Jason Merrill + + * rtti.c (build_dynamic_cast): Handle template case here. + (build_dynamic_cast_1): Not here. + + * typeck2.c (digest_init): Make copies where appropriate. + + * decl2.c (delete_sanity): resolve_offset_ref. + + * except.c: Call terminate without caching so many bits. + + * except.c (expand_start_catch_block): Fix catching a reference + to pointer. + +Tue Nov 25 11:28:21 1997 Jason Merrill + + * init.c (build_new): Copy size to the saveable obstack. + + * init.c (build_new): Stick a CLEANUP_POINT_EXPR inside the + TRY_CATCH_EXPR for now. + +Mon Nov 24 12:15:55 1997 Jason Merrill + + * typeck.c (mark_addressable): Don't assume a FUNCTION_DECL + has DECL_LANG_SPECIFIC. + + * exception.cc (struct cp_eh_info): Add handlers field. + (__cp_push_exception): Initialize it. + (__cp_pop_exception): Decrement it. Don't pop unless it's 0. + (__throw_bad_exception): Remove. + * except.c (call_eh_info): Add handlers field. + (get_eh_handlers): New fn. + (push_eh_cleanup): Increment handlers. + +Fri Nov 21 12:22:07 1997 Jason Merrill + + * except.c (expand_start_eh_spec): Use the try/catch code. + (expand_end_eh_spec): Likewise. Call __check_eh_spec instead of + doing everything inline. + (init_exception_processing): throw_type_match now takes + const void pointers. + * exception.cc (__check_eh_spec): New fn. + * inc/exception: Neither terminate nor unexpected return. + * decl.c: Make const_ptr_type_node public. + * tinfo2.cc (__throw_type_match_rtti): Take the typeinfos constly. + + * except.c (expand_start_catch_block): We only need the rethrow + region for non-sjlj exceptions. + (expand_end_catch_block): Likewise. Use outer_context_label_stack. + +Thu Nov 20 14:40:17 1997 Jason Merrill + + * Make-lang.in (CXX_LIB2FUNCS): Add new op new and op delete objs. + (various.o): Likewise. + * inc/new: Add placement deletes. Add throw specs for default new. + * new.cc (set_new_handler): Move here from libgcc2. + * new1.cc (new (nothrow)): Catch a bad_alloc thrown from the handler. + (new): Move from libgcc2. Throw bad_alloc. + * new2.cc: Move the rest of the op news and op deletes from libgcc2. + * decl.c (init_decl_processing): Update exception specs on new and + delete. + + * method.c (build_decl_overload_real): Don't mess with global + placement delete. + + * init.c (build_new): Check for null throw spec, not nothrow_t. + + * decl.c (duplicate_decls): Don't complain about different exceptions + from an internal declaration. + + * call.c (build_op_delete_call): Fix check for member fns again. + + * decl2.c (import_export_decl): Interface hackery affects + virtual synthesized methods. + +Wed Nov 19 18:24:14 1997 Jason Merrill + + * decl.c (start_decl): Don't just complain about a mismatched + scope, fix it. + + * decl.c (make_implicit_typename): Handle case where t is not + actually from context. + * tree.c (get_type_decl): Lose identifier case. + * spew.c (yylex): Lose useless call to identifier_typedecl_value. + * parse.y (nonnested_type): Just use lookup_name. + (complex_type_name): Just use IDENTIFIER_GLOBAL_VALUE. + +Wed Nov 19 11:45:07 1997 Michael Tiemann + + * error.c (dump_function_name): Test DECL_LANG_SPECIFIC in case + T was built in C language context (for example, by + output_func_start_profiler). + +Wed Nov 19 10:39:27 1997 Jason Merrill + + * decl.c (make_implicit_typename): New fn. + (lookup_name_real): Use it. Use current_class_type as the context. + +Mon Nov 17 23:42:03 1997 Bruno Haible + + * pt.c (do_poplevel): Don't prohibit jumps into this contour. + +Mon Nov 17 02:01:28 1997 Jason Merrill + + * friend.c (do_friend): Warn about non-template friends in templates. + + * call.c (build_op_delete_call): Fix handling of inherited delete. + + * search.c (dfs_record_inheritance): Ignore template type parms. + +Sat Nov 15 00:30:51 1997 Jason Merrill + + * call.c (build_new_op): Fix copy error. + (build_op_new_call): New fn. + (build_op_delete_call): New fn. + * cp-tree.h: Declare them. + * init.c (build_new): Use them. Support placement delete. + (build_x_delete): Use build_op_delete_call. + (build_delete): Likewise. + * decl2.c (delete_sanity): Likewise. + (coerce_delete_type): Don't complain about placement delete. + +Thu Nov 13 01:52:36 1997 Jason Merrill + + * call.c (build_new_function_call): Remove unused 'obj' parm. + * cp-tree.h, typeck.c: Adjust. + + * init.c (build_new): Make the cleanup last longer. + (expand_vec_init): Call do_pending_stack_adjust. + +Wed Nov 12 11:04:33 1997 Jason Merrill + + * pt.c (do_type_instantiation): Fix typo. + (mark_class_instantiated): If we support one_only but not weak + symbols, don't mark this as known. + + * init.c (build_new): Handle vec delete in EH cleanup. + +Wed Nov 12 08:11:55 1997 Benjamin Kosnik + + * call.c (build_method_call): Call complete_type before checking + for destructor. + +Sun Nov 9 01:29:55 1997 Jim Wilson (wilson@cygnus.com) + + * decl.c (add_block_current_level): Delete. + * init.c (build_vec_delete_1): Delete build_block and + add_block_current_level calls. + +Wed Nov 12 00:48:16 1997 Jason Merrill + + * init.c (build_new): Handle freeing allocated memory when the + constructor throws. + + * call.c (build_new_method_call): Fix flags arg. + + * pt.c (do_type_instantiation): Don't try to instantiate + member templates. + (mark_decl_instantiated): If we support one_only but not + weak symbols, mark this one_only. + * decl2.c (import_export_vtable): Don't defer handling of vtables + if MULTIPLE_SYMBOL_SPACES. + +Tue Nov 11 12:02:12 1997 Jason Merrill + + * except.c (expand_end_catch_block): Lose call to __sjpopnthrow. + +Tue Nov 11 02:53:44 1997 Jason Merrill + + * except.c (do_pop_exception): Return a value. + +Mon Nov 10 20:25:31 1997 Jason Merrill + + * call.c (build_new_method_call): Handle getting a + TEMPLATE_ID_EXPR around a TEMPLATE_DECL. Don't look for a field + if we got template parms. + * typeck.c (build_x_function_call): Remember the TEMPLATE_ID_EXPR, + not just the args. + * decl2.c (build_expr_from_tree): Tweak last change. + * pt.c (tsubst_copy): Use get_first_fn instead of TREE_VALUE. + (maybe_fold_nontype_arg): Split out from tsubst_copy. + * tree.c (get_first_fn): Just return a TEMPLATE_ID_EXPR. + +Mon Nov 10 20:08:38 1997 Kriang Lerdsuwanakij + + * pt.c (tsubst_copy): Handle explicit template arguments in + function calls. + * typeck.c (build_x_function_call): Likewise. + * decl2.c (build_expr_from_tree): Lookup function name if it + hasn't been done. + + * pt.c (tsubst): Instantiate template functions properly when + template parameter does not appear in function arguments and return + type. + (comp_template_args): Handle member templates required by tsubst. + +Mon Nov 10 20:08:38 1997 Jason Merrill + + * decl.c (grokdeclarator): Tweak conditions for pedwarn in + previous change. + +Mon Nov 10 20:08:29 1997 Bruno Haible + + * pt.c (coerce_template_parms): Tweak error message. + + * decl.c (grokdeclarator): If -Wreturn-type, warn everytime a + return type defaults to `int', even if there are storage-class + specifiers. + +Mon Nov 10 03:04:20 1997 Jason Merrill + + Complete nested exception support. + * except.c (do_pop_exception): Split out... + (push_eh_cleanup): From here. Handle the EH region by hand. + (expand_start_catch_block): Add a new level for the catch parm. + Move the rethrow region outside the two cleanup regions. + Protect the initializer for the catch parm with terminate. + (expand_end_catch_block): Likewise. End the region for the eh_cleanup. + * exception.cc (__cp_pop_exception): Now takes two parms. Handle + popping off the middle of the stack. + * tree.c (lvalue_p, real_lvalue_p): Handle TRY_CATCH_EXPR, + WITH_CLEANUP_EXPR, and UNSAVE_EXPR. + (build_cplus_new): Only wrap CALL_EXPRs. + * init.c (expand_default_init): Handle a TRY_CATCH_EXPR around + the constructor call. + +Sun Nov 9 18:00:26 1997 Richard Kenner + + * Make-lang.in (c++.distdir): Make inc subdirectory. + +Fri Nov 7 11:57:28 1997 Jason Merrill + + * decl2.c (finish_file): Put back some code. + +Thu Nov 6 11:28:14 1997 Jason Merrill + + * decl2.c (finish_file): Remove redundant code. + * method.c (emit_thunk): Don't let the backend defer generic thunks. + +Wed Nov 5 23:52:50 1997 Jason Merrill + + * except.c (call_eh_info): Split out... + (push_eh_info): From here. + (expand_builtin_throw): Use it. + (expand_start_catch_block): Move region start back. + +Tue Nov 4 13:45:10 1997 Doug Evans + + * lex.c (MULTIBYTE_CHARS): #undef if cross compiling. + (real_yylex): Record wide strings using target endianness, not host. + +1997-11-03 Brendan Kehoe + + * repo.c (rindex): Add decl unconditionally. + (get_base_filename, open_repo_file): Don't cast rindex. + * xref.c (rindex): Add decl unconditionally. + (index): Remove unused decl. + (open_xref_file): Don't cast rindex. + +Sun Nov 2 15:04:12 1997 Jason Merrill + + * class.c (build_vbase_path): Propagate the result type properly. + +1997-11-01 Brendan Kehoe + + * except.c (expand_builtin_throw) [!DWARF2_UNWIND_INFO]: Replace + remaining use of saved_throw_type with a call to get_eh_type. + +1997-10-31 Brendan Kehoe + + * lex.c (FILE_NAME_NONDIRECTORY): Delete macro. + (file_name_nondirectory): New function, doing the same as the macro. + (set_typedecl_interface_info): Use it instead of the macro. + (check_newline): Likewise. + (handle_cp_pragma): Likewise. + + * repo.c (get_base_filename): Cast result of rindex to char*. + (open_repo_file): Likewise. + * xref.c (open_xref_file): Likewise. + * error.c (dump_char): Make its arg int, not char. + + * except.c (push_eh_info): Pass the number of fields - 1 down, not + the exact number of fields. + +Fri Oct 31 01:47:57 1997 Jason Merrill + + Support for nested exceptions. + * tinfo2.cc (__is_pointer): New fn. + * exception.cc (struct cp_eh_info): Define. + (__cp_exception_info, __uncatch_exception): New fns. + (__cp_push_exception, __cp_pop_exception): New fns. + * except.c: Lose saved_throw_{type,value,cleanup,in_catch}. + Lose empty_fndecl. + (init_exception_processing): Likewise. __eh_pc is now external. + (push_eh_info): New fn. + (get_eh_{info,value,type,caught}): New fns. + (push_eh_cleanup): Just call __cp_pop_exception. + (expand_start_catch_block): Use push_eh_info. Start the eh region + sooner. + (expand_end_eh_spec): Use push_eh_info. + (expand_throw): Call __cp_push_exception to set up the exception info. + Just pass the destructor or 0 as the cleanup. Call __uncatch_exception + when we rethrow. + (expand_builtin_throw): Don't refer to empty_fndecl. + +Thu Oct 23 02:01:30 1997 Jason Merrill + + * pt.c (instantiate_decl): SET_DECL_IMPLICIT_INSTANTIATION on new decl. + +1997-10-22 Brendan Kehoe + + * method.c (build_template_parm_names, build_decl_overload_real): + Add static to definitions. + * pt.c (add_to_template_args, note_template_header, + processing_explicit_specialization, type_unification_real): Likewise. + ({determine,check}_explicit_specialization): Use a single string for + error messages. + +Mon Oct 20 12:06:34 1997 Jason Merrill + + * except.c (expand_exception_blocks): Call do_pending_stack_adjust. + (expand_end_catch_block): Likewise. + (expand_end_eh_spec): Likewise. + +Mon Oct 20 11:44:20 1997 Mark Mitchell + + * decl.c (duplicate_decls): Handle template specializations + correctly. + * error.c (dump_function_name): Fix printing of specializations of + member functions that are not member templates. + * cp-tree.h (processing_specialization): Make global. + * pt.c (processing_specialization): Likewise. + * lex.c (cons_up_default_function): Save and restore + processing_specialization to avoid confusion. + +Mon Oct 20 10:52:22 1997 Jason Merrill + + * decl.c (init_decl_processing): Give null_node unknown* type. + * typeck.c (comp_target_types): Handle UNKNOWN_TYPE. + (common_type): Likewise. + * error.c (args_as_string): Recognize null_node. + +Sun Oct 19 09:13:01 1997 Richard Kenner + + * typeck.c (rationalize_conditional_expr): Handle {MIN,MAX}_EXPR. + (unary_complex_lvalue): Call it for {MIN,MAX}_EXPR. + + * decl.c (init_decl_processing): Call using_eh_for_cleanups. + + * Make-lang.in (g++): Include prefix.o. + +Thu Oct 16 15:31:09 1997 Judy Goldberg + + * pt.c (determine_explicit_specialization): Initialize "dummy" + to keep Purify quiet. + +Thu Oct 16 00:14:48 1997 Jason Merrill + + * method.c (build_overload_value): Handle TEMPLATE_CONST_PARMs here. + (build_overload_int): Not here. + +Wed Oct 15 00:35:28 1997 Mike Stump + + * class.c (build_type_pathname): Remove. + (prepare_fresh_vtable): Fix problem with complex MI vtable names. + +1997-10-14 Brendan Kehoe + + * parse.y (unary_expr): Give a pedwarn if someone tries to use the + &&label GNU extension. + +Tue Oct 14 12:01:00 1997 Mark Mitchell + + * decl.c (pushtag): Unset DECL_ASSEMBLER_NAME before setting it, + so as to avoid incorrect manglings. + * method.c (build_decl_overload_real): Don't mangle return types + for constructors. + +Tue Oct 14 11:46:14 1997 Jason Merrill + + * cp-tree.h (scratchalloc, build_scratch_list, make_scratch_vec, + scratch_tree_cons): Define as macros for now. + * call.c, class.c, cvt.c, decl.c, decl2.c, except.c, expr.c, init.c, + lex.c, method.c, parse.y, pt.c, rtti.c, search.c, tree.c, typeck.c, + typeck2.c: Use them and the expression_obstack variants. + +Mon Oct 13 17:41:26 1997 Benjamin Kosnik + + * decl.c (store_return_init): Allow classes with explicit ctors to + be used with the named return values extension. + +Fri Oct 10 12:21:11 1997 Jason Merrill + + * pt.c (instantiate_decl): Fix previous change. + +Thu Oct 9 12:08:21 1997 Jason Merrill + + * pt.c (tsubst): Fix thinko. + (instantiate_decl): Really use the original template. + + * call.c (build_new_method_call): Use simple constructor_name for + error messages. + +Wed Oct 8 22:44:42 1997 Jeffrey A Law + + * method.c (build_underscore_int): Don't use ANSI specific + features. + +Wed Oct 8 00:18:22 1997 Jason Merrill + + * decl2.c (finish_prevtable_vardecl): Check DECL_REALLY_EXTERN + for our key method; it might have been inlined by -O3. + +Tue Oct 7 23:00:12 1997 Mark Mitchell + + * decl.c (make_typename_type): Do not try to call lookup_field for + non-aggregate types. + +Tue Oct 7 22:52:10 1997 Jason Merrill + + * typeck.c (build_reinterpret_cast): Tweak. + +Tue Oct 7 22:45:31 1997 Alexandre Oliva + + * typeck.c (build_reinterpret_cast): Converting a void pointer + to function pointer with a reinterpret_cast produces a warning + if -pedantic is issued. + +Tue Oct 7 22:43:43 1997 Bruno Haible + + * typeck.c (c_expand_return): Don't warn about returning a + reference-type variable as a reference. + +Tue Oct 7 21:11:22 1997 Jason Merrill + + * method.c (build_static_name): Fix typo. + +1997-10-07 Brendan Kehoe + + * decl.c (duplicate_decls): Make sure DECL_LANG_SPECIFIC is set on + OLDDECL before we try to do DECL_USE_TEMPLATE. + +Tue Oct 7 00:48:36 1997 Jason Merrill + + * decl.c (duplicate_decls): Don't warn about template instances. + + * typeck.c (mark_addressable): Lose ancient code that unsets + DECL_EXTERNAL. + + * pt.c (do_decl_instantiation): Lose support for instantiating + non-templates. + + * call.c (build_new_function_call): Fix handling of null explicit + template args. + (build_new_method_call): Likewise. + +Mon Oct 6 23:44:34 1997 Mark Mitchell + + * method.c (build_underscore_int): Fix typo. + +1997-10-06 Brendan Kehoe + + * tree.c (print_lang_statistics): #if 0 call to + print_inline_obstack_statistics until its definition is checked in. + +Mon Oct 6 09:27:29 1997 Jason Merrill + + * decl2.c (finish_file): Move dump_tree_statistics to end. + + * pt.c (instantiate_decl): Look for the original template. + (tsubst): Set DECL_IMPLICIT_INSTANTIATION on partial instantiations + of member templates. + +Wed Oct 1 08:41:38 1997 Jason Merrill + + * Makefile.in (g++FAQ.*): New rules. + (CONFLICTS): Update. + * g++FAQ.texi: Moved from libg++. + + * parse.y (PFUNCNAME): Only specify the type once. + +1997-10-01 Brendan Kehoe + + * lex.c (real_yylex): Clean up the code to fully behave the way + the c-lex.c parser does for complex and real numbers. + +Tue Sep 30 08:51:36 1997 Jason Merrill + + * method.c (build_decl_overload_real): Reformat. + +Tue Sep 30 00:18:26 1997 Jason Merrill + + * method.c (synthesize_method): If at_eof, determine our linkage. + +1997-09-29 Paul Eggert + + * lex.c (real_yylex): Treat `$' just like `_', except issue a + diagnostic if !dollars_in_ident or if pedantic. + + * lang-specs.h (@c++): -ansi no longer implies -$. + + * decl2.c (lang_decode_option): + -traditional and -ansi now do not mess with + dollars_in_ident. + +Mon Sep 29 19:57:51 1997 H.J. Lu + + * Makefile.in (parse.o, decl.o): Also depend on + $(srcdir)/../except.h $(srcdir)/../output.h. + (decl2.o): Also depend on $(srcdir)/../expr.h ../insn-codes.h + $(srcdir)/../except.h $(srcdir)/../output.h. + (typeck.o, init.o): Also depend on $(srcdir)/../expr.h + ../insn-codes.h. + + * call.c, cp-tree.h, decl.c, tree.c: Finish prototyping. + + * expr.c (cplus_expand_expr): Make it static. + + * decl2.c, init.c, typeck.c: Include "expr.h". + (expand_expr): Use proper values when calling the function. + +Mon Sep 29 11:05:54 1997 Alexandre Oliva + + * lang-options.h: New -Wold-style-cast flag. + * cp-tree.h (warn_old_style_cast): New variable. + * decl2.c (warn_old_style_cast): Likewise. + (lang_decode_option): Support -Wold-style-cast. + (reparse_absdcl_as_casts): Produce old-style-cast warning. + +Mon Sep 29 09:20:53 1997 Benjamin Kosnik + + * decl.c (cp_finish_decl): Allow expand_aggr_init to set + TREE_USED, reset value based on already_used. + + * init.c (expand_member_init): Revert change. + +Mon Sep 29 08:57:53 1997 Jason Merrill + + * cp-tree.h, decl.c, decl2.c, pt.c: + Lose DECL_C_STATIC and DECL_PUBLIC. Don't pretend statics are public. + + * decl2.c (lang_decode_option): Add missing ;. + +Sat Sep 27 16:22:48 1997 Jason Merrill + + * friend.c (do_friend): Disable injection for all template-derived + decls. + * decl2.c (lang_decode_option): Handle -fguiding-decls. + * parse.y (notype_template_declarator): New nonterminal. + (direct_notype_declarator): Use it. + (complex_direct_notype_declarator): Likewise. + (object_template_id): Accept any kind of identifier after TEMPLATE. + (notype_qualified_id): Don't add template declarators here. + +Sat Sep 27 16:21:58 1997 Mark Mitchell + + * call.c (add_template_candidate): Add explicit_targs parameter. + (build_scoped_method_call): Use it. + (build_overload_call_real): Likewise. + (build_user_type_conversion_1): Likewise. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + (build_new_function_call): Handle TEMPLATE_ID_EXPR. + (build_new_method_call): Likewise. + + * class.c (finish_struct_methods): Add specialization pass to + determine which methods were specializing which other methods. + (instantiate_type): Handle TEMPLATE_ID_EXPR. + + * cp-tree.def (TEMPLATE_ID_EXPR): New tree code. + + * cp-tree.h (name_mangling_version): New variable. + (flag_guiding_decls): Likewise. + (build_template_decl_overload): New function. + (begin_specialization): Likewise. + (reset_specialization): Likewise. + (end_specialization): Likewise. + (determine_explicit_specialization): Likewise. + (check_explicit_specialization): Likewise. + (lookup_template_function): Likewise. + (fn_type_unification): Add explicit_targs parameter. + (type_unification): Likewise. + + * decl.c (duplicate_decls): Add smarts for explicit + specializations. + (grokdeclarator): Handle TEMPLATE_ID_EXPR, and function + specializations. + (grokfndecl): Call check_explicit_specialization. + + * decl2.c (lang_decode_option): Handle -fname-mangling-version. + (build_expr_from_tree): Handle TEMPLATE_ID_EXPR. + (check_classfn): Handle specializations. + + * error.c (dump_function_name): Print specialization arguments. + + * friend.c (do_friend): Don't call pushdecl for template + instantiations. + + * init.c (build_member_call): Handle TEMPLATE_ID_EXPR. + + * lang-options.h: Add -fname-mangling-version, -fguiding-decls, + and -fno-guiding-decls. + + * lex.c (identifier_type): Return PFUNCNAME for template function + names. + + * method.c (build_decl_overload_real): New function. + (build_template_parm_names): New function. + (build_overload_identifier): Use it. + (build_underscore_int): New function. + (build_overload_int): Use it. Add levels for template + parameters. + (build_overload_name): Likewise. Also, handle TYPENAME_TYPEs. + (build_overload_nested_names): Handle template type parameters. + (build_template_decl_overload): New function. + + * parse.y (YYSTYPE): New ntype member. + (nested_name_specifier): Use it. + (nested_name_specifier_1): Likewise. + (PFUNCNAME): New token. + (template_id, object_template_id): New non-terminals. + (template_parm_list): Note specializations. + (template_def): Likewise. + (structsp): Likewise. + (fn.def2): Handle member template specializations. + (component_decl_1): Likewise. + (direct_notype_declarator): Handle template-ids. + (component_decl_1): Likewise. + (direct_notype_declarator): Handle template-ids. + (primary): Handle TEMPLATE_ID_EXPR, and template-ids. + + * pt.c (processing_specializations): New variable. + (template_header_count): Likewise. + (type_unification_real): New function. + (processing_explicit_specialization): Likewise. + (note_template_header): Likewise. + (is_member_template): Handle specializations. + (end_template_decl): Call reset_specialization. + (push_template_decl): Handle member template specializations. + (tsubst): Likewise. + (tsubst_copy): Handle TEMPLATE_ID_EXPR. + (instantiate_template): Handle specializations. + (instantiate_decl): Likewise. + (fn_type_unification): Handle explicit_targs. + (type_unification): Likewise. Allow incomplete unification + without an error message, if allow_incomplete. + (get_bindings): Use new calling sequence for fn_type_unification. + + * spew.c (yylex): Handle PFUNCNAME. + + * tree.c (is_overloaded_fn): Handle TEMPLATE_ID_EXPR. + (really_overloaded_fn): Likewise. + (get_first_fn): Handle function templates. + + * typeck.c (build_x_function_call): Use really_overloaded_fn. + Handle TEMPLATE_ID_EXPR. + (build_x_unary_op): Likewise. + (build_unary_op): Likewise. + (mark_addressable): Templates whose address is taken are marked + as used. + +1997-09-25 Andreas Schwab + + * decl.c (init_decl_processing): Declare __builtin_constant_p as + accepting any kind of type, not only int. + +Fri Sep 26 00:22:56 1997 Jason Merrill + + * search.c (get_matching_virtual): Notice virtual bases when sorrying + about covariant returns. + + * parse.y (member_init): Also imply typename here. Remove ancient + extension for initializing base members. + +Thu Sep 25 11:11:13 1997 Jason Merrill + + Handle multi-level typenames and implicit typename in base list. + * parse.y (typename_sub{,[0-2]}): New rules. + (structsp, rule TYPENAME_KEYWORD): Use typename_sub. + (nonnested_type): New rule. + (complete_type_name): Use it. + (base_class.1): Use typename_sub and nonnested_type. + (nested_name_specifier): Don't elide std:: here. + * decl.c (make_typename_type): Handle getting a type for NAME. + (lookup_name_real): Turn std:: into :: here. + + Rvalue conversions were removed in London. + * call.c (is_subseq): Don't consider lvalue transformations. + (build_conv): LVALUE_CONV and RVALUE_CONV get IDENTITY_RANK. + (joust): Re-enable ?: kludge. + +1997-09-22 Brendan Kehoe + + * decl.c (start_function): Up warning of no return type to be a + pedwarn. + +Mon Sep 22 14:15:34 1997 Benjamin Kosnik + + * init.c (expand_member_init): Don't set TREE_USED. + * decl.c (cp_finish_decl): Mark decls used if type has TREE_USED + set,don't clear TREE_USED wholesale. + +Sat Sep 20 15:31:00 1997 Jason Merrill + + * call.c (build_over_call): Do require_complete_type before + build_cplus_new. + +Thu Sep 18 16:47:52 1997 Jason Merrill + + * search.c (lookup_field): Call complete_type in all cases. + + * decl.c (finish_function): Just warn about flowing off the end. + +Wed Sep 17 10:31:25 1997 Jason Merrill + + * decl.c (grokparms): Don't bash a permanent list node if we're + in a function. + +1997-09-17 Brendan Kehoe + + * Makefile.in (CONFLICTS): Fix s/r conflict count to 18. + +Tue Sep 16 14:06:56 1997 Jason Merrill + + * call.c (build_new_op): Give better error for syntactically + correct, but semantically invalid, use of undeclared template. + + * call.c (compare_qual): Handle pmfs. + + * decl.c (store_parm_decls): last_parm_cleanup_insn is the insn + after the exception spec. + +Mon Sep 15 11:52:13 1997 Jason Merrill + + * call.c (null_ptr_cst_p): Integer type, not integral type. + + * call.c (joust): Disable warnings until they can be moved to the + right place. + +Fri Sep 12 16:11:13 1997 Per Bothner + + * Makefile.in, config-lang.in: Convert to autoconf. + +Thu Sep 11 17:14:55 1997 Jason Merrill + + * decl.c (lookup_name_real): Add implicit 'typename' to types from + base classes. + + * pt.c (most_specialized_class): Fix typo. + (tsubst): Move constant folding to TREE_VEC case. + +Thu Sep 11 10:08:45 1997 Mark Mitchell + + * pt.c (do_poplevel): Don't warn about unused local variables + while processing_template_decl since we don't always know whether + or not they will need constructing/destructing. + + * pt.c (uses_template_parms): Check the values of an enumeration + type to make sure they don't depend on template parms. + + * decl.c (make_typename_type): Don't lookup the field if the + context uses template parms, even if we're not + processing_template_decl at the moment. + + * pt.c (coerce_template_parms): Avoid looking at the + TYPE_LANG_DECL portion of a typename type, since there won't be + one. + (tsubst): Do constant folding as necessary to make sure that + arguments passed to lookup_template_class really are constants. + +Wed Sep 10 16:39:26 1997 Jim Wilson + + * Make-lang.in (LN, LN_S): New macros, use where appropriate. + +Wed Sep 10 11:21:55 1997 Jason Merrill + + * except.c (expand_builtin_throw): #ifndef DWARF2_UNWIND_INFO. + * decl2.c (finish_file): Only register exception tables if we + need to. + + * decl.c (init_decl_processing): Add __builtin_[fs]p. + +Tue Sep 9 19:49:38 1997 Jason Merrill + + * pt.c (unify): Just return 0 for a TYPENAME_TYPE. + +Tue Sep 9 17:57:25 1997 Mark Mitchell + + * error.c (dump_decl): Avoid crashing when presented with a + uninitialized constant, as can occur with a template parameter. + (dump_expr): Make sure that there are enough levels of + current_template_parms before we start diving through them. + +1997-09-09 Brendan Kehoe + + * typeck.c (build_indirect_ref): Heed FLAG_VOLATILE similar to + c-typeck.c. + +Tue Sep 9 09:36:39 1997 Benjamin Kosnik + + * except.c (expand_throw): Call build_delete for all + exception types, not just objects with destructors. + +Mon Sep 8 02:33:20 1997 Jody Goldberg + + * decl.c (current_local_enum): Remove static. + * pt.c (tsubst_enum): Save and restore value of current_local_enum + in case template is expanded in enum decl. + (instantiate_class_template): Use new tsubst_enum signature. + (tsubst_expr): Likewise. + +Mon Sep 8 01:21:43 1997 Mark Mitchell + + * pt.c (begin_member_template_processing): Take a function as + argument, not a set of template arguments. Use the template + parameters, rather than the arguments. Handle non-type parameters + correctly. Push a binding level for the parameters so that multiple + member templates using the same parameter names can be declared. + (end_member_template_processing): Pop the binding level. + (push_template_decl): Mark member templates as static when + appropriate. + + * lex.c (do_pending_inlines): Pass the function, not its template + arguments, to begin_member_template_processing. + (process_next_inline): Likewise. + (do_pending_defargs): Likewise. + + * error.c (dump_expr): Obtain the correct declaration for a + TEMPLATE_CONST_PARM. + + * call.c (add_template_conv_candidate): New function. + (build_object_call): Handle member templates, as done in the other + build_ functions. + +Sat Sep 6 10:20:27 1997 Mark Mitchell + + * decl.c (replace_defag): Undo previous change. + * lex.c (do_pending_defargs): Deal with member templates. + + * pt.c (is_member_template): Avoid crashing when passed a + non-function argument. + +Fri Sep 5 17:27:38 1997 Jason Merrill + + * class.c (grow_method): Remove check for redeclaration. + +Fri Sep 5 01:37:17 1997 Mark Mitchell + + * cp-tree.h (INNERMOST_TEMPLATE_PARMS): New macro. + (DECL_INNERMOST_TEMPLATE_PARMS): Likewise. + (PRIMARY_TEMPLATE_P): Use it. + * call.c (build_overload_call_real): Use it. + * class.c (instantiate_type): Likewise. + * decl.c (decls_match): Likewise. + * method.c (build_overload_identifier): Likewise. + * pt.c (push_template_decl): Likewise. + (classtype_mangled_name): Likewise. + (lookup_template_class): Likewise. + + * cp-tree.h (DECL_NTPARMS): Change name from DECL_NT_PARMS to + DECL_NTPARMS to conform to usage elsewhere. + * call.c (add_template_candidate): Likewise. + * class.c (instantiate_type): Likewise. + * pt.c (instantiate_template): Likewise. + (get_bindings): Likewise. + + * class.c (grow_method): Use DECL_FUNCTION_TEMPLATE_P instead of + is_member_template. + + * pt.c (unify): Undo changes to allow multiple levels of template + parameters. + (type_unification): Likewise. + (fn_type_unification): Likewise. + (get_class_bindings): Likewise. + * cp-tree.h (Likewise). + + * decl.c (replace_defarg): Check that the type of the default + parameter does not invlove a template type before complaining + about the initialization. + + * error.c (dump_expr): Deal with template constant parameters in + member templates correctly. + + * pt.c (is_member_template): Deal with class specializations + correctly. + (tsubst): Handle "partial instantiation" of member templates + correctly. + +Wed Sep 3 12:30:24 1997 Mark Mitchell + + * pt.c (type_unification): Change calling sequence to allow for + multiple levels of template parameters. + (tsubst_expr): Likewise. + (tsubst): Likewise. + (tsubst_copy): Likewise. + (instantiate_template): Likewise. + (unify): Likewise. + * call.c (build_overload_call_real): Use it. + (add_builtin_candidate): Use it. + (build_new_method_call): Use it. + * class.c (instantiate_type): Use it. + * decl.c (grokdeclarator): Use it. + * decl2.c (finish_file): Use it. + * method.c (build_overload_identifier): Use it. + + * call.c (add_template_candidate): Add additional parameter for + the function return type. Call fn_type_unification istead of + type_unification. + (build_user_type_conversion_1): Handle member templates. + (build_new_function_call): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + + * class.c (grow_method): Don't give an error message indicating + that two member templates with the same name are ambiguous. + (finish_struct): Treat member template functions just like member + functions. + + * cp-tree.h (check_member_template): Add declaration. + (begin_member_template_processing): Likewise. + (end_member_template_processing): Likewise. + (fn_type_unification): Likewise. + (is_member_template): Likewise. + (tsubst): Change prototype. + (tsubst_expr): Likewise. + (tsubst_copy): Likewise. + (instantiate_template): Likewise. + (get_bindings): Likewise. + + * decl.c (decls_match): Handle multiple levels of template + parameters. + (pushdecl): Handle template type params just like other type + declarations. + (push_class_level_binding): Return immediately if the + class_binding_level is NULL. + (grokfndecl): If check_classfn() returns a member_template, use + the result of the template, not the template itself. + + * decl2.c (check_member_template): New function. Check to see + that the entity declared to be a member template can be one. + (check_classfn): Allow redeclaration of member template functions + with different types; the new functions can be specializations or + explicit instantiations. + + * error.c (dump_decl): Handle multiple levels of template + parameters. + (dump_function_decl): Update to handle function templates. + + * lex.c (do_pending_inlines): Set up template parameter context + for member templates. + (process_next_inline): Likewise. + + * method.c (build_overload_identifier): Adjust for multiple levels + of template parameters. + + * parse.y (fn.def2): Add member templates. + (component_decl_1): Likewise. + + * pt.c (begin_member_template_processing): New function. + (end_member_template_processing): Likewise. + (is_member_template): Likewise. + (fn_type_unification): Likewise. + (current_template_parms): Return a vector of all the template + parms, not just the innermost level of parms. + (push_template_decl): Deal with the possibility of member + templates. + (lookup_template_class): Likewise. + (uses_template_parms): Likewise. + (tsubst): Modify processing to TEMPLATE_TYPE_PARM and + TEMPLATE_CONST_PARM to deal with multiple levels of template + arguments. Add processing of TEMPLATE_DECL to produce new + TEMPLATE_DECLs from old ones. + (do_decl_instantiation): Handle member templates. + + * search.c (lookup_fnfields_1): Handle member template conversion + operators. + + * tree.c (cp_tree_equal): Check the levels, as well as the + indices, of TEMPLATE_CONST_PARMs. + + * typeck.c (comptypes): Check the levels, as well as the indices, + fo TEMPLATE_TYPE_PARMs. + (build_x_function_call): Treat member templates like member + functions. + +Wed Sep 3 11:09:25 1997 Jason Merrill + + * typeck.c (c_expand_return): Always convert_for_initialization + before checking for returning a pointer to local. + + * pt.c (type_unification): If strict and the function parm doesn't + use template parms, just compare types. + +Wed Sep 3 10:35:49 1997 Klaus Espenlaub + + * method.c (build_overloaded_value): Replace direct call + to the floating point emulator with REAL_VALUE_TO_DECIMAL macro. + +Wed Sep 3 00:02:53 1997 Jason Merrill + + * typeck.c (convert_arguments): Don't arbitrarily choose the first + of a set of overloaded functions. + +Tue Sep 2 12:09:13 1997 Jason Merrill + + * lex.c (real_yylex): Don't elide __FUNCTION__. + + * method.c (build_overload_value): Add in_template parm. + (build_overload_int): Likewise. + (build_overload_identifier): Pass it. + + * decl.c (duplicate_decls): Don't bash a previous template + definition with a redeclaration. + + * pt.c (unify): float doesn't match double. + + * pt.c (do_type_instantiation): Handle getting a _TYPE or a + TYPE_DECL. Handle getting non-template types. + * parse.y (explicit_instantiation): Use typespec instead of + aggr template_type. + +Tue Sep 2 10:27:08 1997 Richard Henderson + + * typeck.c (build_ptrmemfunc1): Clean up ptr->int cast warnings. + +Mon Sep 1 13:19:04 1997 Eugene Mamchits + + * call.c (add_builtin_candidate): Add missing TREE_TYPE. + (compare_ics): Likewise. + +Mon Sep 1 13:19:04 1997 Jason Merrill + + * call.c (joust): Warn about choosing one conversion op over + another because of 'this' argument when the other return type is + better. + (source_type): New fn. + + * call.c (build_new_op): Strip leading REF_BIND from first operand + to builtin operator. + + * decl2.c (mark_vtable_entries): Mark abort_fndecl as used when we + use its RTL. + +Thu Aug 28 09:45:23 1997 Jason Merrill + + * call.c (null_ptr_cst_p): Remove support for (void*)0. + +Wed Aug 27 02:03:34 1997 Jeffrey A Law + + * typeck.c (expand_target_expr): Make definition match declaration. + + * class.c (get_basefndecls): Make definition match declaration. + +Mon Aug 25 14:30:02 1997 Jason Merrill + + * input.c (sub_getch): Eventually give up and release the input file. + + * decl.c (cp_finish_decl): If #p i/i, put inline statics in the + right place. + + * call.c (joust): Tweak message. + +Sat Aug 23 18:02:59 1997 Mark Mitchell + + * error.c (type_as_string): Put const/volatile on template type + parameters where appropriate. + +Sat Aug 23 17:47:22 1997 Jeffrey A Law + + * call.c (strictly_better): Make arguments unsigned ints. + +Thu Aug 21 18:48:44 1997 Jason Merrill + + * lex.c (real_yylex): Refer to __complex instead of complex. + +Thu Aug 21 22:25:46 1997 J"orn Rennecke + + * lex.c (real_yylex): Don't use getc directly. + +Wed Aug 20 17:25:08 1997 Jason Merrill + + * call.c (is_subseq): Don't try to be clever. + +Wed Aug 20 03:13:36 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * parse.y, pt.c: Include "except.h". + * call.c, class.c, class.h, cp-tree.h, cvt.c, decl.c, decl2.c, + error.c, except.c, expr.c, friend.c, g++spec.c, init.c, input.c, + lex.c, lex.h, method.c, parse.y, pt.c, repo.c, rtti.c, search.c, + sig.c, spew.c, tree.c, typeck.c, typeck2.c, xref.c: Finish + prototyping. + +Wed Aug 20 01:34:40 1997 Jason Merrill + + * decl2.c (mark_vtable_entries): Instead of replacing pure + virtuals with a reference to __pure_virtual, copy the decl and + change the RTL. + +Tue Aug 19 02:26:07 1997 Jason Merrill + + * pt.c (lookup_nested_type_by_name): Handle typedef wierdness. + + * typeck2.c (my_friendly_abort): Report bugs to egcs-bugs@cygnus.com. + + * pt.c (instantiate_class_template): Call repo_template_used + before finish_prevtable_vardecl. + + * call.c (is_subseq): New fn. + (compare_ics): Use it. + + * repo.c (finish_repo): Don't crash on no args. + + * parse.y (named_complex_class_head_sans_basetype): Handle + explicit global scope. + * decl2.c (handle_class_head): New fn. + + * pt.c (unify): Add CONST_DECL case. + +Thu Aug 14 10:05:13 1997 Brendan Kehoe + + * rtti.c (permanent_obstack): Fix decl to not be a pointer. + + * cp-tree.h (report_type_mismatch): Add prototype. + * call.c (build_overload_call_real): Remove erroneous fourth + argument to report_type_mismatch. + (build_user_type_conversion_1): Remove erroneous second arg to + tourney. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + +Wed Aug 13 19:19:25 1997 Jason Merrill + + * error.c (dump_decl): Don't bother processing a function with no + DECL_LANG_SPECIFIC. + + * method.c (emit_thunk): Call init_function_start in the macro case. + +Wed Aug 13 10:46:19 1997 H.J. Lu (hjl@gnu.ai.mit.edu) + + * decl2.c (DEFAULT_VTABLE_THUNKS): Define to be 0 if not + defined and used to set flag_vtable_thunks. + +Tue Aug 12 20:13:57 1997 Jason Merrill + + * parse.y: Don't clear the inlines from their obstack until they've + all been processed. + + * decl.c (duplicate_decls): Don't complain about exception + specification mismatch if flag_exceptions is off. + +Mon Aug 11 15:01:56 1997 Marc Lehmann + + * Make-lang.in (c++.distclean): Remove g++.c on make distclean. + +Sun Aug 10 12:06:09 1997 Paul Eggert + + * cp-tree.h: Replace STDIO_PROTO with PROTO in include files. + * cvt.c, error.c, except.c, expr.c, friend.c, init.c, rtti.c: + Include before include files that formerly used STDIO_PROTO. + + * decl.c, g++spec.c, lex.c, method.c, repo.c: + Include "config.h" first, as per autoconf manual. + +Fri Aug 8 11:47:48 1997 Jason Merrill + + * decl.c (duplicate_decls): Tweak wording. + * lex.c (do_pending_defargs): Don't die if we see a default arg + that isn't a DEFAULT_ARG. + * error.c (dump_expr): Handle DEFAULT_ARG. + + * decl2.c (lang_decode_option): Handle -fhandle-exceptions. + * lang-options.h: Add -fhandle-exceptions. + + * class.c (build_vtable): Vtables are artificial. + (prepare_fresh_vtable): Likewise. + +Wed Aug 6 11:02:36 1997 Jason Merrill + + * cvt.c (ocp_convert): After converting to the target type, set + LOOKUP_NO_CONVERSION. + + * call.c (joust): Warn about potentially confusing promotion rules + with -Wsign-promo. + * cp-tree.h, lang-options.h, decl2.c: Support -Wsign-promo. + +Tue Aug 5 15:15:07 1997 Michael Meissner + + * exception.cc: Declare __terminate_func with noreturn attribute. + +Fri Aug 1 03:18:15 1997 Jason Merrill + + * parse.y: Break out eat_saved_input, handle errors. + (function_try_block): Use compstmt instead of compstmt_or_error. + +Thu Jul 31 17:14:04 1997 Jason Merrill + + * tree.c (build_cplus_new): Don't set TREE_ADDRESSABLE. + +Fri Jul 4 01:45:16 1997 Andreas Schwab + + * Make-lang.in (cplib2.txt, cplib2.ready): Instead of checking for + existence of cc1plus check whether $(LANGUAGES) contains C++. + +Wed Jul 30 13:04:21 1997 Andreas Schwab + + * method.c (do_build_copy_constructor): When copying an anonymous + union member loop around to handle nested anonymous unions. Use + the offset of the member relative to the outer structure, not the + union. + +Tue Jul 29 21:17:29 1997 Jason Merrill + + * call.c (resolve_args): New fn. + (build_new_function_call): Use it. + (build_object_call): Likewise. + (build_new_method_call): Likewise. + +Mon Jul 28 16:02:36 1997 Jason Merrill + + * call.c (build_over_call): tsubst all default parms from templates. + +Wed Jul 23 13:36:25 1997 Jason Merrill + + * decl.c (struct cp_function): Add static_labelno. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + +Tue Jul 22 14:43:29 1997 Jason Merrill + + * typeck.c (build_component_ref_1): Convert from reference. + +Tue Jul 22 11:06:23 1997 Brendan Kehoe + + * parse.y (current_declspecs, prefix_attributes): Initialize to + NULL_TREE. + + * parse.y (initdcl0): Make sure CURRENT_DECLSPECS is non-nil + before we try to force it to be a TREE_LIST. + (decl): Make sure $1.t is non-nil. + +Sun Jul 20 11:53:07 1997 Jason Merrill + + * pt.c (uses_template_parms): Handle template first-parse codes. + + * decl.c (cp_finish_decl): Only warn about user-defined statics. + +Fri Jul 18 17:56:08 1997 Jason Merrill + + * pt.c (unify): Handle BOOLEAN_TYPE. + + * cp-tree.h: Lose PARM_DEFAULT_FROM_TEMPLATE. + * pt.c (tsubst): Don't set it. + * call.c (build_over_call): Use uses_template_parms. + +Thu Jul 17 18:06:30 1997 Jason Merrill + + * method.c (build_overload_nested_name): Use static_labelno + instead of var_labelno. + (build_qualified_name): New fn. + (build_overload_name): Split out from here. + (build_static_name): Use build_qualified_name. + * decl.c (cp_finish_decl): Statics in extern inline functions + have comdat linkage. + (start_function): Initialize static_labelno. + +Thu Jul 17 11:20:17 1997 Benjamin Kosnik + + * class.c (finish_struct_methods): Add check of warn_ctor_dtor_privacy + before "all member functions in class [] are private". + +Wed Jul 16 23:47:08 1997 Jason Merrill + + * lex.c (do_scoped_id): convert_from_reference. + * init.c (build_offset_ref): Likewise. + +Wed Jul 16 12:34:29 1997 Benjamin Kosnik + + * error.c (dump_expr): Check TREE_OPERAND before dump_expr_list. + +Mon Jul 14 03:23:46 1997 Jason Merrill + + * typeck.c (get_member_function_from_ptrfunc): Promote index + before saving it. + +Sun Jul 13 00:11:52 1997 Jason Merrill + + * tree.c (layout_basetypes): Move non-virtual destructor warning. + * decl.c (xref_basetypes): Remove non-virtual destructor warning. + +Sat Jul 12 12:47:12 1997 Jason Merrill + + * decl.c (grokdeclarator): Call add_defarg_fn for the function + type, too. + * lex.c (add_defarg_fn): Adjust. + (do_pending_defargs): Adjust. Don't skip the first parm. + +Fri Jul 11 01:39:50 1997 Jason Merrill + + * decl.c (build_enumerator): Global enumerators are also readonly. + + * rtti.c (build_dynamic_cast_1): Renamed from build_dynamic_cast. + (build_dynamic_cast): Call it and convert_from_reference. + + * lex.c (add_defarg_fn): New fn. + (snarf_defarg): Don't add to defarg_types. + (do_pending_defargs): Lose defarg_types. All fns we process now + have defargs. + * decl.c (grokfndecl): Call add_defarg_fn. + + * Makefile.in (CONFLICTS): Expect 18 s/r conflicts. + * cp-tree.def: Add DEFAULT_ARG. + * spew.c (yylex): Call snarf_defarg as appropriate. + * parse.y: New tokens DEFARG and DEFARG_MARKER. + (defarg_again, pending_defargs, defarg, defarg1): New rules. + (structsp): Use pending_defargs. + (parms, full_parm): Use defarg. + * lex.c (init_lex): Initialize inline_text_firstobj. + (do_pending_inlines): Never pass the obstack to feed_input. + (process_next_inline): Call end_input instead of restore_pending_input. + (clear_inline_text_obstack, reinit_parse_for_expr, do_pending_defargs, + finish_defarg, feed_defarg, snarf_defarg, maybe_snarf_defarg): New fns. + * input.c (end_input): New fn. + (sub_getch): At the end of some fed input, just keep returning EOF + until someone calls end_input. + Remove 'obstack' field from struct input_source. + * decl.c (grokparms): Handle DEFAULT_ARG. + (replace_defarg): New fn. + * cp-tree.h (DEFARG_LENGTH, DEFARG_POINTER): New macros. + +Wed Jul 9 13:44:12 1997 Jason Merrill + + * call.c (implicit_conversion): If nothing else works, try binding + an rvalue to a reference. + +Wed Jul 9 13:04:38 1997 Geoffrey Noer + + * decl.c (init_decl_processing): Fix Jun 30 patch -- move + ifndef for Cygwin32 to include SIGSEGV. + +Thu Jul 3 01:44:05 1997 Jason Merrill + + * class.c (finish_struct_1): Only complain about pointers without + copy stuff if there are any constructors. + + * rtti.c (build_dynamic_cast): Call complete_type on the types. + + * decl.c (grokfndecl): If the function we chose doesn't actually + match, die. + + * decl2.c (grokclassfn): Don't specify 'const int' for the + artificial destructor parm. + + * pt.c (type_unification): If we are called recursively, nothing + decays. + +Mon Jun 30 17:53:21 1997 Geoffrey Noer + + * decl.c (init_decl_processing): Stop trying to catch signals + other than SIGABRT since the Cygwin32 library doesn't support + them correctly yet. This fixes a situation in which g++ causes + a hang on SIGSEGVs and other such signals in our Win32-hosted + tools. + +Mon Jun 30 14:50:01 1997 Jason Merrill + + * tree.c (mapcar, case CALL_EXPR): Handle all the parse node data. + +Fri Jun 27 15:18:49 1997 Jason Merrill + + * typeck2.c (store_init_value): Always return the value if our + type needs constructing. + + * method.c (hack_identifier): Convert class statics from + reference, too. + +Thu Jun 26 11:44:46 1997 Jason Merrill + + * Make-lang.in (cplib2.ready): Add $(LANGUAGES) dependency. + +Thu Jun 19 16:49:28 1997 Mike Stump + + * typeck.c (c_expand_return): Make sure we clean up temporaries at + the end of return x; + +Thu Jun 19 12:28:43 1997 Brendan Kehoe + + * lex.c (check_for_missing_semicolon): Also check for CV_QUALIFIER. + +Tue Jun 17 18:35:57 1997 Mike Stump + + * except.c (expand_builtin_throw): Add support + -fno-sjlj-exceptions -fPIC exception handling on the SPARC. + +Mon Jun 16 01:24:37 1997 Jason Merrill + + * repo.c (extract_string): Null-terminate. + + * cp-tree.h (TI_SPEC_INFO): New macro. + (CLASSTYPE_TI_SPEC_INFO): New macro. + * pt.c (push_template_decl): Correctly determine # of template parms + for partial specs. + + * call.c (compare_ics): Really fix 'this' conversions. + + * pt.c (do_decl_instantiation): Don't crash on explicit inst of + non-template fn. + + * pt.c (push_template_decl): Complain about mismatch in # of + template parms between a class template and a member template. + +Sun Jun 15 02:38:20 1997 Jason Merrill + + * method.c (synthesize_method): You can't call + function_cannot_inline_p after finish_function. + * decl.c (finish_function): Turn on flag_inline_functions and turn + off DECL_INLINE before handing a synthesized method to the + backend. + +Thu Jun 12 17:35:28 1997 Jason Merrill + + * method.c (synthesize_method): Remove July 30 change to never set + DECL_INLINE if at_eof. + +Thu Jun 12 15:25:08 1997 Mike Stump + + * xref.c (GNU_xref_member): Ensure that the node has a + decl_lang_specific part before checking DECL_FRIEND_P. + +Thu Jun 12 12:36:05 1997 Jason Merrill + + * pt.c (instantiate_class_template): Diagnose non-class types used + as bases. + +Wed Jun 11 17:33:40 1997 Jason Merrill + + * typeck.c (build_conditional_expr): Use convert_for_initialization + instead of convert_and_check. + +Wed Jun 11 12:31:33 1997 Brendan Kehoe + + * parse.y (typespec): Don't pedwarn for typeof. + +Tue Jun 10 00:22:09 1997 Jason Merrill + + * repo.c (finish_repo): Only check changes if we would write a + repo file. + + * call.c (compare_ics): Fix handling of 'this' conversions. + + * pt.c (do_decl_instantiation): Support static data too. Rename + from do_function_instantiation. + * cp-tree.h: Adjust. + * parse.y: Adjust. + + * repo.c (extract_string): New fn. + (get_base_filename): Use it. + (init_repo): Compare old args with current args. + +Mon Jun 9 14:25:30 1997 Mike Stump + + * Makefile.in, Make-lang.in: Protect C-ls with a comment + character, idea from Paul Eggert . + +Mon Jun 9 01:52:03 1997 Jason Merrill + + * typeck.c (c_expand_return): Be more persistent in looking for + returned temps. + + * cvt.c (build_up_reference): Use NOP_EXPR for switching from + pointer to reference. + + * class.c (build_vbase_path): Don't do anything if PATH has no steps. + +Sun Jun 8 03:07:05 1997 Jason Merrill + + * init.c (build_member_call, build_offset_ref): + Use do_scoped_id instead of do_identifier. + + * cvt.c (convert): Remove bogosity. + +Sat Jun 7 20:50:17 1997 Brendan Kehoe + + * cvt.c (build_up_reference): Do checks of ARGTYPE and + TARGET_TYPE before trying to use get_binfo. + +Fri Jun 6 17:36:39 1997 Jason Merrill + + * cvt.c (build_up_reference): Call get_binfo to get access control. + + * decl2.c (import_export_decl): If we don't support weaks, leave + statics undefined. + +Fri Jun 6 15:55:49 1997 Mike Stump + + * except.c (expand_builtin_throw): Add support for machines that + cannot access globals after throw's epilogue when + -fno-sjlj-exceptions is used. + +Thu Jun 5 16:28:43 1997 Jason Merrill + + * parse.y: 'std::' becomes '::'. + * lex.c (real_yylex): Remove 'namespace' warning. + * init.c (build_member_call): Ignore 'std::'. + (build_offset_ref): Likewise. + * decl2.c (do_using_directive): Ignore 'using namespace std;'. + (do_toplevel_using_decl): Ignore 'using std::whatever'. + * decl.c (push_namespace): Just sorry. + (pop_namespace): Nop. + (init_decl_processing): Declare std namespace. + +Tue Jun 3 18:08:23 1997 Jason Merrill + + * search.c (push_class_decls): A name which ambiguously refers to + several instantiations of the same template just refers to the + template. + +Tue Jun 3 12:30:40 1997 Benjamin Kosnik + + * decl.c (build_enumerator): Fix problem with unsigned long + enumerated values being smashed to ints, causing overflow + when computing next enumerated value (for enum values around + MAX_VAL). + +Mon Jun 2 17:40:56 1997 Jason Merrill + + * typeck.c (build_component_ref): Only call mark_used on a decl. + +Thu May 29 15:54:17 1997 Brendan Kehoe + + * typeck.c (build_c_cast): Make the check for a ptr to function + more specific before possible default_conversion call. + +Thu May 29 13:02:06 1997 Mike Stump + + * except.c (expand_exception_blocks): Simplify and fix and make + sure we don't end a region in a sequence, as expand_end_bindings + doesn't like it. + +Wed May 28 17:08:03 1997 Mike Stump + + * except.c (init_exception_processing): Mark terminate as not + returning so that the optimizer can optimize better. + +Tue May 27 19:49:19 1997 Mike Stump + + * cvt.c (convert): Don't do any extra work, if we can avoid it + easily. + +Tue May 27 18:21:47 1997 Mike Stump + + * *.[chy]: Change cp_convert to ocp_convert, change convert to + cp_convert. convert is now reserved for the backend, and doesn't + have the semantics a frontend person should ever want. + +Fri May 23 10:58:31 1997 Jason Merrill + + * lang-specs.h: Define __EXCEPTIONS if exceptions are enabled. + Lose -traditional support. + +Thu May 22 15:41:28 1997 Jason Merrill + + * rtti.c (get_tinfo_var): Use TYPE_PRECISION (sizetype). + + * parse.y (self_reference): Do it for templates, too. + * class.c (pushclass): Don't overload_template_name; the alias + generated by build_self_reference serves the same purpose. + + * tree.c (list_hash): Make static, take more args. + (list_hash_lookup): Likewise. + (list_hash_add): Make static. + (list_hash_canon): Lose. + (hash_tree_cons): Only build a new node if one isn't already in the + hashtable. + (hash_tree_chain): Use hash_tree_cons. + * cp-tree.h: Adjust. + * decl.c (grokfndecl): Just check IDENTIFIER_GLOBAL_VALUE instead + of calling lookup_name. + +Wed May 21 18:24:19 1997 Jason Merrill + + * pt.c (instantiate_class_template): TYPE_VALUES for an enum + doesn't refer to the CONST_DECLs. + +Tue May 20 21:09:32 1997 Bob Manson + + * rtti.c (get_tinfo_var): Either INT_TYPE_SIZE or 32, whichever + is bigger. + (expand_class_desc): Convert the last argument to a sizetype. + +Tue May 20 13:55:57 1997 Brendan Kehoe + + * gxx.gperf (__complex, __complex__, __imag, __imag__, __real, + __real__): Add reswords. + * hash.h: Regenerate. + * lex.h (rid): Add RID_COMPLEX. + (RID_LAST_MODIFIER): Set to RID_COMPLEX. + * lex.c (init_lex): Add building of RID_COMPLEX. + (real_yylex): General cleanup in line with what c-lex.c also has, + sans the cruft for traditional; add handling of SPEC_IMAG, complex + types, and imaginary numeric constants. + * parse.y (REALPART, IMAGPART): Add tokens. + (unary_expr): Add REALPART and IMAGPART rules. + * cp-tree.h (complex_{integer,float,double,long}_type_node): Declare. + * decl.c (complex_{integer,float,double,long}_type_node): Define + types. + (init_decl_processing): Set up the types. + (grokdeclarator): Add handling of RID_COMPLEX. Set and use + DEFAULTED_INT instead of EXPLICIT_INT when we default to int type. + * call.c (build_new_op): Add REALPART_EXPR and IMAGPART_EXPR cases. + * cvt.c (cp_convert): Handle COMPLEX_TYPE. + * error.c (dump_type_prefix, dump_type, dump_type_suffix): Add + COMPLEX_TYPE case. + * method.c (build_overload_name): Add handling of the different + COMPLEX_TYPEs, prefixing them with `J'. + * pt.c (process_template_parm): Don't let them use a COMPLEX_TYPE + as a template parm. + (uses_template_parms, tsubst, unify): Add COMPLEX_TYPE case. + * tree.c (lvalue_p): Add REALPART_EXPR and IMAGPART_EXPR cases. + (mapcar): Handle COMPLEX_CST. + * typeck.c (build_binary_op_nodefault): Handle COMPLEX_TYPE. + (common_type): Add code for complex types. + (build_unary_op): Add REALPART_EXPR and IMAGPART_EXPR cases. + (convert_for_assignment): Likewise. + (mark_addressable): Add REALPART_EXPR and IMAGPART_EXPR cases. + +Mon May 19 12:26:27 1997 Jason Merrill + + * pt.c (tsubst): Don't pass the MINUS_EXPR for an array domain to + tsubst_expr, as it might try to do overload resolution. + +Sat May 17 10:48:31 1997 Jason Merrill + + * pt.c (instantiate_class_template): Oops. + +Fri May 16 14:23:57 1997 Jason Merrill + + * cp-tree.def: Add TAG_DEFN. + * pt.c (tsubst_enum): New fn. + (instantiate_class_template): Use it. + (tsubst_expr): Support TAG_DEFN. + (tsubst): Support local enums. + (tsubst_copy): Likewise. + * decl.c (finish_enum): Likewise. + (start_enum): If this is a local enum, switch to permanent_obstack. + +Wed May 14 19:08:28 1997 Mike Stump + + * decl.c (store_parm_decls): Set last_parm_cleanup_insn here. + (finish_function): Put the base init code for constructors just + after the parm cleanup insns. + (struct cp_function): Add last_parm_cleanup_insn. + (push_cp_function_context): Likewise. + (pop_cp_function_context): Likewise. + +Tue May 13 15:51:20 1997 Jason Merrill + + * pt.c (tsubst_copy): Handle BIT_NOT_EXPR. + +Wed May 7 11:17:59 1997 Brendan Kehoe + + * method.c (emit_thunk) [ASM_OUTPUT_MI_THUNK]: Build up the RTL + for THUNK_FNDECL before we switch to temporary allocation. + +Mon May 5 14:46:53 1997 Jason Merrill + + * call.c (build_new_op): Handle null arg2 for ?:. + +Thu May 1 18:26:37 1997 Mike Stump + + * except.c (expand_exception_blocks): Ensure that we flow through + the end of the exception region for the exception specification. + Move exception region for the exception specification in, so that + it doesn't protect the parm cleanup. Remove some obsolete code. + * decl.c (store_parm_decls): Likewise. + (finish_function): Likewise. + +Tue Apr 29 15:38:54 1997 Jason Merrill + + * init.c (build_new): Fix nothrow handling. + +Tue Apr 29 14:29:50 1997 Brendan Kehoe + + * init.c (emit_base_init): Don't warn about the initialization + list for an artificial member. + +Fri Apr 25 17:47:59 1997 Brendan Kehoe + + * expr.c (do_case): Handle !START case for the error msg. + +Fri Apr 25 11:55:23 1997 Jason Merrill + + * decl2.c, lang-options.h: New option -Weffc++. + * class.c, decl.c, init.c, typeck.c: Move Effective C++ warnings + to -Weffc++. + + * decl2.c (finish_prevtable_vardecl): Change NO_LINKAGE_HEURISTICS + to MULTIPLE_SYMBOL_SPACES. + +Wed Apr 23 18:06:50 1997 Jason Merrill + + * method.c (emit_thunk, generic case): Set current_function_is_thunk. + + * method.c (emit_thunk, macro case): Set up DECL_RESULT. + + * typeck.c (c_expand_return): Don't complain about returning void + to void in an artificial function. + * method.c (make_thunk): Change settings of READONLY/VOLATILE, + don't set DECL_RESULT, set DECL_ARTIFICIAL. + (emit_thunk, generic code): Also set up DECL_LANG_SPECIFIC. + +Wed Apr 23 14:43:06 1997 Mike Stump + + * init.c (init_decl_processing): Add support for setjmp/longjmp based + exception handling. + * except.c (init_exception_processing): Likewise. + (expand_end_catch_block): Likewise. + (expand_exception_blocks): Likewise. + (expand_throw): Likewise. + * exception.cc (__default_terminate): Likewise. + + * init.c (perform_member_init): Use new method of expr level + cleanups, instead of cleanups_this_call and friends. + (emit_base_init): Likewise. + (expand_aggr_vbase_init_1): Likewise. + (expand_vec_init): Likewise. + * decl.c (cp_finish_decl): Likewise. + (expand_static_init): Likewise. + (store_parm_decls): Likewise. + (cplus_expand_expr_stmt): Likewise. + * decl2.c (finish_file): Likewise. + + * Make-lang.in (exception.o): Ok to compile with -O now. + + * decl.c (maybe_build_cleanup_1): We no longer have to unsave, as + we know it will be done later by the backend. + + * decl2.c (lang_f_options): Remove support for short temps. + * lang-options.h: Likewise. + +Wed Apr 23 04:12:06 1997 Jason Merrill + + * tree.c (varargs_function_p): New fn. + * method.c (emit_thunk): Replace broken generic code with code to + generate a heavyweight thunk function. + +Tue Apr 22 02:45:18 1997 Jason Merrill + + * pt.c (process_template_parm): pedwarn about floating-point parms. + + * decl.c (grokdeclarator): inline no longer implies static. + + * spew.c (yylex): Always return the TYPE_DECL if we got a scope. + +Mon Apr 21 15:42:27 1997 Jason Merrill + + * class.c (check_for_override): The signature of an overriding + function is not changed. + + * call.c (build_over_call): Move setting of conv into the loop. + Note: this change, along with the related changes of the 18th thru + the 20th of April, fix an infinite loop problem in conversions. + +Sun Apr 20 16:24:29 1997 Jason Merrill + + * call.c (build_user_type_conversion_1): Really ignore rvalue + conversions when looking for a REFERENCE_TYPE. + + * cvt.c (build_up_reference): Eviscerate, use build_unary_op. + * cp-tree.h (TREE_REFERENCE_EXPR): #if 0. + * typeck.c (decay_conversion): Don't set TREE_REFERENCE_EXPR. + (build_unary_op): Likewise. + * call.c (build_over_call): See through a CONVERT_EXPR around the + ADDR_EXPR for on a temporary. + * typeck.c (c_expand_return): See through a CONVERT_EXPR around + the ADDR_EXPR for a local variable. + +Fri Apr 18 12:11:33 1997 Jason Merrill + + * call.c (build_user_type_conversion_1): If we're trying to + convert to a REFERENCE_TYPE, only consider lvalue conversions. + (build_new_function_call): Print candidates. + (implicit_conversion): Try a temp binding if the lvalue conv is BAD. + (reference_binding): Binding a temporary of a reference-related type + is BAD. + +Thu Apr 17 14:37:22 1997 Brendan Kehoe + + * inc/typeinfo (type_info::before): Add cv-qualifier-seq. + * tinfo2.cc (type_info::before): Likewise. + +Mon Apr 14 12:38:17 1997 Jason Merrill + + * call.c (implicit_conversion): Oops. + +Fri Apr 11 02:18:30 1997 Jason Merrill + + * call.c (implicit_conversion): Try to find a reference conversion + before binding a const reference to a temporary. + +Wed Apr 2 12:51:36 1997 Mike Stump + + * exception.cc (__default_unexpected): Call terminate by default, + so that if the user overrides terminate, the correct function will + be called. + +Wed Mar 19 14:14:45 1997 Mike Stump + + * parse.y (left_curly): Avoid trying to use any fields of + error_mark_node, as there aren't any. + +Thu Mar 13 16:33:22 1997 Jason Merrill + + * lex.c (do_identifier): Avoid breaking on overloaded methods + as default arguments. + +Wed Mar 12 13:55:10 1997 Hans-Peter Nilsson + + * call.c (add_template_candidate): Initialize the variable "dummy". + +Mon Mar 10 15:13:14 1997 Brendan Kehoe + + * decl.c (start_decl): Make sure TYPE isn't an error_mark_node + before we try to use TYPE_SIZE and TREE_CONSTANT on it. + +Fri Mar 7 13:19:36 1997 Brendan Kehoe + + * cp-tree.h (comp_ptr_ttypes, more_specialized): Add decl. + (debug_binfo): Delete decl, not needed. + + * tree.c (fnaddr_from_vtable_entry, function_arg_chain, + promotes_to_aggr_type): Delete fns. + * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY, + SET_FNADDR_FROM_VTABLE_ENTRY, FUNCTION_ARG_CHAIN, + PROMOTES_TO_AGGR_TYPE): Delete alternates to #if 1. + + * decl.c (pending_invalid_xref{,_file,_line}): Delete unused vars. + + * friend.c (is_friend_type): Delete fn. + * cp-tree.h (is_friend_type): Delete decl. + + * decl.c (original_result_rtx, double_ftype_double, + double_ftype_double_double, int_ftype_int, long_ftype_long, + float_ftype_float, ldouble_ftype_ldouble, last_dtor_insn): Make static. + * typeck.c (original_result_rtx, warn_synth): Delete extern decls. + + * decl.c (push_overloaded_decl{,_top_level}): Make static, adding + fwd decls. + * cp-tree.h (push_overloaded_decl{,_top_level}): Delete decls. + + * decl.c (pushdecl_nonclass_level): #if 0, unused. + * cp-tree.h (pushdecl_nonclass_level): #if 0 decl. + + * lex.c (reinit_lang_specific): #if 0, unused. + * cp-tree.h (reinit_lang_specific): #if 0 decl. + + * decl.c (revert_static_member_fn): Make static, adding fwd decl. + * cp-tree.h (revert_static_member_fn): Delete decl. + + * class.c (root_lang_context_p): Delete fn. + * cp-tree.h (root_lang_context_p): Delete decl. + + * decl.c (set_current_level_tags_transparency): #if 0, unused. + * cp-tree.h (set_current_level_tags_transparency): #if 0 decl. + + * lex.c (set_vardecl_interface_info): Make static. + * cp-tree.h (set_vardecl_interface_info): Delete decl. + + * call.c (find_scoped_type): Make static. + * cp-tree.h (find_scoped_type): Delete decl. + + * search.c (convert_pointer_to_vbase): Make static. + * cp-tree.h (convert_pointer_to_vbase): Delete decl. + + * decl.c (const_ptr_type_node): Likewise. + * cp-tree.h (const_ptr_type_node): Delete decl. + + * typeck.c (common_base_type): Make static. + * cp-tree.h (common_base_types): Delete erroneous decl. + + * pt.c (classtype_mangled_name): Make static. + * cp-tree.h (classtype_mangled_name): Delete decl. + + * lex.c (check_newline): Make static. + * cp-tree.h (check_newline): Delete decl. + + * typeck.c (build_x_array_ref): Delete fn, same idea as + grok_array_decl. + * cp-tree.h (build_x_array_ref): Delete decl. + + * lex.c (copy_decl_lang_specific): Delete fn, same idea as + copy_lang_decl. + * cp-tree.h (copy_decl_lang_specific): #if 0 decl. + + * class.c (build_vtable_entry): Make static. + * cp-tree.h (build_vtable_entry): Delete decl. + + * class.c (build_vbase_pointer): Make static. + * cp-tree.h (build_vbase_pointer): Delete decl. + + * sig.c (build_sptr_ref): Add forward decl and make static. + * cp-tree.h (build_sptr_ref): Delete decl. + + * call.c (build_new_method_call): Add forward decl and make static. + * cp-tree.h (build_new_method_call): Delete decl. + + * call.c (build_object_call): Make static. + * class.c (check_for_override, complete_type_p, mark_overriders): + Likewise. + * decl.c (cp_function_chain): Likewise. + * lex.c (set_typedecl_interface_info, reinit_parse_for_block): + Likewise. + * pt.c (comp_template_args, get_class_bindings, push_tinst_level): + Likewise. + * tree.c (build_cplus_array_type_1): Likewise. + * typeck.c (comp_ptr_ttypes_{const,real,reinterpret}): Likewise. + (comp_target_parms): Likewise. + + * init.c (build_builtin_call): Make static. + * cp-tree.h (build_builtin_call): Delete decl. + + * typeck.c (binary_op_error): Delete decl. + * cp-tree.h (binary_op_error): Likewise. + +Thu Mar 6 16:13:52 1997 Brendan Kehoe + + * call.c (build_method_call): Compare against error_mark_node + directly, rather than the ERROR_MARK tree code. + * cvt.c (cp_convert): Likewise. + * decl.c (print_binding_level): Likewise. + (duplicate_decls): Likewise. + (grokdeclarator): Likewise. + (grokdeclarator): Likewise. + * init.c (expand_aggr_init_1): Likewise. + (decl_constant_value): Likewise. + * method.c (build_opfncall): Likewise. + (hack_identifier): Likewise. + * typeck.c (build_modify_expr): Likewise. + + * typeck.c (build_c_cast): Don't decl TYPE as register tree. + +Sun Mar 2 02:54:36 1997 Bruno Haible + + * pt.c (unify): Strip NOP_EXPR wrappers before unifying integer values. + + * pt.c (coerce_template_parms): Add new error message. + + * method.c (build_overload_value): Implement name mangling for + floating-point template arguments. + + * method.c (build_overload_int, icat, dicat): Fix mangling of template + arguments whose absolute value doesn't fit in a signed word. + +Mon Mar 3 12:14:54 1997 Brendan Kehoe + + * friend.c: New file; put all of the friend stuff in here. + * init.c: Instead of here. + * Makefile.in (CXX_OBJS): Add friend.o. + (friend.o): Add dependencies. + * Make-lang.in (CXX_SRCS): Add $(srcdir)/cp/friend.c. + +Sun Mar 2 11:04:43 1997 Jason Merrill + + * call.c (build_scoped_method_call): Complain if the scope isn't a + base. + +Wed Feb 26 11:31:06 1997 Jason Merrill + + * parse.y (left_curly): Don't crash on erroneous type. + + * init.c (build_delete): Fix type of ref. + +Tue Feb 25 12:41:48 1997 Jason Merrill + + * search.c (get_vbase_1): Renamed from get_vbase. + (get_vbase): Wrapper, now non-static. + (convert_pointer_to_vbase): Now static. + + * call.c (build_scoped_method_call): Accept a binfo for BASETYPE. + * init.c (build_delete): Pass one. + (build_partial_cleanup_for): Use build_scoped_method_call. + * decl.c (finish_function): Pass a binfo. + +Mon Feb 24 15:00:12 1997 Jason Merrill + + * call.c (build_over_call): Only synthesize non-trivial copy ctors. + + * typeck.c (build_c_cast): Lose other reference to flag. + + * call.c (build_field_call): Don't look for [cd]tor_identifier. + * decl2.c (delete_sanity): Remove meaningless use of + LOOKUP_HAS_IN_CHARGE. + * decl.c (finish_function): Use build_scoped_method_call instead + of build_delete for running vbase dtors. + * init.c (build_delete): Call overload resolution code instead of + duplicating it badly. + +Thu Feb 20 15:12:15 1997 Jason Merrill + + * call.c (build_over_call): Call mark_used before trying to elide + the call. + + * decl.c (implicitly_declare): Don't set DECL_ARTIFICIAL. + +Wed Feb 19 11:18:53 1997 Brendan Kehoe + + * typeck.c (build_modify_expr): Always pedwarn for a cast to + non-reference used as an lvalue. + +Wed Feb 19 10:35:37 1997 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Convert from 0 to a pmf properly. + +Tue Feb 18 15:40:57 1997 Jason Merrill + + * parse.y (handler): Fix template typo. + +Sun Feb 16 02:12:28 1997 Jason Merrill + + * error.c (lang_decl_name): New fn. + * tree.c (lang_printable_name): Use it. + +Fri Feb 14 16:57:05 1997 Mike Stump + + * g++spec.c: Include config.h so that we can catch bzero #defines + from the config file. + +Tue Feb 11 13:50:48 1997 Mike Stump + + * new1.cc: Include a declaration for malloc, to avoid warning, and + avoid lossing on systems that require one (ones that define malloc + in xm.h). + +Mon Feb 10 22:51:13 1997 Bruno Haible + + * decl2.c (max_tinst_depth): New variable. + (lang_decode_option): Parse "-ftemplate-depth-NN" command line + option. + * pt.c (max_tinst_depth): Variable moved. + * lang-options.h: Declare "-ftemplate-depth-NN" command line option + as legal. + +Fri Feb 7 15:43:34 1997 Jason Merrill + + * decl.c (xref_basetypes): Allow a base class that depends on + template parms to be incomplete. + + * decl2.c (build_expr_from_tree): Support typeid(type). + * rtti.c (get_typeid): Support templates. + (expand_si_desc, expand_class_desc): Fix string length. + (expand_ptr_desc, expand_attr_desc, expand_generic_desc): Likewise. + +Tue Feb 4 11:28:24 1997 Jason Merrill + + * pt.c (unify, case TEMPLATE_CONST_PARM): Use cp_tree_equal. + + * pt.c (tsubst): Put it back for -fno-ansi-overloading. + +Mon Feb 3 18:41:12 1997 Jason Merrill + + * pt.c (tsubst, case FUNCTION_DECL): Lose obsolete code that + smashes together template and non-template decls of the same + signature. + +Thu Jan 30 19:18:00 1997 Jason Merrill + + * pt.c (tsubst): Don't recurse for the type of a TYPENAME_TYPE. + +Wed Jan 29 11:40:35 1997 Brendan Kehoe + + * decl.c (duplicate_decls): Next route, pedwarn about different + exceptions if -pedantic *or* olddecl !DECL_IN_SYSTEM_HEADER. + +Tue Jan 28 20:43:29 1997 Brendan Kehoe + + * cp-tree.h (HAS_DEFAULT_IMPLEMENTATION): Delete macro. + (struct lang_type): Delete has_default_implementation member. + Increase dummy to 21. + * decl.c (start_method): Delete usage. + + * cp-tree.h (build_call, null_ptr_cst_p, in_function_p, + store_after_parms, start_decl_1, auto_function): Add decls. + (get_arglist_len_in_bytes, declare_implicit_exception, + have_exceptions_p, make_type_decl, typedecl_for_tag, + store_in_parms, pop_implicit_try_blocks, push_exception_cleanup, + build_component_type_expr, cplus_exception_name, + {make,clear}_anon_parm_name, dont_see_typename): Removed decls. + * call.c (build_this): Make static. + (is_complete): Likewise. + (implicit_conversion): Likewise. + (reference_binding): Likewise. + (standard_conversion): Likewise. + (strip_top_quals): Likewise. + (non_reference): Likewise. + (build_conv): Likewise. + (user_harshness): Likewise. + (rank_for_ideal): Likewise. + * decl.c (start_decl_1): Delete forward decl. + (push_decl_level): Make static. + (resume_binding_level): Make static. + (namespace_bindings_p): Make static. + (declare_namespace_level): Make static. + (lookup_name_real): Make static. + (duplicate_decls): Make static. Take register off NEWDECL and + OLDDECL parm decls. + * decl2.c (get_sentry): Make static. + (temp_name_p): Delete fn. + * except.c (auto_function): Delete decl. + * lex.c (handle_{cp,sysv}_pragma): Make static. + (handle_sysv_pragma) [HANDLE_SYSV_PRAGMA]: Add forward decl. + * method.c (do_build_{copy_constructor,assign_ref}): Make static. + * pt.c (tsubst_expr_values): Make static. + * rtti.c (combine_strings): Delete decl. + +Tue Jan 28 16:40:40 1997 Jason Merrill + + * pt.c (push_template_decl): Handle getting a typedef. + + * call.c (build_new_function_call): Complain about void arg. + +Tue Jan 28 15:25:09 1997 Brendan Kehoe + + * decl.c (duplicate_decls): Give pedwarn of different exceptions + if -pedantic, instead of olddecl !DECL_IN_SYSTEM_HEADER. + +Mon Jan 27 19:21:29 1997 Mike Stump + + * except.c (expand_throw): Don't expand the cleanup tree here, + since we are not going to write the rtl out. Fixes problem with + -g -O on SPARC. + +Mon Jan 27 16:24:35 1997 Sean McNeil + + * Make-lang.in: Add $(exeext) as necessary. + +Mon Jan 27 13:20:39 1997 Mike Stump + + * parse.y (handler_seq): Must have at least one catch clause. + +Sat Jan 25 12:00:05 1997 Jason Merrill + + * call.c (add_builtin_candidate): Restore ?: hack. + + * decl.c (grok_op_properties): More warnings. + +Sat Jan 25 08:50:03 1997 Brendan Kehoe + + * decl.c (duplicate_decls): On second thought, do it as a pedwarn + still but only if !DECL_IN_SYSTEM_HEADER (olddecl). + + * decl.c (duplicate_decls): Scale back to a warning, and only do + 'em if -pedantic. + +Fri Jan 24 17:52:54 1997 Mike Stump + + * decl.c (duplicate_decls): pedwarn mismatched exception + specifications. + +Thu Jan 23 18:18:54 1997 Mike Stump + + * call.c (build_new_method_call): Don't display the invisible + argument for controlling virtual bases. + +Thu Jan 23 16:48:10 1997 Mike Stump + + * new: Add nothrow new and delete, bad_alloc and throw specifications + for delete. + * decl.c (init_decl_processing): Add throw specification for delete. + * new.cc (nothrow): Define. + * lex.c (real_yylex): Removing warning that throw and friends are + keywords. + * new1.cc (operator new (size_t sz, const nothrow_t&)): Define. + * new2.cc (operator new[] (size_t sz, const nothrow_t&): Define. + * Make-lang.in: Add new{1,2}.{cc,o}. + +Thu Jan 23 16:39:06 1997 Jason Merrill + + * lex.c (cons_up_default_function): Fix return type of synth op=. + + * init.c (emit_base_init): Add warnings for uninitialized members + and bases. + + * decl.c (xref_basetypes): Add warning for non-polymorphic type + with destructor used as base type. + + * decl.c (grok_op_properties): Add warning for op= returning void. + * typeck.c (c_expand_return): Add warning for op= returning anything + other than *this. + + * class.c (finish_struct_1): Add warning for class with pointers + but not copy ctor or copy op=. + + * cp-tree.h (TI_PENDING_TEMPLATE_FLAG): New macro. + * pt.c (add_pending_template): Use it instead of LANG_FLAG_0. + (instantiate_template): If -fexternal-templates, add this + instantiation to pending_templates. + + * decl2.c (copy_assignment_arg_p): Disable old hack to support + Booch components. + +Tue Jan 21 18:32:04 1997 Mike Stump + + * cvt.c (cp_convert): pedwarn enum to pointer conversions. + +Mon Jan 20 17:59:51 1997 Jason Merrill + + * call.c (standard_conversion): Handle getting references. Tack + on RVALUE_CONV here. Do it for non-class types, too. + (reference_binding): Pass references to standard_conversion. + (implicit_conversion): Likewise. + (add_builtin_candidate): Disable one ?: kludge. + (convert_like): Handle RVALUE_CONVs for non-class types. + (joust): Disable the other ?: kludge. + +Mon Jan 20 14:53:13 1997 Brendan Kehoe + + * decl.c (init_decl_processing): Add code to build up common + function types beforehand, to avoid creation then removal of + things already in the hash table. + +Mon Jan 20 14:43:49 1997 Jason Merrill + + * decl.c (finish_function): Also zero out DECL_INCOMING_RTL for + the arguments. + + * error.c (dump_expr, TEMPLATE_CONST_PARM): Don't require + current_template_parms. + +Fri Jan 17 10:25:42 1997 Jason Merrill + + * search.c (lookup_field): Don't return a function, check want_type. + +Thu Jan 16 18:14:35 1997 Brendan Kehoe + + * init.c (build_new): Make sure PLACEMENT has a type. + +Thu Jan 16 17:40:28 1997 Jason Merrill + + * init.c (build_new): Support new (nothrow). + +Wed Jan 15 12:38:14 1997 Jason Merrill + + * pt.c (instantiate_decl): Also do push_to_top_level before setting + up DECL_INITIAL. + + * cp-tree.h (PARM_DEFAULT_FROM_TEMPLATE): New macro. + * pt.c (tsubst): Defer instantiation of default args. + * call.c (build_over_call): Until here. + +Wed Jan 15 10:08:10 1997 Brendan Kehoe + + * search.c (lookup_field): Make sure we have an + IDENTIFIER_CLASS_VALUE before we try to return it. + +Thu Jan 9 07:19:01 1997 Brendan Kehoe + + * call.c (build_method_call): Delete unused var PARM. + (build_overload_call_real): Likewise. + (build_object_call): Delete unused var P. + (build_new_op): Likewise. + * decl.c (builtin_type_tdescs_{arr, len, max}): #if 0 out static + var definitions, which are never used. + (shadow_tag): Delete unused var FN. + * expr.c (cplus_expand_expr): Delete unused var ORIGINAL_TARGET. + * init.c (build_new): Delete unused var ALLOC_TEMP. + * method.c (hack_identifier): Delete unused var CONTEXT. + (do_build_copy_constructor): Delete unused var NAME. + (synthesize_method): Delete unused var BASE. + * pt.c (lookup_template_class): Delete unused var CODE_TYPE_NODE. + * rtti.c (build_headof): Delete unused var VPTR. + (get_typeid): Delete unused var T. + * typeck.c (build_conditional_expr): Delete unused vars ORIG_OP1 + and ORIG_OP2. + (build_ptrmemfunc): Delete unused vars U and NINDEX. + * typeck2.c (build_functional_cast): Delete unused var BINFO. + +Wed Jan 8 13:09:54 1997 Jason Merrill + + * search.c (lookup_field): Use IDENTIFIER_CLASS_VALUE to look up + things in a type being defined. + * decl.c (finish_enum): Reverse the values so that they are in + the correct order. + + * pt.c (instantiate_class_template): Don't initialize + BINFO_BASETYPES until the vector is filled out. + (unify): Don't abort on conflicting bindings, just fail. + (instantiate_decl): Do push_tinst_level before any tsubsting. + + * method.c (build_overload_value): Handle getting a + TEMPLATE_CONST_PARM for a pointer. + +Tue Jan 7 14:00:58 1997 Jason Merrill + + * init.c (expand_member_init): Don't give 'not a base' error for + templates. + + * pt.c (instantiate_decl): Call import_export_decl later. + + * pt.c (instantiate_class_template): Return a value. + + * parse.y (extension): New rule for __extension__. + (extdef, unary_expr, decl, component_decl): Use it. + +Tue Jan 7 09:20:28 1997 Mike Stump + + * class.c (base_binfo): Remove unused base_has_virtual member. + (finish_base_struct): Likewise. + (finish_struct_1): Likewise. + + + +Copyright (C) 1997 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1998 b/gcc/cp/ChangeLog-1998 new file mode 100644 index 000000000..008f5c360 --- /dev/null +++ b/gcc/cp/ChangeLog-1998 @@ -0,0 +1,6894 @@ +Tue Dec 22 15:09:25 1998 Kaveh R. Ghazi + + * Makefile.in (cvt.o): Depend on toplev.h. + + * cp-tree.h (check_template_shadow, pod_type_p): Add prototypes. + + * cvt.c: Include toplev.h. + + * except.c (get_eh_caught, get_eh_handlers): Hide prototypes and + definitions. + + * init.c (expand_vec_init): Initialize variable `itype'. + + * lex.c (yyerror): Cast the argument passed to a ctype function to + an unsigned char. + + * method.c (build_mangled_C9x_name): Wrap prototype and definition + in "HOST_BITS_PER_WIDE_INT >= 64". + + * typeck.c (build_binary_op): Mark parameter `convert_p' with + ATTRIBUTE_UNUSED. + +1998-12-22 Mark Mitchell + + * cp-tree.h (TYPE_RAISES_EXCEPTIONS): Improve documentation. + * tree.c (build_exception_variant): Don't crash on empty throw + specs. + +1998-12-18 DJ Delorie + + * cvt.c (convert_to_reference): Check for both error_mark_node + and NULL_NODE after call to convert_for_initialization. + +1998-12-17 Jason Merrill + + * error.c (interesting_scope_p): New fn. + (dump_simple_decl): Use it. + (dump_expr, case CONSTRUCTOR): Force a & for a PMF. + (dump_expr, case OFFSET_REF): Print ->* if appropriate. + +1998-12-16 Mark Mitchell + + * class.c (resolve_address_of_overloaded_function): Do conversion + to correct type here, rather than ... + (instantiate_type): Here. + + * cp-tree.h (DECL_TEMPLATE_PARM_P): New macro. + (DECL_TEMPLATE_TEMPLATE_PARM_P): Use it. + (decl_template_parm_p): Remove. + * decl.c (pushdecl): Don't set DECL_CONTEXT for a template + parameter. + * lex.c (do_identifier): Use DECL_TEMPLATE_PARM_P. + * pt.c (push_inline_template_parms_recursive): Set it. + (decl_template_parm_p): Remove. + (check_template_shadow): Use DECL_TEMPLATE_PARM_P. + (process_template_parm): Set it. + +Wed Dec 16 16:33:58 1998 Dave Brolley + + * lang-specs.h (default_compilers): Pass -MD, -MMD and -MG to cc1plus + if configured with cpplib. + +1998-12-15 Mark Mitchell + + * decl.c (poplevel): Make sure ns_binding is initialized. + + * decl.c (finish_function): Undo inadvertent change in previous + patch. + +1998-12-14 Mark Mitchell + + * class.c (pushclass): Tweak handling of class-level bindings. + (resolve_address_of_overloaded_function): Update pointer-to-member + handling. + (instantiate_type): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + * decl.c (pop_binding): Take the DECL to pop, not just the name. + Deal with `struct stat' hack. + (binding_level): Add to documentation. + (push_binding): Clear BINDING_TYPE. + (add_binding): New function. + (push_local_binding): Use it. + (push_class_binding): Likewise. + (poplevel): Adjust calls to pop_binding. + (poplevel_class): Likewise. + (pushdecl): Adjust handling of TYPE_DECLs; add bindings for hidden + declarations to current binding level. + (push_class_level_binding): Likewise. + (push_overloaded_decl): Adjust handling of OVERLOADs in local + bindings. + (lookup_namespace_name): Don't crash when confronted with a + TEMPLATE_DECL. + (lookup_name_real): Do `struct stat' hack in local binding + contexts. + (build_ptrmemfunc_type): Adjust documentation. + (grokdeclarator): Don't avoid building real array types when + processing templates unless really necessary. + (finish_method): Adjust calls to pop_binding. + * decl2.c (reparse_absdcl_as_expr): Recursively call ourselves, + not reparse_decl_as_expr. + (build_expr_from_tree): Deal with a template-id as the function to + call in a METHOD_CALL_EXPR. + * pt.c (convert_nontype_argument): Tweak pointer-to-member handling. + (maybe_adjust_types_For_deduction): Don't do peculiar things with + METHOD_TYPEs here. + (resolve_overloaded_unification): Handle COMPONENT_REFs. Build + pointer-to-member types where necessary. + * tree.c (build_cplus_array_type_1): Don't avoid building real + array types when processing templates unless really necessary. + (build_exception_variant): Compare the exception lists correctly. + +1998-12-13 Mark Mitchell + + * cp-tree.def (CPLUS_BINDING): Update documentation. + * cp-tree.h (LOCAL_BINDING_P): New macro. + (lang_identifier): Rename local_value to bindings. + (tree_binding): Make `scope' of type `void*', not `tree'. + (BINDING_SCOPE): Update documentation. + (IDENTIFIER_LOCAL_VALUE): Remove. + (IDENTIFIER_CLASS_VALUE): Document. + (IDENTIFIER_BINDING): New macro. + (IDENTIFIER_VALUE): Likewise. + (TIME_IDENTIFIER_TIME): Likewise. + (TIME_IDENTIFIER_FILEINFO): Likewise. + (IMPLICIT_TYPENAME_P): Likewise. + (set_identifier_local_value): Remove. + (push_local_binding): New function. + (push_class_binding): Likewise. + * class.c (pushclass): Update comments; use push_class_binding. + * decl.c (set_identifier_local_value_with_scope): Remove. + (set_identifier_local_value): Likewise. + (push_binding): New function. + (pop_binding): Likewise. + (binding_level): Update documentation. Remove shadowed. + (BINDING_LEVEL): New macro. + (free_binding_nodes): New variable. + (poplevel): Adjust for new name-lookup scheme. Don't mess up + BLOCK_VARs when doing for-scope extension. Remove effectively + dead code. + (pushlevel_class): Tweak formatting. + (poplevel_class): Adjust for new name-lookup scheme. + (print_binding_level): Likewise. + (store_bindings): Likewise. + (pushdecl): Likewise. + (pushdecl_class_level): Likewise. + (push_class_level_binding): Likewise. + (push_overloaded_decl): Update comments. Adjust for new + name-lookup scheme. + (lookup_name_real): Likewise. + (lookup_name_current_level): Likewise. + (cp_finish_decl): Likewise. + (require_complete_types_for_parms): Likewise. Remove misleading + #if 0'd code. + (grok_parms): Likewise. Don't call + require_complete_types_for_parms here. + (grok_ctor_properties): Don't treat templates as copy + constructors. + (grop_op_properties): Or as assignment operators. + (start_function): Document. Adjust for new name-lookup scheme. + (finish_function): Likewise. + * decl2.c (do_local_using_decl): Use push_local_binding. + * lex.c (begin_definition_of_inclass_inline): New function, split + out from ... + (do_pending_inlines): Here, and ... + (process_next_inline): Here. + (get_time_identifier): Use TIME_IDENTIFIER_* macros. + (init_filename_times): Likewise. + (extract_interface_info): Likewise. + (ste_typedecl_interface_info): Likewise. + (check_newline): Likewise. + (dump_time_statistics): Likewise. + (handle_cp_pragma): Likewise. + (do_identifier): Adjust for new name-lookup scheme. + * parse.y (function_try_block): Return ctor_initializer_opt value. + (fndef): Use it. + (fn.defpen): Pass appropriate values to start_function. + (pending_inline): Use functor_try_block value, and pass + appropriate values to finish_function. + * pt.c (is_member_template): Update documentation; remove handling + of FUNCTION_DECLs. As per name, this function should deal only in + TEMPLATE_DECLs. + (decl_template_parm_p): Change name of olddecl parameter to decl. + (check_template_shadow): Adjust for new name-lookup scheme. + (lookup_template_class): Likewise. + (tsubst_decl): Tweak so as not to confuse member templates with + copy constructors and assignment operators. + (unify): Handle UNION_TYPEs. + * ptree.c (print_lang_identifier): Adjust for new name-lookup scheme. + (lang_print_xnode): Adjust for new name-lookup scheme. + * typeck.c (mark_addressable): Likewise. + (c_expand_return): Likewise. + +1998-12-08 Jason Merrill + + * decl.c (grokdeclarator): Allow field with same name as class + in extern "C". + + * decl.c (lookup_name_real): Don't limit field lookup to types. + * class.c (check_member_decl_is_same_in_complete_scope): No error + if icv and x are the same. + * lex.c (do_identifier): Tweak error message. + +1998-12-10 Mark Mitchell + + * decl.c (start_enum): Use push_obstacks, not + end_temporary_allocation. + (finish_enum): Call pop_obstacks. + +1998-12-10 Mark Mitchell + + * class.c (instantiate_type): Return error_mark_node rather than + junk. + +1998-12-09 Mark Mitchell + + * cp-tree.h (most_specialized_instantiation): New function. + (print_candidates): Likewise. + * class.c (validate_lhs): Remove. + (resolve_address_of_overloaded_function): New function, split out + and then substantially reworked, from ... + (instantiate_type): Use it. Simplify. + * cvt.c (convert_to_reference): Complain when caller has indicated + that's the right thing to do. Don't crash if instantiate_type + fails. + * pt.c: Substitute `parameters' for `paramters' throughout. + (print_candidates): Don't make it static. + (most_specialized_instantiation): Split out from ... + (most_specialized): Here. + +Wed Dec 9 15:33:01 1998 Dave Brolley + + * lex.c (lang_init_options): Initialize cpplib. + * decl2.c (parse_options,cpp_initialized): Removed. + (lang_decode_option): Move initialization of cpplib to + lang_init_options. + +1998-12-09 Mark Mitchell + + * decl.c (grokdeclarator): Update the name of the TEMPLATE_DECL, as + well as the TYPE_DECL, when a typedef name is assigned to a + previously anonymous type. + +1998-12-08 Andrew MacLeod + + * cp/except.c (call_eh_info): Use __start_cp_handler instead of + __cp_eh_info for getting the eh info pointer. Add table_index to + field list. + (push_eh_cleanup): Don't increment 'handlers' data field. + (process_start_catch_block): Don't set the 'caught' field. + + * cp/exception.cc (CP_EH_INFO): New macro for getting the + exception info pointer within library routines. + (__cp_eh_info): Use CP_EH_INFO. + (__start_cp_handler): Get exception info pointer, set caught field, + and increment the handlers field. Avoids this being done by handlers. + (__uncatch_exception, __check_eh_spec): Use CP_EH_INFO macro. + (uncaught_exception): Use CP_EH_INFO macro. + +Tue Dec 8 10:48:21 1998 Jeffrey A Law (law@cygnus.com) + + * Make-lang.in (cxxmain.o): Depend on $(DEMANGLE_H), not demangle.h + +Mon Dec 7 17:56:06 1998 Mike Stump + + * lex.c (check_newline): Add support for \ as `natural' + characters in file names in #line to be consistent with #include + handling. We support escape processing in the # 1 "..." version of + the command. See also support in cp/lex.c. + +1998-12-07 Zack Weinberg + + * cp/decl2.c: s/data/opts/ when initializing cpp_reader + structure. + +1998-12-07 Jason Merrill + + * decl.c (build_typename_type): Set DECL_ARTIFICIAL. + + * error.c (dump_simple_decl): Also print namespace context. + (dump_function_decl): Likewise. + + * decl2.c (ambiguous_decl): Don't print old value if it's + error_mark_node. + + * decl.c (lookup_name_real): Fix handling of local types shadowed + by a non-type decl. Remove obsolete code. + * cp-tree.h (DECL_FUNCTION_SCOPE_P): New macro. + + * lang-options.h: Add -fpermissive. + * decl2.c: Likewise. + * cp-tree.h: Add flag_permissive. + * decl.c (init_decl_processing): If neither -fpermissive or -pedantic + were specified, set flag_pedantic_errors. + * call.c (build_over_call): Turn dropped qualifier messages + back into pedwarns. + * cvt.c (convert_to_reference): Likewise. + * typeck.c (convert_for_assignment): Likewise. + +1998-12-05 Jason Merrill + + * decl2.c (coerce_new_type): Use same_type_p. + (coerce_delete_type): Likewise. + + * call.c (check_dtor_name): Return 1, not error_mark_node. + +1998-12-04 Jason Merrill + + * lex.c (handle_cp_pragma): Disable #pragma interface/implementation + if MULTIPLE_SYMBOL_SPACES. + + * pt.c (check_template_shadow): New fn. + * decl2.c (grokfield): Use it. + * decl.c (pushdecl): Likewise. + (pushdecl_class_level): Likewise. + (start_method): Likewise. + (xref_tag): Don't try to use 't' if we're defining. + + * call.c (check_dtor_name): Just return an error_mark_node. + * pt.c (lookup_template_class): Complain about using non-template here. + * parse.y (apparent_template_type): Not here. + + * pt.c (check_explicit_specialization): Complain about specialization + with C linkage. + + * lang-options.h: Add -f{no-,}implicit-inline-templates. + + * pt.c (convert_nontype_argument): Don't assume that any integer + argument is intended to be a constant-expression. + +1998-12-03 Mark Mitchell + + * class.c (handle_using_decl): Fix comment. Don't lookup + constructors in base classes. + (validate_lhs): Fix typo in comment. + * search.c (lookup_field_1): Don't return a USING_DECL. + + * cp-tree.h (DECL_ACCESS): Improve documentation. + + * decl.c (expand_static_init): Don't set the initialization-done + flag until the initialization is done. + +1998-12-02 Mark Mitchell + + * decl2.c (validate_nonmember_using_decl): Complain about using + declarations for class members. + +1998-11-29 Jason Merrill + + * typeck2.c (process_init_constructor): Use same_type_p. + + * decl.c (check_tag_decl): Don't warn about null decl inside a + class. + + * pt.c (unify, case OFFSET_TYPE): Pass down 'strict' rather than + UNIFY_ALLOW_NONE. + (convert_nontype_argument): Use TYPE_PTRMEMFUNC_FN_TYPE. + (resolve_overloaded_unification): Strip baselinks. + +Fri Nov 27 13:07:23 1998 Kaveh R. Ghazi + + * g++spec.c: Don't prototype xmalloc. + +1998-11-25 Jason Merrill + + * except.c (expand_throw): Use TYPE_PTR_P to check for pointers. + + * decl.c (check_tag_decl): Do complain about null friend decl at + file scope. + +1998-11-25 Andreas Schwab + + * lex.c (make_lang_type): Clear the whole struct lang_type, not + only the first multiple of sizeof (int). + +1998-11-24 Jason Merrill + + * decl.c (start_decl): An explicit specialization of a static data + member is only a definition if it has an initializer. + + * except.c (expand_throw): Use cp_finish_decl for the throw temp. + * cvt.c (build_up_reference): Pass DIRECT_BIND down into + cp_finish_decl. + * init.c (expand_default_init): Check for DIRECT_BIND instead of + DECL_ARTIFICIAL. + + * call.c (build_over_call): Use build_decl. + + * except.c (expand_throw): Just use convert, not + build_reinterpret_cast. + + * lex.c (handle_generic_pragma): Use token_buffer. + + * decl.c (check_tag_decl): Don't complain about null friend decl. + +1998-11-24 Dave Pitts + + * Make-lang.in (DEMANGLER_PROG): Move the output arguments to the + first position. + * lex.c (check_newline): Use ISALPHA. + (readescape): Use ISGRAPH. + (yyerror): Use ISGRAPH. + +1998-11-24 Nathan Sidwell + + * search.c (get_abstract_virtuals): Do not use initial + CLASSTYPE_ABSTRACT_VIRTUALS. + * typeck2.c (abstract_virtuals_error): Show location of abstract + declaration. + * call.c (build_new_method_call): Use + CLASSTYPE_ABSTRACT_VIRTUAL, rather than recalculate. + * class.c (finish_struct_bits): Don't bother working out whether + get_abstract_virtuals will do anything, just do it. + +1998-11-24 Graham + + * typeck.c (build_component_ref): Remove unused statement. + +1998-11-24 Jason Merrill + + * class.c (add_method): Catch invalid overloads. + + * class.c (add_method): Build up OVERLOADs properly for conversion ops. + * search.c (lookup_conversions): Handle getting real OVERLOADs. + (add_conversions): Likewise. Revert last change. + * call.c (add_conv_candidate): Pass totype to add_candidate instead + of fn. Don't add a new candidate if the last one was for the same + type. + (print_z_candidates): Handle getting a type as a function. + (joust): If we got two conversion candidates to the same type, + just pick one. + (build_object_call): Lose 'templates'. + (build_user_type_conversion_1): Handle getting real OVERLOADs. + +1998-11-23 Jason Merrill + + * typeck2.c (process_init_constructor): If there are elements + that don't have initializers and they need to have constructors + run, supply them with initializers. + + * class.c (finish_struct_1): A class with a 0-width bitfield is + still empty. + +1998-11-23 Mark Mitchell + + * pt.c (instantiate_class_template): Don't try to figure out what + specialization to use for a partial instantiation. Correct + typos in a couple of comments. Avoid calling uses_template_parms + multiple times. + +1998-11-23 Benjamin Kosnik + + * method.c (process_overload_item): Add call to + build_mangled_C9x_name for intTI_type_nodes. + (build_mangled_C9x_name): Add prototype, define. + * decl.c (init_decl_processing): Add names for + TImode_type_node. + +1998-11-23 Jason Merrill + + * parse.y (named_class_head): Update CLASSTYPE_DECLARED_CLASS. + + * class.c (finish_struct_1): Set things up for 0-width bitfields + like we do for others. + + * decl.c (check_tag_decl): New fn. + (shadow_tag): Split out from here. + * decl2.c (grok_x_components): Call it. + +1998-11-22 Jason Merrill + + * decl.c: Lose warn_about_return_type. + (grokdeclarator): Always complain about implicit int, except for + `main () { ... }'. + + * decl.c (tag_name): New fn. + (xref_tag): Complain about using typedef-name after class-key. + + * init.c (expand_vec_init): Also keep going if from_array. + + * tree.c (is_overloaded_fn): Also handle the output of + build_offset_ref. + + * decl.c (grokdeclarator): Use constructor_name when comparing + field name against enclosing class. + * class.c (finish_struct_anon): Likewise. + +1998-11-22 Mark Mitchell + + * decl.c (poplevel): Remove code to handle KEEP == 2. + (finish_function): Don't confuse BLOCK-order when + processing a destructor. + +1998-11-21 Jason Merrill + + * decl.c (require_complete_types_for_parms): Call layout_decl + after we've completed the type. + +1998-11-21 Martin von Löwis + + * decl2.c (validate_nonmember_using_decl): Allow using templates + from the global namespace. + +1998-11-21 Jason Merrill + + Handle specifying template args to member function templates. + * tree.c (build_overload): Always create an OVERLOAD for a template. + * search.c (add_conversions): Handle finding an OVERLOAD. + * decl2.c (check_classfn): Likewise. + * lex.c (identifier_type): See through a baselink. + * parse.y (do_id): Don't call do_identifier if we got a baselink. + * class.c (instantiate_type, case TREE_LIST): Recurse. + + * decl.c (grokdeclarator): Allow a boolean constant for array + bounds, odd as that sounds. + + * pt.c (unify): Be more strict about non-type parms, except for + array bounds. + (UNIFY_ALLOW_INTEGER): New macro. + +1998-11-19 Manfred Hollstein + + * Make-lang.in (mandir): Replace all uses of $(mandir) by $(man1dir). + +1998-11-19 Jason Merrill + + * semantics.c (begin_class_definition): Call + maybe_process_partial_specialization before push_template_decl. + Don't call push_template_decl for a specialization. + * search.c (lookup_field): Do return a member template class. + * decl2.c (handle_class_head): Handle member template classes. + + * decl.c (grokdeclarator): A parm type need not be complete. + + * pt.c (convert_nontype_argument): Fix thinko. + +1998-11-18 Mark Mitchell + + * cp-tree.h (PTRMEM_CST_CLASS): Fix typo. + (global_delete_fndecl): New variable. + * decl.c (global_delete_fndecl): Define it. + (init_decl_processing): Set it. + * init.c (build_builtin_delete_call): Use it. + * tree.c (mapcar): Recursively call mapcar for the type of EXPR + nodes. + +1998-11-18 Jason Merrill + + * decl.c (cplus_expand_expr_stmt): Always complain about unresolved + type. + + * tree.c (lvalue_p_1): An INDIRECT_REF to a function is an lvalue. + * call.c (build_object_call): Also support references to functions. + * typeck.c (convert_for_initialization): Don't decay a function + if the target is a reference to function. + + * search.c (add_conversions): Get all the overloads from a class. + + * decl.c (grok_ctor_properties): Complain about any constructor + that will take a single arg of the class type by value. + + * typeck2.c (build_functional_cast): Can't create objects of + abstract classes this way. + * cvt.c (ocp_convert): Likewise. + + * decl.c (grokfndecl): Member functions of local classes are not + public. + +1998-11-18 Mark Mitchell + + * Make-lang.in (cc1plus): Add dependency on hash.o. + +1998-11-18 Jason Merrill + + * search.c (get_abstract_virtuals): Complain about virtuals with + no final overrider. + * typeck2.c (abstract_virtuals_error): Remove handling for virtuals + with no final overrider. + * class.c (override_one_vtable): Don't set DECL_ABSTRACT_VIRTUAL_P + on virtuals with no final overrider. + + * lex.c (reinit_parse_for_block): Add a space after the initial ':'. + + * class.c (finish_struct_1): Don't remove zero-width bit-fields until + after layout_type. + + * friend.c (do_friend): Don't set_mangled_name_for_decl. + + * class.c (finish_struct_anon): Complain about non-fields. + * decl2.c (build_anon_union_vars): Likewise. + + * decl.c (grokdeclarator): Normal data members can't have the same + name as the class, either. + * class.c (finish_struct_anon): Neither can members of an + anonymous union. + +1998-11-17 Mark Mitchell + + * cp-tree.h (TYPE_ALIAS_SET): Document language-dependent uses. + (TYPE_BINFO): Likewise. + (IS_AGGR_TYPE): Tweak. + (SET_IS_AGGR_TYPE): New macro. + (CLASS_TYPE_P): Tweak. + (lang_type): Group mark bitfields together. Remove linenum. + (CLASSTYPE_SOURCE_LINE): Remove macro. + (CLASSTYPE_MARKED_N): New macro. + (SET_CLASSTYPE_MARKED_N): Likewise. + (CLEAR_CLASSTYPE_MARKED_N): Likewise. + (CLASS_TYPE_MARKED_*): Use them. + (SET_CLASSTYPE_MARKED_*): Likewise. + (CLEAR_CLASSTYPE_MARKED_*): Likewise. + (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO): Likewise. + (TYPE_TEMPLATE_INFO): Handle TEMPLATE_TEMPLATE_PARMs as well. + (TYPENAME_TYPE_FULLNAME): Use TYPE_BINFO rather than CLASSTYPE_SIZE. + * class.c (class_cache_obstack): New variable. + (class_cache_firstobj): Likewise. + (finish_struct): Don't set CLASSTYPE_SOURCE_LINE. + (pushclass): Free the cache, when appropriate. + (popclass): Tidy. + (maybe_push_cache_obstack): Use class_cache_obstack. + * decl.c (include hash.h). + (typename_hash): New function. + (typename_compare): Likewise. + (build_typename_type): Check the hash table to avoid creating + duplicates. + (build_ptrmemfunc_type): Use SET_IS_AGGR_TYPE. + (grokdeclarator): Use CLASS_TYPE_P. + (xref_basetypes): Likewise. + (start_function): Likewise. Don't put current_class_ref on the + permanent obstack. + * error.c (dump_type_real): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO + and TYPE_TI_ARGS. + * lex.c (note_got_semicolon): Use CLASS_TYPE_P. + (make_lang_type): Don't create TYPE_LANG_SPECIFIC and associated + fields for types other than class types. Do clear TYPE_ALIAS_SET + for types other than class types, though. + * method.c (build_overload_identifier): Use CLASS_TYPE_P and + TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + * pt.c (process_template_parm): Don't set + CLASSTYPE_GOT_SEMICOLON. + (lookup_template_class): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + Coerce arguments on the momentary obstack. + (for_each_template_parm): Use TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO. + (instantiate_class_template): Calculate template arguments on the + momentary obstack. Tidy. + (tsubst_template_arg_vector): Use make_temp_vec. + (tsubst_aggr_type): Put template arguments on the momentary + obstack. + (tsubst_decl): Likewise. + (tsubst): Copy the array bounds index to the permanent obstack + before building index types. Use new macros. + (unify): Use new macros. + (do_type_instantiation): Likewise. + * search.c (lookup_fnfields_1): Use new macros. + (dfs_pushdecls): Build envelopes on the cache obstack. + (dfs_compress_decls): Use new macros. + (push_class_decls): Build on the cache obstack. + * semantics.c (finish_typeof): Don't set CLASSTYPE_GOT_SEMICOLON. + * sign.c (build_signature_pointer_or_reference_type): Use + SET_IS_AGGR_TYPE. + * tree.c (make_binfo): Check CLASS_TYPE_P. + (copy_template_template_parm): Adjust. + (make_temp_vec): Use push_expression_obstack. + * typeck.c (complete_type): Use new macros. + (comptypes): Likewise. + +1998-11-17 Jason Merrill + + * pt.c (tsubst): Add diagnostics for invalid array, reference + and pointer to member types. + +1998-11-16 Jason Merrill + + * typeck2.c (my_friendly_abort): Don't fatal twice in a row. + + * typeck.c (c_expand_start_case): Use build_expr_type_conversion. + Simplify. + + * parse.y (structsp): Fix cut-and-paste error. + + * init.c (build_new): Complain about non-integral size. + + * parse.y (unary_expr): Complain about defining types in sizeof. + + * typeck.c (expr_sizeof): Complain about sizeof an overloaded fn. + + * rtti.c (build_x_typeid): Complain about typeid without + including . + (get_typeid): Likewise. Complain about typeid of incomplete type. + (get_tinfo_fn_dynamic): Likewise. + (get_typeid_1): Not static anymore. + * except.c (build_eh_type_type): Use get_typeid_1. + + * rtti.c (build_dynamic_cast_1): Give errors for dynamic_cast to + ambiguous or private bases. Fix warning for reference cast. + +1998-11-16 Mark Mitchell + + * cp-tree.h (DECL_TEMPLATE_INSTANTIATED): New macro. + * decl.c (duplicate_decls): Remove special-case code to deal with + template friends, and just do the obvious thing. + * pt.c (register_specialization): Tweak for clarity, and also to + clear DECL_INITIAL for an instantiation before it is merged with a + specialization. + (check_explicit_specialization): Fix indentation. + (tsubst_friend_function): Handle both definitions in friend + declaration and outside friend declarations. + (tsubst_decl): Don't clear DECL_INITIAL for an instantiation. + (regenerate_decl_from_template): Tweak accordingly. + (instantiate_decl): Likewise. + +1998-11-16 Jason Merrill + + * decl.c (cplus_expand_expr_stmt): Promote warning about naked + member function reference to error. + * cvt.c (ocp_convert): Complain about converting an overloaded + function to void. + + * init.c (build_offset_ref): Just return a lone static member + function. + + * decl.c (cp_finish_decl): Only complain about real CONSTRUCTORs, + not internal ones. + + * typeck.c (build_binary_op_nodefault): Improve error handling. + + * decl.c (grokfndecl): Complain about making 'main' a template. + + * typeck.c (string_conv_p): Don't convert from wchar_t[] to char*. + + * call.c (build_method_call): Handle a BIT_NOT_EXPR around a + TYPE_DECL in a template. + +1998-11-15 Jason Merrill + + * typeck2.c (my_friendly_abort): Add URL in the other case, too. + + * decl.c (struct cp_function): Add named_label_uses. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + (define_label): Also complain about jumping into the scope of + non-POD objects that don't have constructors. + * tree.c (pod_type_p): New fn. + + * pt.c (instantiate_class_template): Clear TYPE_BEING_DEFINED sooner. + * rtti.c (synthesize_tinfo_fn): Call import_export_decl here. + (get_tinfo_fn): Not here. + * repo.c (repo_get_id): Abort if we get called for an incomplete + type. + +1998-11-13 Mark Mitchell + + * except.c (expand_throw): Make sure first argument to + __cp_push_exception is of type `void*' to avoid spurious error + messages. + +1998-11-11 Jason Merrill + + * pt.c (try_one_overload): Take orig_targs again. Only check for + mismatches against them; we don't care what a previous call found. + (resolve_overloaded_unification): Adjust. + + * search.c (lookup_field): Don't return anything for a non-type + field from a dependent type. + * decl.c (grokdeclarator): Resolve SCOPE_REFs of the current class + in an array declarator. + (start_decl): Push into the class before looking for the field. + +1998-11-08 Mark Mitchell + + * method.c (build_overload_value): Handle REFERENCE_TYPE. + +1998-11-08 Martin von Löwis + + * decl.c (grokdeclarator): Allow namespace-scoped members if they + are friends. + +1998-11-08 Jason Merrill + + * pt.c (tsubst_decl): Don't mess with the global value of an + un-mangled DECL_ASSEMBLER_NAME. + +1998-11-03 Christopher Faylor + + * decl.c (init_decl_processing): Remove CYGWIN conditional + since CYGWIN is now able to deal with trapping signals. + +Sat Nov 7 15:48:02 1998 Kaveh R. Ghazi + + * cp-tree.h: Don't include gansidecl.h. + * exception.cc: Include gansidecl.h (since we don't include config.h) + * g++spec.c: Don't include gansidecl.h. + +1998-11-06 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Add defined_in_class. Decrease + size of dummy. + (DECL_DEFINED_IN_CLASS_P): New macro. + (TEMPLATE_PARMS_FOR_INLINE): Document. + (check_static_variable_definition): New function. + * decl.c (cp_finish_decl): Set DECL_DEFINED_IN_CLASS_P, if + appropriate. + (check_static_variable_definition): Split out from ... + (grokdeclarator): Here. + * pt.c (check_default_tmpl_args): New function, split out from ... + (push_template_decl_real): Here. + (instantiate_template): Fix comment. + +1998-11-04 Mark Mitchell + + * cp-tree.h (CP_TYPE_CONST_P): Make {0,1}-valued. + (CP_TYPE_VOLATILE_P): Likewise. + (CP_TYPE_RESTRICT_P): Likewise. + +1998-11-03 Mark Mitchell + + * pt.c (tsubst): Use build_index_type, not build_index_2_type. + +1998-11-02 Jason Merrill + + * class.c (instantiate_type): Be more helpful. + + * decl2.c (import_export_decl): Call import_export_class. + + * cp-tree.h (EMPTY_CONSTRUCTOR_P): Check !TREE_HAS_CONSTRUCTOR. + * decl2.c (build_expr_from_tree): Propagate TREE_HAS_CONSTRUCTOR. + * pt.c (tsubst_copy): Likewise. + +1998-11-02 Mark Mitchell + + * init.c (expand_vec_init): Fix off-by-one error. + +1998-11-02 Alexandre Oliva + + * parse.y (apparent_template_type): New type. + (named_complex_class_head_sans_basetype): Use it. + * Makefile.in (CONFLICTS): One new conflict. + * parse.c: Regenerated. + +1998-11-01 Mark Mitchell + + * cp-tree.h (COMPARE_STRICT): New macro. + (COMPARE_BASE): Likewise. + (COMPARE_RELAXED): Likewise. + (COMPARE_REDECLARATION): Likewise. + (same_type_p): Likewise. + (same_or_base_type_p): Likewise. + * call.c (standard_conversion): Use them, in place of comptypes + with numeric arguments. + (reference_binding): Likewise. + (convert_like): Likewise. + (build_over_call): Likewise. + (is_subseq): Likewise. + (is_properly_derived_from): Likewise. + (compare_ics): Likewise. + (joust): Likewise. + * class.c (delete_duplicate_fields_1): Likewise. + (resolves_to_fixed_type_p): Likewise. + (instantiate_type): Likewise. Remove #if 0'd code. + * decl.c (decls_match): Likewise. Use COMPARE_REDECLARATION here. + (pushdecl): Likewise. + (lookup_name_real): Likewise. + (grokdeclarator): Likewise. Check for illegal array declarations. + (grokparms): Likewise. + (grok_op_properties): Likewise. + * decl2.c (check_classfn): Likewise. + * friend.c (is_friend): Likewise. + (make_friend_class): Likewise. + * init.c (expand_aggr_init): Likewise. + (expand_vec_init): Likewise. + * pt.c (is_member_template_class): Remove declaration. + (is_specialization_of): Use COMPARE_* and new macros. + (comp_template_parms): Likewise. + (convert_nontype_argument): Likewise. + (coerce_template_template_parms): Likewise. + (template_args_equal): Likewise. + (lookup_template_class): Likewise. + (type_unification_real): Likewise. + (unify): Likewise. + (get_bindings_real): Likewise. + * search.c (covariant_return_p): Likewise. + (get_matching_virtual): Likewise. + * sig.c (match_method_types): Likewise. + * tree.c (vec_binfo_member): Likewise. + (cp_tree_equal): Likewise. + * typeck.c (common_type): Likewise. + (comp_array_types): Likewise. Get issues involving unknown array + bounds right. + (comptypes): Update comments. Use new flags. + (comp_target_types): Use new macros. + (compparms): Likewise. + (comp_target_parms): Likewise. + (string_conv_p): Likewise. + (build_component_ref): Likewise. + (build_indirect_ref): Likewise. + (build_conditional_expr): Likewise. + (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (build_modify_expr): Likewise. + (convert_for_assignment): Likewise. + (comp_ptr_ttypes_real): Likewise. + (ptr_reasonably_similar): Likewise. + (comp_ptr_ttypes_const): Likewise. + +1998-10-31 Jason Merrill + + * rtti.c (build_dynamic_cast_1): Fix cut-and-paste error. + +1998-10-30 Mark Mitchell + + * decl2.c (delete_sanity): Pass integer_zero_node, not + integer_two_node, to build_vec_delete. + * init.c (build_array_eh_cleanup): Remove. + (expand_vec_init_try_block): New function. + (expand_vec_init_catch_clause): Likewise. + (build_vec_delete_1): Don't deal with case that auto_delete_vec + might be integer_two_node anymore. + (expand_vec_init): Rework for initialization-correctness and + exception-correctness. + * typeck2.c (process_init_constructor): Make mutual exclusivity + of cases more obvious. + +1998-10-29 Jason Merrill + + * decl.c (lookup_name_real): OK, only warn if not lexing. + Simplify suggested fix. + + * cp-tree.h (IDENTIFIER_MARKED): New macro. + * search.c (lookup_conversions): Use breadth_first_search. + (add_conversions): Avoid adding two conversions to the same type. + (breadth_first_search): Work with base binfos, rather + than binfos and base indices. + (get_virtual_destructor): Adjust. + (tree_has_any_destructor_p): Adjust. + (get_matching_virtual): Adjust. + + * pt.c (push_template_decl_real): Generalize check for incorrect + number of template parms. + (is_member_template_class): #if 0. + +1998-10-29 Richard Henderson + + * Makefile.in (cc1plus): Put CXX_OBJS, and thence @extra_cxx_objs@, + last. + +1998-10-28 Zack Weinberg + + * lex.c: Call check_newline from lang_init always. After + calling cpp_start_read, set yy_cur and yy_lim to read from the + cpplib token buffer. + +1998-10-28 Jason Merrill + + * class.c (instantiate_type): Don't consider templates for a normal + match. + + * class.c (finish_struct_1): Don't complain about non-copy + assignment ops in union members. + + * class.c (build_vtable): Don't pass at_eof to import_export_vtable. + (prepare_fresh_vtable): Likewise. + (finish_struct_1): Don't call import_export_class. + * decl2.c (finish_vtable_vardecl): Do import/export stuff. + (finish_prevtable_vardecl): Lose. + (finish_file): Don't call it. + * pt.c (instantiate_class_template): Likewise. + * cp-tree.h: Remove it. + + * init.c (build_delete): Reset TYPE_HAS_DESTRUCTOR here. + * decl.c (finish_function): Not here. + (start_function): Do set DECL_INITIAL. + + * pt.c (push_template_decl_real): Complain about default template + args for enclosing classes. + + * call.c (add_function_candidate): Treat conversion functions + as coming from the argument's class. + * cp-tree.h (DECL_CONV_FN_P): New fn. + (DECL_DESTRUCTOR_P): Also check DECL_LANGUAGE. + * class.c (add_method): Use DECL_CONV_FN_P. + * decl2.c (check_classfn): Likewise. + * error.c (dump_function_name): Likewise. + (dump_function_decl): Likewise. + * pt.c (fn_type_unification): Likewise. + * search.c (add_conversions): Likewise. + +1998-10-27 Jason Merrill + + * lex.c (do_identifier): Also generate LOOKUP_EXPR for RESULT_DECL. + * method.c (hack_identifier): Also check for using RESULT_DECL + from outer context. + +1998-10-27 Mark Mitchell + + * decl.c (grokdeclarator): Use type_quals, rather than constp, + consistently. + +1998-10-27 Jason Merrill + + * call.c (standard_conversion): instantiate_type here. + (reference_binding): And here. + (implicit_conversion): Not here. + (build_op_delete_call): No need to cons up an OVERLOAD. + * cvt.c (cp_convert_to_pointer): instantiate_type here. + (convert_to_reference): And here. + * decl.c (grok_reference_init): Not here. + (grokparms): Or here. + * typeck2.c (digest_init): Or here. + * typeck.c (decay_conversion): Take the address of overloaded + functions, too. + (require_instantiated_type): Lose. + (convert_arguments): Don't handle unknown types here. + (build_c_cast): Likewise. + (build_binary_op): Gut. + (build_conditional_expr): Don't require_instantiated_type. + (build_modify_expr): Likewise. + (build_static_cast): Don't instantiate_type. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + (convert_for_initialization): Likewise. + (build_ptrmemfunc): Use type_unknown_p. + (convert_for_assignment): Also do default_conversion on overloaded + functions. Hand them off to ocp_convert. + +1998-10-26 Mark Mitchell + + * error.c (dump_decl): Deal with TEMPLATE_DECLs that are + VAR_DECLs. Handle vtables whose DECL_CONTEXT is not a type. + + * class.c (finish_struct_1): Use build_cplus_array_type to build + array types. + * decl.c (init_decl_processing): Likewise. + * except.c (expand_end_eh_spec): Likewise. + * search.c (expand_upcast_fixups): Simplify very slightly. + +1998-10-26 Jason Merrill + + * decl.c (grokdeclarator): Complain about a variable using + constructor syntax coming back null from start_decl. + + * friend.c (make_friend_class): Complain about trying to make + a non-class type a friend. + + * decl.c (grokfndecl): Set DECL_INITIAL for a defn here. + (start_function): Not here. + +1998-10-26 Brendan Kehoe + + * decl.c (grokdeclarator): Disallow `explicit' in a friend declaration. + +1998-10-26 Jason Merrill + + * typeck2.c (process_init_constructor): Only skip anonymous fields + if they are bitfields. + + * cp-tree.def (TYPEOF_TYPE): New code. + * error.c (dump_type_real): Handle it. + * pt.c (tsubst): Likewise. + * tree.c (search_tree): Likewise. + * semantics.c (finish_typeof): New fn. + * parse.y (typespec): Use it. + * cp-tree.h: Declare it. + +1998-10-26 Manfred Hollstein + + * cp-tree.h (FORMAT_VBASE_NAME): Make definition unconditional. + +1998-10-26 Jason Merrill + + * typeck.c (convert_arguments): Don't handle pmf references + specially. + + * init.c (build_member_call): Don't try to convert to the base type + if it's ambiguous or pedantic. + + * typeck2.c (check_for_new_type): Only depend on pedantic for + C-style casts. + +1998-10-25 Mark Mitchell + + * decl.c (grokdeclarator): Set DECL_NONCONVERTING_P for all + non-converting constructors. + +1998-10-24 Martin von Löwis + + * gxxint.texi: Correct documentation for n, N, Q, and B. + +1998-10-23 Martin von Löwis + + * parse.y (condition): Convert VAR_DECL from reference to indirect + reference. + +1998-10-23 Andrew MacLeod + + * exception.cc (__cp_pop_exception): Free the original exception + value, not the potentially coerced one. + +1998-10-23 Mark Mitchell + + * Makefile.in (hash.h): Run gperf when necessary. + + * cp-tree.h (CP_TYPE_READONLY): Remove. + (CP_TYPE_VOLATILE): Likewise. + (CP_TYPE_QUALS): New macro. + (CP_TYPE_CONST_P): Likewise. + (CP_TYPE_VOLATILE_P): Likewise. + (CP_TYPE_RESTRICT_P): Likewise. + (CP_TYPE_CONST_NON_VOLATILE_P): Likewise. + (cp_build_type_variant): Rename to ... + (cp_build_qualified_type): New function. + (c_apply_type_quals_to_decl): Declare. + (SIGNATURE_POINTER_NAME_FORMAT): Modify to allow `restrict'. + (SIGNATURE_REFERENCE_NAME_FORMAT): Likewise. + (cp_type_qual_from_rid): New function. + (compparms): Remove unused parameter. All callers changed. + (cp_type_quals): New function. + (at_least_as_qualified_p): Likewise. + (more_qualified_p): Likewise. + + * call.c (standard_conversion): Replace calls to + cp_build_type_variant with cp_build_qualified_type. Use + CP_TYPE_QUALS to get qualifiers and at_least_as_qualified_p to + compare them. Use CP_TYPE_* macros to check qualifiers. + (reference_binding): Likewise. + (implicit_conversion): Likewise. + (add_builtin_candidates): Likewise. + (build_over_call): Likewise. + * class.c (overrides): Compare all qualifiers, not just `const', + on method declarations. + * cvt.c (convert_to_reference): More CP_TYPE_QUALS conversion, etc. + (convert_pointer_to_real): Likewise. + (type_promotes_to): Likewise. + * decl.c (check_for_uninitialized_const_var): New function. + (init_decl_processing): More CP_TYPE_QUALS conversion, etc. + (cp_finish_decl): Use check_for_uninitialized_const_var. + (grokdeclarator): More CP_TYPE_QUALS conversion, etc. Update to + handle `restrict'. + (grok_ctor_properties): Likewise. + (grok_op_properties): Likewise. + (start_function): Likewise. + (rever_static_member_fn): Likewise. + * decl2.c (grok_method_quals): Likewise. + (grokfield): Likewise. + * error.c (dump_readonly_or_volatile): Rename to ... + (dump_qualifiers): New function. Handle `restrict'. + (dump_type_real): Use it. + (dump_aggr_type): Likewise. + (dump_type_prefix): Likewise. + (dump_type_suffix): Likewise. + (dump_function_decl): Likewise. + (cv_as_string): Likewise. + * gxx.gperf: Add __restrict and __restrict__. + * gxxint.texi: Document `u' as used for `__restrict', and a few + other previously undocumented codes. + * hash.h: Regenerated. + * init.c (expand_aggr_init): More CP_TYPE_QUALS conversion, etc. + (build_member_call): Likewise. + (build_new_1): Likewise. + * lex.c (init_parse): Add entry for RID_RESTRICT. + (cons_up_default_function): More CP_TYPE_QUALS conversion, etc. + (cp_type_qual_from_rid): Define. + * lex.h (enum rid): Add RID_RESTRICT. + * method.c (process_modifiers): Deal with `restrict'. + * parse.y (primary): More CP_TYPE_QUALS conversion, etc. + * parse.c: Regenerated. + * pt.c (convert_nontype_argument): More CP_TYPE_QUALS conversion, etc. + (tsubst_aggr_type): Likewise. + (tsubst): Likewise. + (check_cv_quals_for_unify): Likewise. + (unify): Likewise. + * rtti.c (init_rtti_processing): Likewise. + (build_headof): Likewise. + (get_tinfo_var): Likewise. + (buidl_dynamic_cast_1): Likewise. Fix `volatile' handling. + (expand_class_desc): Likewise. + (expand_attr_desc): Likewise. + (synthesize_tinfo_fn): Likewise. + * search.c (covariant_return_p): Likewise. Fix `volatile' handling. + (get_matching_virtual): Likewise. + (expand_upcast_fixups): Likewise. + * sig.c (build_signature_pointer_or_reference_name): Take + type_quals, not constp and volatilep. + (build_signature_pointer_or_reference_type): Likewise. + (match_method_types): More CP_TYPE_QUALS conversion, etc. + (build_signature_pointer_constructor): Likewise. + (build_signature_method_call): Likewise. + * tree.c (build_cplus_array_type): Likewise. + (cp_build_type_variant): Rename to ... + (cp_build_qualified_type): New function. Deal with `__restrict'. + (canonical_type_variant): More CP_TYPE_QUALS conversion, etc. + (build_exception_variant): Likewise. + (mapcar): Likewise. + * typeck.c (qualif_type): Likewise. + (common_type): Likewise. + (comptypes): Likewise. + (comp_cv_target_types): Likewise. + (at_least_as_qualified_p): Define. + (more_qualified_p): Likewise. + (comp_cv_qualification): More CP_TYPE_QUALS conversion, etc. + (compparms): Likewise. + (inline_conversion): Likewise. + (string_conv_p): Likewise. + (build_component_ref): Likewise. + (build_indirect_ref): Likewise. + (build_array_ref): Likewise. + (build_unary_op): Likewise. + (build_conditional_expr): Likewise. + (build_static_cast): Likewise. + (build_c_cast): Likewise. + (build_modify_expr): Likewise. + (convert_For_assignment): Likewise. + (comp_ptr_ttypes_real): Likewise. + (cp_type_quals): New function. + +1998-10-23 Jason Merrill + + * cp-tree.h (CP_TYPE_READONLY): New macro to handle arrays. + (CP_TYPE_VOLATILE): Likewise. + * decl.c (grokdeclarator): Use them. + * tree.c (canonical_type_variant): Likewise. + +1998-10-22 Martin von Löwis + + * parse.y (named_class_head): Push into class while parsing the + base class list. + * decl2.c (push_scope, pop_scope): New functions. + * cp-tree.h: Declare them. + * init.c (build_new_1): Delay cleanup until end of full expression. + +1998-10-21 Jason Merrill + + * typeck.c (build_component_ref): Use of a type here is an error. + +1998-10-19 Jason Merrill + + Revamp references to member functions. + * method.c (hack_identifier): Call build_component_ref for a + reference to a member function. + * typeck.c (build_component_ref): Only return a single function + if it's static. Otherwise, return a COMPONENT_REF. + (build_x_function_call): Handle a COMPONENT_REF. + (build_unary_op): Handle all unknown-type things. + * decl2.c (arg_assoc): Handle COMPONENT_REF. + * class.c (instantiate_type): Complain if the function we get is a + nonstatic member function. Remove code for finding "compatible" + functions. + * pt.c (tsubst_copy): Handle NOP_EXPR. + * tree.c (build_dummy_object): New fn. + (maybe_dummy_object): New fn. + (is_dummy_object): New fn. + * cp-tree.h: Declare them. + * cvt.c (cp_convert_to_pointer): Use maybe_dummy_object. + * error.c (dump_expr, case OFFSET_REF): Use is_dummy_object. + * init.c (build_member_call): Use maybe_dummy_object and + is_dummy_object. + (build_offset_ref): Use maybe_dummy_object. + (resolve_offset_ref): Use is_dummy_object. + * typeck.c (build_x_function_call): Call build_dummy_object. + (unary_complex_lvalue): Call is_dummy_object. + + * typeck.c (build_component_addr): Make sure field is a field. + + * call.c (build_new_op): Delete obsolete code. + + * pt.c (tsubst, TEMPLATE*PARM*): Abort if we don't have any args. + +1998-10-18 Martin von Löwis + + * decl2.c (validate_nonmember_using_decl): Fix using-directives of + std if std is ignored. + +1998-10-18 Jason Merrill + + * decl.c (grokvardecl): Fix thinko. + + * decl.c (grokdeclarator): Embedded attrs bind to the right, + not the left. + + * parse.y (fn.def2): Fix 'attrs' format. + +1998-10-18 Alastair J. Houghton + + * Makefile.in (CONFLICTS): Update. + * parse.y (expr_or_declarator_intern): New rule. + (expr_or_declarator, direct_notype_declarator, primary, + functional_cast): Use it. + (notype_declarator_intern): New rule. + (notype_declarator, complex_notype_declarator): Use it. + +1998-10-17 Jason Merrill + + * decl.c (grokfndecl): Set DECL_CONTEXT to namespace if appropriate. + (grokvardecl): Likewise. + +Sat Oct 17 23:27:20 1998 Kaveh R. Ghazi + + * class.c (make_method_vec): Cast 1st argument of `bzero' to (PTR). + (add_method): Likewise for arguments 1 & 2 of `bcopy'. + + * decl.c (signal_catch): Mark with ATTRIBUTE_NORETURN. + + * pt.c (process_partial_specialization): Cast 1st argument of + `bzero' to (PTR). + + * tree.c (build_base_fields): Cast `base_align' to (int) when + comparing against one. + +1998-10-16 Mark Mitchell + + * decl.c (lookup_name_real): Handle template parameters for member + templates where said parameters have the same name as the + surrounding class. + + * decl.c (expand_static_init): Build cleanups before entering the + anonymous function used to do them to avoid access-checking + confusion. + + * decl.c (grokfndecl): Add back call to cplus_decl_attributes + accidentally removed by previous change, and make DECL_RTL here. + * class.c (add_method): Don't make DECL_RTL here. + + * pt.c (for_each_template_parm): Don't examine uninstantiated + default arguments. + +1998-10-16 Dave Brolley + + * lex.c (real_yylex): Fix unaligned access of wchar_t. + +1998-10-16 Mark Mitchell + + * class.c (add_method): Fix documentation to reflect previous + changes. Check for duplicate method declarations here. + * decl.c (decls_match): Handle FUNCTION_DECL vs TEMPLATE_DECL + correctly; such things never match. + (grokfndecl): Don't look for duplicate methods here. + * decl2.c (check_classfn): Don't assume names are mangled. + Don't add bogus member function declarations to a class before the + class type is complete. + (grokfield): Reformat error message. + * method.c (set_mangled_name_for_decl): Don't mangle names while + processing_template_decl. + +1998-10-16 Jason Merrill + + * typeck.c (build_indirect_ref): Complain about a pointer to data + member, too. + * typeck2.c (build_m_component_ref): Don't indirect a pointer to + data member. + * init.c (resolve_offset_ref): Don't undo the above. + + * cp-tree.h (DECL_C_BIT_FIELD, SET_DECL_C_BIT_FIELD): New macros. + (struct lang_decl_flags): Add `bitfield'. + * class.c (finish_struct_1): Use DECL_C_BIT_FIELD instead of + DECL_BIT_FIELD. + * decl2.c (grokbitfield, grok_alignof): Likewise. + * init.c (build_offset_ref): Likewise. + * typeck.c (build_component_addr, expr_sizeof): Likewise. + * cvt.c (build_up_reference): Don't crash if taking the address + returns error_mark_node. + + * decl.c (grokfndecl): Also check ctype when checking for ::main(). + +1998-10-15 Jason Merrill + + * decl.c (grokfndecl): ::main and __builtin_* get C linkage. + Do mangling here. + (grokdeclarator): Instead of here. + * friend.c (do_friend): Lose special handling of ::main and + __builtin_*. + * cp-tree.h (DECL_MAIN_P): Check for C linkage. + + * spew.c (yylex): Clear looking_for_typename if we got + 'enum { ... };'. + +1998-10-15 Mark Mitchell + + * class.c (maybe_warn_about_overly_private_class): Improve error + messages for class with only private constructors. + + * cp-tree.def (TYPENAME_TYPE): Add to documentation. + * cp-tree.h (TYPENAME_TYPE_FULLNAME): Document. + (build_typename_type): New function. + * decl.c (build_typename_type): Broken out from ... + (make_typename_type): Use it. + * search.c (lookup_field): Likewise. + +1998-10-14 Benjamin Kosnik + + * pt.c (convert_nontype_argument): Check against type_referred_to. + * decl.c (grokvardecl): Check for declarator name before building + DECL_ASSEMBLER_NAME. + +1998-10-14 Mark Mitchell + + * pt.c (lookup_template_class): Add comment. + (instantiate_class_template): Don't mark the _TYPE node for + member class templates as an instantiation. + +1998-10-14 Jason Merrill + + * decl.c (grokfndecl): Fix my thinko. + +1998-10-13 Jason Merrill + + * tinfo2.cc (fast_compare): Remove. + (before): Just use strcmp. + * tinfo.cc (operator==): Just use strcmp. + +1998-10-13 Klaus-Georg Adams + + * decl.c (grokfndecl): Don't check for linkage in `extern "C"' + declarations. + +1998-10-13 Mark Mitchell + + * cp-tree.h (specializations_of_same_template_p): Remove. + * search.c (get_template_base): Don't use it. + (get_template_base_recursive): Likewise. + * pt.c (specializations_of_same_template_p): Remove. + (unify): Don't use it. + (lookup_template_class): Find the correct parent when setting + CLASSTYPE_TI_TEMPLATE. + +1998-10-12 Jason Merrill + + * tinfo.cc (operator==): Always compare names. + +1998-10-12 Herman ten Brugge + + * decl.c (start_function): Fix cut-and-paste error. + +1998-10-12 Jason Merrill + + * inc/typeinfo: Add #pragma interface. + (operator!=): Just call operator==. + * tinfo.cc: Add #pragma implementation. + (operator==): Move from inc/typeinfo and tinfo2.cc. + Check __COMMON_UNRELIABLE instead of _WIN32. + + * typeck2.c (my_friendly_abort): Add URL. + +1998-10-12 Alastair J. Houghton + + * decl.c (start_method): Added extra parameter for attributes. + * cp-tree.h (start_method): Update prototype. + * parse.y (fn.def2): Update start_method parameter list. + +1998-10-11 Mark Mitchell + + * cp-tree.h (specializations_of_same_template_p): Declare. + * pt.c (specializations_of_same_template_p): New function. + (unify): Use it. + * search.c (get_template_base): Use it. + (get_template_base_recursive): Likewise. + +1998-10-10 Manfred Hollstein + + * decl2.c (start_objects): Add new variable `joiner' and + initialize it properly. + +1998-10-09 Mark Mitchell + + * search.c (expand_upcast_fixups): Tweak to match 1998-10-07 + change to vtable types. + + * cvt.c (ocp_convert): Avoid infinite recursion caused by + 1998-10-03 change. + +1998-10-08 Jason Merrill + + * pt.c (resolve_overloaded_unification): New fn. + (try_one_overload): Likewise. + (unify): Don't fail on unknown type. + (type_unification_real): Likewise. Use resolve_overloaded_unification + to handle an overloaded argument. + (template_args_equal): Split out... + (comp_template_args): From here. + (determine_specialization): Also allow a template with more + parms than were explicitly specified. + * cp-tree.h: Add template_args_equal. + * call.c (resolve_args): Remove TEMPLATE_ID_EXPR code. + +Thu Oct 8 15:58:30 1998 Anthony Green + + * semantics.c (finish_asm_stmt): Revert my 1998-09-28 + change. + +Thu Oct 8 06:00:19 1998 Jeffrey A Law (law@cygnus.com) + + * typeck.c (unsigned_type): Only return TItype nodes when + HOST_BITS_PER_WIDE_INT is >= 64 bits. + (signed_type): Likewise. + * decl.c (intTI_type_node, unsigned_intTI_type_node): Only declare + when HOST_BITS_PER_WIDE_INT is >= 64 bits. + (init_decl_processing): Only create TItype nodes when + HOST_BITS_PER_WIDE_INT is >= 64 bits. + * cp-tree.h (intTI_type_node, unsigned_intTI_type_node): Only declare + when HOST_BITS_PER_WIDE_INT is >= 64 bits. + +Wed Oct 7 12:32:44 1998 Kaveh R. Ghazi + + * Makefile.in (hash.h): Add -L KR-C -F ', 0, 0' flags to gperf. + (gxx.gperf): Update comments describing invocation flags. + (hash.h): Regenerate using gperf 2.7.1 (19981006 egcs). + +1998-10-07 Mark Mitchell + + * class.c (finish_struct_1): Add commentary on previous change. + + * cp-tree.h (vtbl_ptr_type_node): New variable. + * class.c (build_vtbl_ref): Don't indirect through the vptr; it's + already of the right type. + (finish_struct_1): Make the vptr be of type vtbl_ptr_type_node. + Simplify code to grow vtable. + * decl.c (vtbl_ptr_type_node): Define. + (init_decl_processing): Initialize it. + +1998-10-06 Mark Mitchell + + * cp-tree.def (PTRMEM_CST): New tree node. + * cp-tree.h (ptrmem_cst): New type. + (lang_type): Remove local_typedecls. + (dummy): Increase to 12 bits from 11. + (CLASSTYPE_LOCAL_TYPEDECLS): Remove. + (PTRMEM_CST_CLASS): New macro. + (PTRMEM_CST_MEMBER): Likewise. + (current_access_specifier): New variable. + (current_class_type): Remove duplicate declaration. + (finish_struct): Change prototype. + (unreverse_member_declarations): New function. + (pushdecl_class_level): Change prototype. + (grok_enum_decls): Remove. + (fixup_anonymous_union): New function. + (grok_x_components): Change prototype. + (tsubst_chain): Remove. + (finish_member_template_decl): Likewise. + (check_explicit_specialization): Fix indentation. + (finish_class_definition): Change prototype. + (finish_member_class_template): Likewise. + (finish_member_declaration): New function. + (check_multiple_declarators): Likewise. + * class.c (class_stack_node_t): New type. + (current_class_base): Remove. + (current_class_stack): Change type. + (current_access_specifier): New variable. + (grow_method): Remove. + (check_member_decl_is_same_in_complete_scope): Break out from + finish_struct. + (make_method_vec): New function. + (free_method_vec): Likewise. + (add_implicitly_declared_members): Break out from finish_struct_1. + (free_method_vecs): New variable. + (add_method): Rework for direct use from parser. + (handle_using_decl): Watch for NULL_TREE while iterating through + CLASSTYPE_METHOD_VEC. + (finish_struct_methods): Don't build CLASSTYPE_METHOD_VEC here; + just do some error-checking. + (warn_hidden): Change iteration through CLASSTYPE_METHOD_VEC. + (finish_struct_1): Simplify. Use add_implicitly_declared_members. + (finish_struct): Change prototype. Simplify; fields and methods + are already set up at this point. + (init_class_processing): Set up current_class_stack. + (pushclass): Save current_access_specifier. + (popclass): Restore it. + (currently_open_class): Simplify. + (build_self_reference): Remove use of CLASSTYPE_LOCAL_TYPEDECLS. + * decl.c (saved_scope): Add access_specifier. + (maybe_push_to_top_level): Save it. + (pop_from_top_level): Restore it. + (maybe_process_template_type_declaration): Use + finish_member_declaration. + (pushtag): Likewise. + (pushdecl_class_level): Don't return a value. + (fixup_anonymous_union): Break out from grok_x_components. + (shadow_tag): Use it. + (xref_tag): Complain about using an elaborated type specifier to + reference a template type parameter or typedef name. + (xref_basetypes): Don't set CLASSTYPE_LOCAL_TYPEDECLS. + (current_local_enum): Remove. + (build_enumerator): Call finish_member_declaration. + (grok_enum_decls): Remove. + * decl2.c (grok_x_components): Simplify. + (check_classfn): Change iteration through CLASSTYPE_METHOD_VEC. + (grokfield): Don't set CLASSTYPE_LOCAL_TYPEDECLS. + (merge_functions): Add to comment. + (arg_assoc_type): Prototype. + (arg_assoc): Pass as many arguments as there are parameters. + * error.c (dump_expr): Handle PTRMEM_CST. Improve handling of + OFFSET_REF. + * expr.c (cpls_expand_expr): Remove dead code. Handle + PTRMEM_CST. + * friend.c (do_friend): Lookup friends when in nested classes. + Change comments. + * init.c (build_offset_ref): Do lookup even for classes that are + only partially defined. + (decl_constant_value): Remove dead code. + * method.c (build_overload_value): Remove hack where by TYPE was + not a TYPE. Handle PTRMEM_CST. + (build_template_parm_names): Don't pass a PARM_DECL where a TYPE + should go. + * parse.y (components, notype_components, component_decl, + component_decl_1, component_declarator, component_declarator0): + Now all are itype rather than ttype. Rework to add members to + classes on the fly. + (typesqpecqual_reserved): Use check_multiple_declarators. + (structsp): Update class to finish_class_definition. + (do_xref_defn): Unsplit into named_class_head. + (access_specifier): Set current_access_specifier. + * pt.c (set_current_access_from_decl): New function. + (finish_member_template_decl): Don't take the parameters. + (comp_template_args): Make more robust. + (lookup_template_class): Don't use current_local_enum. + (for_each_template_parm): Handle PTRMEM_CST. + (instantiate_class_template): Use set_current_access_from_decl, + finish_member_declaration and unreverse_member_declarations. Set + lineno/input_filename before generating implicit member functions. + (type_unification_real): Don't assume back-unification happens + only for the last argument. + (regenerate_decl_from_template): Call pushclass a bit earlier. + (tsubst_chain): Remove. + (tsubst_enum): Use set_current_access_from_decl. + (set_mangled_name_for_template_decl): Fix indentation. + * search.c (lookup_fnfields_1): Change iteration through + CLASSTYPE_METHOD_VEC. + (dfs_pushdecls): Likewise. + (dfs_compress_decls): Likewise. + (add_conversions): Likewise. + * semantics.c (finish_class_definition): Don't take components. + Change call to finish_struct. + (finish_member_declaration): New function. + (finish_member_class_template): Don't take template parameters. + Change call to grok_x_components. Call finish_member_template_decl. + (check_multiple_declarators): New function. + * sig.c (append_signature_fields): Work from the TYPE_METHODS, not + a passed in fieldlist. + * tree.c (search_tree): Handle PTRMEM_CST. + (mapcar): Likewise. + * typeck.c (unary_complex_lvalue): Build PTRMEM_CSTs, not + INTEGER_CSTs, for pointer-to-data members. + + * call.c (resolve_args): Resolve template specializations, if + possible. + +Tue Oct 6 07:57:26 1998 Kaveh R. Ghazi + + * Makefile.in (spew.o): Depend on toplev.h. + + * call.c (compare_ics): Initialize variables `deref_from_type2', + `deref_to_type1' and `deref_to_type2'. + + * except.c (get_eh_type): Hide prototype and definition. + (process_start_catch_block_old): Remove unused static prototype. + + * pt.c (tsubst_decl): Initialize variable `argvec'. + + * spew.c: Include toplev.h. + +1998-10-05 Jason Merrill + + * pt.c (instantiate_decl): Do save and restore file position. + +1998-10-05 Martin von Löwis + + * method.c (build_decl_overload_real): Clear + numeric_output_need_bar after __. + +1998-10-05 Nathan Sidwell + + * call.c (build_new_method_call): Issue 'incomplete type' error, + if class is not defined. + +1998-10-05 Kaveh R. Ghazi + + * call.c (build_object_call): Move declaration of variable + `fn' into the scope where it is used. Don't access variable + `fn' when it is uninitialized, instead use `fns'. + +1998-10-04 Theodore Papadopoulo + + * errfn.c (cp_thing): Print buf as a string not as a printf format + to avoid problems with the operator%. Consequently, `%%' sequences + in format are copied as `%' in buf. + +1998-10-04 Jason Merrill + + * pt.c (pop_tinst_level): Call extract_interface_info. + (instantiate_decl): Don't save and restore file position. + + * decl.c (cp_finish_decl): Make statics in extern inlines and + templates common, if possible and the target doesn't support weak + symbols. + + * decl.c (grokdeclarator): Remove redundant calls to + build_type_variant and some duplicated code. + * sig.c (build_signature_reference_type): Only take the type parm. + (build_signature_pointer_type): Likewise. + * tree.c (build_cplus_method_type): Adjust. + * cp-tree.h: Update. + +1998-10-04 Mark Mitchell + + * call.c (build_over_call): Make pedwarns about dropped qualifiers + into full-fledged errors. + * cvt.c (convert_to_reference): Likewise. + * typeck.c (convert_for_assignment): Likewise. + + * search.c (expand_upcast_vtables): In addition to unsetting + TREE_READONLY, remove top-level const type qualifier. + +1998-10-03 Mark Mitchell + + * class.c (current_class_ptr, current_class_ref): Clarify + documentation. + * cvt.c (ocp_convert): Don't expect fold to remove all trivial + NOP type conversions. + * decl.c (decls_match): Use comptypes directly; ignore + qualifiers on the DECL. + (duplicate_decls): Remove qualifier checks on DECL. + (grokdeclarator): Make the type built up include top-level + qualifiers. + * decl2.c (do_dtors): Fix spelling error. + * error.c (dump_simple_decl): Don't look at qualifiers on the decl + when printing type information. + * init.c (build_new_1): Add documentation. Deal with the fact + that type of allocated memory now contains qualifiers. + * lex.c (is_global): Improve error-recovery. + * sig.c (build_member_function_pointer): Don't cast away const + on fields of sigtable_entry_type. + * tree.c (lvalue_type): Don't look at top-level qualifiers on + expressions. + * typeck.c (decay_conversion): Likewise. + (build_component_ref): Make sure the type of the COMPONENT_REF + contains top-level qualifiers, as appropriate. Improve + error-handling. + (build_indirect_ref): Simplify. Don't strip top-level qualifiers. + (build_array_ref): Likewise. + (build_unary_op): Improve error-recovery. + (unary_complex_lvalue): Make taking the address a bound member + function an error, not a sorry. + (build_conditional_expr): Look at the type qualifiers, not the + qualifiers on the expression itself. + +1998-10-03 Jason Merrill + + * decl2.c (merge_functions): Remove duplicates. + + * decl2.c: Add -f{no-,}implicit-inline-templates. + (import_export_decl): Check it. + + * decl.c (lookup_name_real): Template parms also take precedence + over implicit typename. Only warn if yylex. + + * typeck.c (build_conditional_expr): Only fold if ifexp is an + INTEGER_CST. + + * decl2.c (finish_vtable_vardecl): Check DECL_INTERFACE_KNOWN + instead of linkage. + +1998-10-01 Jason Merrill + + * cp-tree.h (FORMAT_VBASE_NAME): New macro. + * class.c (build_vbase_pointer): Use it. + * rtti.c (expand_class_desc): Likewise. + * tree.c (build_vbase_pointer_fields): Likewise. + +Thu Oct 1 10:43:45 1998 Nick Clifton + + * decl.c (start_decl): Add invocation of + SET_DEFAULT_DECL_ATTRIBUTES, if defined. + (start_function): Add invocation of + SET_DEFAULT_DECL_ATTRIBUTES, if defined. + + * lex.c: Replace occurrences of HANDLE_SYSV_PRAGMA with + HANDLE_GENERIC_PRAGMAS. + +1998-09-28 Anthony Green + + * semantics.c (finish_asm_stmt): Always permit volatile asms. + +1998-09-28 Mark Mitchell + + * decl.c (grokdeclarator): Tighten checks for invalid + destructors. Improve error-messages and error-recovery. + * decl2.c (check_classfn): Don't assume that mangled destructor + names contain type information. + +1998-09-25 Jason Merrill + + * search.c (get_base_distance): Remove assert. + + * decl2.c (build_anon_union_vars): Don't process a field with no + name. + (finish_anon_union): Also complain about local anon unions with no + members. + +1998-09-25 Martin von Löwis + + * decl.c (lookup_namespace_name): If the name is a namespace, + return it immediately. + +Fri Sep 25 11:45:38 1998 Kaveh R. Ghazi + + * cp-tree.h (define_case_label): Remove unused parameter. + (check_java_method): Likewise. + (grokclassfn): Likewise. + (expand_aggr_init): Likewise. + (build_x_delete): Likewise. + (maybe_end_member_template_processing): Likewise. + (unshare_base_binfos): Add prototype. + (string_conv_p): Likewise. + (my_friendly_abort): Mark with ATTRIBUTE_NORETURN. + + * cvt.c (build_up_reference): Remove unused parameter + `checkconst', all callers changed. + (build_type_conversion): Mark parameter `code' with + ATTRIBUTE_UNUSED. + (build_expr_type_conversion): Initialize variable `conv'. + + * decl.c (push_namespace): Initialize variable `d'. + (define_case_label): Remove unused parameter `decl', all callers + changed. + + * decl2.c (lang_decode_option): If !USE_CPPLIB, mark parameter + `argc' with ATTRIBUTE_UNUSED. + (grokclassfn): Remove unused parameter `cname', all callers + changed. + (check_java_method): Likewise for parameter `ctype'. + (copy_assignment_arg_p): Mark parameter `virtualp' with + ATTRIBUTE_UNUSED. + (finish_prevtable_vardecl): Likewise for parameter `prev'. + + * expr.c (extract_init): Likewise for parameters `decl' and `init'. + + * init.c (expand_aggr_init_1): Remove unused parameter + `alias_this', all callers changed. + (expand_aggr_init): Likewise. + (expand_default_init): Likewise. + (build_new_1): Initialize variable `susp'. + (build_x_delete): Remove unused parameter `type', all callers + changed. + + * lex.c (set_typedecl_interface_info): Mark parameter `prev' with + ATTRIBUTE_UNUSED. + (readescape): Use (unsigned) value in shift. + (real_yylex): Likewise. Likewise. Also cast `sizeof' to int when + comparing to a signed quantity. + + * pt.c (maybe_end_member_template_processing): Remove unused + parameter `decl', all callers changed. + (check_explicit_specialization): Add braces around empty body in + an else-statement. + (current_template_args): Initialize variable `args'. + (lookup_template_class): Likewise for variable `prev_local_enum'. + (tsubst_decl): Likewise for variable `r'. + (set_mangled_name_for_template_decl): Initialize variable + `context'. + + * spew.c (scan_tokens): Change type of parameter `n' to unsigned. + Likewise for variable `i'. + (yylex): Initialize variable `trrr'. + + * typeck.c (compparms): Mark variable `strict' with + ATTRIBUTE_UNUSED. + + * xref.c (simplify_type): Cast argument of ctype function to + `unsigned char'. + +1998-09-24 Mark Mitchell + + * cp-tree.h (language_lvalue_valid): Remove. + * decl.c (grokdeclarator): Don't disallow references to functions. + * tree.c (lvalue_p_1): New function, combining duplicated + code from ... + (lvalue_p): Use it. + (real_lvalue_p): Likewise. + * typeck.c (language_lvalue_valid): Remove. + (build_modify_expr): Treat FUNCTION_TYPEs as readonly, even though + they don't have TREE_READONLY set. + * typeck2.c (readonly_error): Add case for FUNCTION_DECLs. + +1998-09-24 Benjamin Kosnik + + * spew.c (yylex): Give diagnostic. + * hash.h (is_reserved_word): Add export. + * gxx.gperf: Likewise. + * lex.h (rid): Add RID_EXPORT. + * lex.c (init_parse): Likewise. + +Tue Sep 22 21:01:19 1998 Gerald Pfeifer + + * friend.c (do_friend): Make warning a full sentence. + +1998-09-22 Mark Mitchell + + * parse.y (component_decl_list): Improve error-recovery. + +1998-09-22 Benjamin Kosnik + + * decl.c (make_typename_type): Move error to point where name + variable can be used by dump_type. + +1998-09-22 Mark Mitchell + + * decl.c (grokfndecl): Improve error-recovery. + * decl2.c (grokfield): Likewise. + * pt.c (finish_member_template_decl): Likewise. + +1998-09-20 Martin von Löwis + + * method.c (hack_identifier): Finding multiple members is always + an error. + +1998-09-21 Per Bothner + + * Make-lang.in (c++-filt): Link libiberty.a after cxxmain.o. + +Mon Sep 21 01:53:05 1998 Felix Lee + + * lex.c (init_lex): Use getenv ("LANG"), not GET_ENVIRONMENT (). + +1998-09-20 Mark Mitchell + + * class.c (maybe_warn_about_overly_private_class): Reformat. + +1998-09-17 Andrew MacLeod + + * exception.cc (__cplus_type_matcher): Realign some code. + +1998-09-16 Mark Mitchell + + * Make-lang.in (tinfo.o): Use CXXFLAGS when compiling. + (tinfo2.o): Likewise. + (exception.o): Likewise. + (new.o): Likewise. + (opnew.o): Likewise. + (opnewnt.o): Likewise. + (opvnew.o): Likewise. + (opvnewnt.o): Likewise. + (opdel.o): Likewise. + (opdelnt.o): Likewise. + (opvdel.o): Likewise. + (opvdelnt.o): Likewise. + +1998-09-16 Richard Henderson + + * decl.c (init_decl_processing): Kill __builtin_fp and __builtin_sp. + +1998-09-15 Alexandre Oliva + + * call.c (build_field_call): Handle static data members too. + + * typeck.c (comptypes): When comparing pointer types, check + whether referred types match even in strictest modes. + +1998-09-15 Mark Mitchell + + * cp-tree.h: Revert previous change. + (finish_struct_methods): Remove declaration. + * class.c: Revert previous change. + (maybe_warn_about_overly_private_class): New function. + (finish_struct_methods): Declare here, and make static. Remove + unnecessary parameters. Tidy slightly. Use + maybe_warn_about_overly_private_class. + (finish_struct_1): Adjust. Remove check for private constructors, + now done elsewhere. + (finish_struct): Adjust. + +1998-09-15 Andrew MacLeod + + * except.c (expand_start_catch_block): No need to check for new + exception model. + (process_start_catch_block_old): Deleted. + (process_start_catch_block): Add call to start_decl_1(). + (expand_end_catch_block): Add call to end_catch_handler(). + * exception.cc (__cplus_type_matcher): Only check the exception + language if there is an exception table. + +1998-09-15 Andrew MacLeod + + * search.c (expand_indirect_vtbls_init): Mark temporary stack slots + as used to prevent conflicts with virtual function tables. + +1998-09-14 Mark Mitchell + + * cp-tree.h (lang_type): Add has_non_private_static_mem_fn. + (CLASSTYPE_HAS_NON_PRIVATE_STATIC_MEM_FN): New macro, to access it. + * class.c (maybe_class_too_private_p): New function. + (finish_struct_methods): Use it. + (finish_struct_1): Likewise. + (finish_struct): Set CLASSTYPE_HAS_NON_PRIVATE_STATIC_MEM_FN if + appropriate. + + * pt.c (check_specialization_scope): Fix spelling error. + (check_explicit_specialization): Remove code to handle explicit + specializations in class scope; they are now correctly diagnosed + as errors. + +1998-09-10 Mark Mitchell + + * decl.c (pushdecl): Don't copy types if the + DECL_ABSTRACT_ORIGIN of the new decl matches the TYPE_NAME of the + type. + +1998-09-09 Kriang Lerdsuwanakij + + * class.c (get_enclosing_class): New function. + (is_base_of_enclosing_class): Likewise. + * cp-tree.h (get_enclosing_class): Declare. + (is_base_of_enclosing_class): Likewise. + * pt.c (coerce_template_parms): Use them. + +1998-09-09 Jason Merrill + + * g++spec.c (lang_specific_driver): Check whether MATH_LIBRARY is + null to decide whether to use it. + + * error.c (dump_type_real): Handle NAMESPACE_DECL. + * parse.y (base_class.1): Avoid crash on error. + +1998-09-08 Martin von Löwis + + * decl.c (make_typename_type): If context is a namespace, the code + is in error. + +1998-09-08 Mumit Khan + + * parse.y (nomods_initdcl0): Set up the parser stack correctly. + +1998-09-08 Mark Mitchell + + * cp-tree.h (anonymous_namespace_name): Declare. + * decl.c: Define it. + (push_namespace): Use anonymous_namespace_name, rather than local + static anon_name. + * error.c (dump_decl): If a namespace is named + anonymous_namespace_name, call it {anonymous}. + + * decl.c (grokparms): Distinguish between references and pointers + in error message. + +1998-09-08 Richard Henderson + Mark Mitchell + + * pt.c (process_partial_specialization): Consistently allocate + and zero tpd.parms based on ntparms. Use tpd2.parms, not + tpd.parms, where appropriate. + +Sun Sep 6 00:00:51 1998 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (INCLUDES): Update after recent toplevel gcc + reorganizations. + +1998-09-05 Mark Mitchell + + * cp-tree.h (TI_PENDING_SPECIALIZATION_FLAG): Remove. + * class.c (finish_struct): Remove hackery to deal with explicit + specializations in class scope. + * decl.c (grokfndecl): Improve error-recovery. + * decl2.c (grokfield): Likewise. + * pt.c (check_specialization_scope): New function. + (begin_specialization): Call it. + (process_partial_specialization): New function, split out from + push_template_decl. Check partial specializations more + stringently. + (push_template_decl): Call it. + (check_explicit_specialization): Don't attempt to handle explicit + specializations in class scope. + (template_parm_data): Document. Add current_arg and + arg_uses_template_parms. + (mark_template_parm): Set it. + (tsubst_arg_types): Remove unused variable. + * semantics.c (begin_class_definition): Tweak. + +1998-09-04 Mark Mitchell + + * inc/typeinfo (type_info::type_info(const char*)): Make + `explicit'. + + * cp-tree.h (hash_tree_cons_simple): New macro. + * pt.c (tsubst_arg_types): New function. Use hash_tree_cons. + (coerce_template_parms): Use make_temp_vec, instead of + make_tree_vec. Document this behavior. + (lookup_template_class): Likewise. + (tsubst, cases METHOD_TYPE, FUNCTION_TYPE): Use tsubst_arg_types. + Remove dead code (and add assertion to check its deadness). Fix + bug w.r.t. exception specifications. + +1998-09-03 Jason Merrill + + * decl2.c (import_export_vtable): Always make artificials comdat. + (import_export_decl): Likewise. + * pt.c (mark_decl_instantiated): Likewise. + +1998-09-03 Mark Mitchell + + * cp-tree.h (finish_globally_qualified_member_call_expr): + Rename to ... + (finish_qualified_call_expr). + * semantics.c: Likewise. + * parse.y (primary): Use it. + * method.c (hack_identifier): Remove redundant code. + + * init.c (resolve_offset_ref): Call convert_from_reference to + handle members of reference type. Improve error recovery. + +1998-09-03 Benjamin Kosnik + + * cp-tree.h: Declare warn_nontemplate_friend. + * decl2.c (lang_decode_option): Set. + * lang-options.h: Add -Wnon-template-friend. + * friend.c (do_friend): Use to toggle non-template function warning. + +1998-09-03 Mark Mitchell + + * decl.c (finish_enum): Don't resolve CONST_DECLs to their + corresponding INTEGER_CSTs when processing_template_decl. + * pt.c (tsubst_enum): Tweak accordingly. + +1998-09-03 Benjamin Kosnik + + * decl.c (pushdecl_class_level): Add warning here. + (pushdecl): Tweak. + +1998-09-02 Jason Merrill + + * cvt.c (convert_pointer_to_real): Tidy. + * search.c (get_base_distance_recursive): Simplify. + (get_base_distance): Likewise. + + * pt.c (unify): Only special-case INTEGER_TYPE if it uses template + parms. + +Wed Sep 02 09:25:29 1998 Nick Clifton + + * lex.c (check_newline): Call HANDLE_PRAGMA before + HANDLE_SYSV_PRAGMA if both are defined. Generate warning messages + if unknown pragmas are encountered. + (handle_sysv_pragma): Interpret return code from + handle_pragma_token (). Return success/failure indication rather + than next unprocessed character. + (pragma_getc): New function: retrieves characters from the + input stream. Defined when HANDLE_PRAGMA is defined. + (pragma_ungetc): New function: replaces characters back into the + input stream. Defined when HANDLE_PRAGMA is defined. + +1998-09-01 Jason Merrill + + * decl2.c (output_vtable_inherit): Use %cDIGIT in the operands. + * class.c (build_vtable_entry_ref): Likewise. + +1998-09-01 Mark Mitchell + + * cp-tree.h (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION): New macro. + * decl2.c (import_export_decl): Likewise. + * pt.c (instantiate_decl): Use it. + +1998-09-01 Jason Merrill + + * decl.c (lookup_name_real): Also do implicit typename thing for + artificial TYPE_DECLs. + * search.c (lookup_field): Likewise. + (lookup_fnfields, lookup_field): Adjust for implicit typename kludge. + * semantics.c (begin_constructor_declarator): Use enter_scope_of. + (enter_scope_of): Extract type from implicit typename. + (begin_class_definition): Likewise. + * lex.c (identifier_type): Handle implicit typename when checking + for SELFNAME. + + * cp-tree.h: Declare flag_strict_prototype. + * lex.c (do_scoped_id, do_identifier): Don't implicitly_declare if + -fstrict-prototype. + * decl.c (init_decl_processing): If -f{no,-}strict-prototype wasn't + specified, set it to the value of pedantic. + +1998-09-01 Mark Mitchell + + * decl2.c (arg_assoc): Handle template-id expressions as arguments. + +1998-08-31 Mark Mitchell + + * decl.c (finish_enum): Handle member enums of classes declared in + template functions. + + * decl2.c (grok_x_components): Strip attributes before calling + groktypename. + +1998-08-31 Jason Merrill + + * cp-tree.h, decl2.c: Remove support for -fall-virtual, + -fenum-int-equivalence and -fno-nonnull-objects. + * class.c (check_for_override): Remove support for -fall-virtual. + (finish_struct_1): Likewise. + * call.c (build_new_op): Remove support for -fenum-int-equivalence. + * typeck.c (build_binary_op_nodefault): Likewise. + * cvt.c (ocp_convert): Likewise. + * call.c (build_vfield_ref): Remove support for -fno-nonnull-objects. + * class.c (build_vbase_path): Likewise. + +Sun Aug 30 22:16:31 1998 H.J. Lu (hjl@gnu.org) + + * Makefile.in (INTERFACE): New, set to 1. + +1998-08-30 Mark Mitchell + + * error.c (dump_decl): Use CP_DECL_CONTEXT, not DECL_CONTEXT, when + comparing with global_namespace. + (dump_aggr_type): Likewise. + + * decl.c (grokfndecl): Issue error on declaration of friend + templates with explicit template arguments. + + * pt.c (convert_template_argument): New function, split out + from... + (coerce_template_parms): Here. + (tsubst): Attempt better error-recovery. + +1998-08-28 Benjamin Kosnik + + * pt.c (decl_template_parm_p): Add checks for + TEMPLATE_TEMPLATE_PARM. + +1998-08-28 Mark Mitchell + + * lex.c (do_identifier): Fix thinko in previous change. + +1998-08-28 Jason Merrill + + * search.c (dfs_search, binfo_for_vtable, dfs_bfv_helper): New fns. + * decl2.c (output_vtable_inherit): Call binfo_for_vtable. + +1998-08-28 Richard Henderson + + Add support for discarding unused virtual functions. + * lang-options.h: Add -fvtable-gc. + * cp-tree.h: Add flag_vtable_gc. + * decl2.c (output_vtable_inherit): New fn. + (finish_vtable_vardecl): Call it. + * class.c (build_vtable_entry_ref): New fn. + (build_vtbl_ref): Call it. + +1998-08-28 Mark Mitchell + + * cp-tree.h (build_enumerator): Take the enumeration type as a + parameter. + * decl.c (finish_enum): Don't set the TREE_TYPE for the + enumeration constant values if we're processing_template_decls. + Don't set the type for the CONST_DECLs either; that's done in + build_enumerator. + (build_enumerator): Take the enumeration type as a + parameter. + * lex.c (do_identifier): Don't resolve enumeration constants while + processing template declarations, even if they happen to be + TEMPLATE_PARM_INDEXs. + + * parse.y (current_enum_type): New variable. + (primary): Don't allow statement-expression in local classes just + as we don't in global classes. + (structsp): Use current_enum_type. + (enum_list): Likewise. + * pt.c (tsubst_enum): Don't check for NOP_EXPRs introduced by + finish_enum; they no longer occur. + + * cp-tree.h (finish_base_specifier): New function. + * parse.y (base_class): Use it. + * semantics.c (finish_base_specifier): Define it. + + * parse.y (structsp): Warn on use of typename outside of template + declarations. + +1998-08-27 Jason Merrill + + * lex.c (handle_cp_pragma): Remove #pragma vtable. + * lang-options.h: Remove +e options. + * decl2.c (lang_decode_option): Likewise. + (import_export_vtable): Don't check write_virtuals. + (finish_vtable_vardecl, finish_file): Likewise. + * search.c (dfs_debug_mark): Likewise. + * semantics.c (begin_class_definition): Likewise. + * class.c (build_vtable, finish_vtbls, finish_struct_1): Likewise. + + * call.c (build_over_call): Check flag_elide_constructors. + * decl2.c: flag_elide_constructors defaults to 1. + * typeck.c (convert_arguments): Remove return_loc parm. + (build_function_call_real): Adjust. + + * search.c: Tear out all mi_matrix and memoize code. + (lookup_field, lookup_fnfields): Use scratch_tree_cons. + * lang-options.h: Remove documentation for -fhandle-exceptions, + -fmemoize-lookups and -fsave-memoized. + * cp-tree.h: Lose mi_matrix and memoize support. + * decl2.c: Ignore -fmemoize-lookups and -fsave-memoized. + * class.c: Lose struct class_level. + (pushclass, popclass): Lose memoize support. + * init.c (build_offset_ref): Likewise. + + Never change BINFO_INHERITANCE_CHAIN. + * init.c (emit_base_init): Change modification of + BINFO_INHERITANCE_CHAIN to an assert. + * search.c (get_base_distance_recursive): Likewise. + (get_base_distance): Likewise. + (lookup_member): Likewise. + (convert_pointer_to_single_level): Likewise. + (lookup_field): Likewise. Lose setting TREE_VIA_* on TREE_LISTs. + (lookup_fnfields): Likewise. + * tree.c (propagate_binfo_offsets): Don't call unshare_base_binfos. + (unshare_base_binfos): Don't call propagate_binfo_offsets. + (layout_basetypes): Call propagate_binfo_offsets instead of + unshare_base_binfos. + * decl.c (xref_basetypes): Call unshare_base_binfos. + * pt.c (instantiate_class_template): Likewise. + * tree.c (reverse_path): Remove 'copy' parm; always make a + temporary copy. + * class.c (build_vbase_path): Just call it. + * search.c (compute_access): Likewise. Don't re-reverse. + +1998-08-27 Mark Mitchell + + * class.c (build_vbase_path): Use reverse_path. + (finish_base_struct): Move warnings for inaccessible bases to + layout_basetypes. + (modify_one_vtable): Remove check of TREE_USED (binfo). + (fixup_vtable_deltas1): Likewise. + * cp-tree.h (BINFO_INHERITANCE_CHAIN): Document here. + (xref_tag): Remove binfos parameter. + (make_binfo): Remove chain parameter. + (reverse_path): Add copy parameter. + * decl.c (init_decl_processing): Change calls to xref_tag. + (xref_tag): Remove binfos parameter. + (xref_basetypes): Change calls to make_binfo. + * decl2.c (grok_x_components): Change calls to xref_tag. + (handle_class_head): Likewise. + * friend.c (do_friend): Likewise. + * lex.c (make_lang_type): Change calls to make_binfo. + * parse.y (structsp): Change calls to xref_tag. + (named_complex_class_head_sans_basetype): Likewise. + (named_class_head): Likewise. + * rtti.c (init_rtti_processing): Likewise. + * search.c (compute_access): Change calls to reverse_path. + (dfs_get_vbase_types): Change calls to make_binfo. + (get_vbase_types): Remove dead code. + * tree.c (unshare_base_binfos): Change calls to make_binfo. + (layout_basetypes): Warn here about inaccessible bases. + (make_binfo): Remove chain parameter. + (reverse_path): Add copy parameter. + +1998-08-27 Jason Merrill + + * class.c: #if 0 complete_type_p. + * init.c (build_java_class_ref, build_new_1): Remove unused locals. + * method.c (process_overload_item): Likewise. + * typeck.c (comp_target_types): Likewise. + + Stop sharing binfos for indirect virtual bases. + * tree.c (propagate_binfo_offsets): Unshare vbases, too. + (layout_basetypes): Likewise. + (unshare_base_binfos): Copy vbases, too. + * cp-tree.h (BINFO_VIA_PUBLIC, BINFO_BASEINIT_MARKED, + BINFO_VBASE_INIT_MARKED): Remove obsolete macros. + (BINFO_PUSHDECLS_MARKED, SET_BINFO_PUSHDECLS_MARKED, + CLEAR_BINFO_PUSHDECLS_MARKED): New macros. + * search.c (lookup_field, lookup_fnfields, lookup_member): Remove + reference to BINFO_VIA_PUBLIC. + (marked_pushdecls_p, unmarked_pushdecls_p): New fns. + (push_class_decls): Use them. + (dfs_pushdecls): Use SET_BINFO_PUSHDECLS_MARKED. + (dfs_compress_decls): Use CLEAR_BINFO_PUSHDECLS_MARKED. + +1998-08-27 Mark Mitchell + + * decl.c (build_enumerator): Set DECL_CONTEXT for the + CONST_DECLs. + +1998-08-26 Mark Mitchell + + * cp-tree.h (finish_enum): Change prototype. + * decl.c (finish_enum): Use TYPE_VALUES, rather than taking a + VALUES parameter. Don't try to compute mins/maxs if + processing_template_decl. + * parse.y (structsp): Use new calling sequence for finish_enum. + * pt.c (tsubst_enum): Likewise. Take the new type as input. + (lookup_template_class): Remove unused variables. Tweak. + Register enums on instantiation list before substituting + enumeration constants. + (tsubst_decl): Remove unused variables. + (regenerate_decl_from_template): Likewise. + + * decl.c (duplicate_decls): Don't obliterate the + DECL_TEMPLATE_INFO for a template if we're not replacing it with + anything. + + * lex.c (do_identifier): Fix typo in comment. + +Wed Aug 26 10:54:51 1998 Kaveh R. Ghazi + + * errfn.c: Remove stdarg.h/varargs.h. + * tree.c: Likewise. + +1998-08-25 Brendan Kehoe + + * pt.c (tsubst_copy): Only do typename overloading on an + IDENTIFIER_NODE that happens to look like a typename if it actually + has a type for us to use. + +1998-08-25 Jason Merrill + + * typeck.c (comp_cv_target_types): Split out... + (comp_target_types): From here. Don't allow cv-qual changes under + a pointer if nptrs == 0. Fix OFFSET_TYPE handling. + (build_ptrmemfunc): Pass 1 to nptrs. + * cvt.c (perform_qualification_conversions): Use comp_ptr_ttypes. + +1998-08-25 Mark Mitchell + + * search.c (dependent_base_p): Don't compare a binfo to + current_class_type; use the TREE_TYPE of the binfo instead. + + * cp-tree.h (CLASS_TYPE_P): Revise definition. + +1998-08-25 Jason Merrill + + * decl.c (duplicate_decls): Don't complain about different + exceptions from an internal decl even if pedantic. + + * typeck.c (convert_for_assignment): Converting from pm of vbase + to derived is an error, not a sorry. + + * call.c (build_over_call): Use convert_pointer_to_real for 'this'. + * class.c (fixed_type_or_null): Rename from + resolves_to_fixed_type_p. Return the dynamic type of the + expression, if fixed, or null. + (resolves_to_fixed_type_p): Use it. Return 0 if the dynamic type + does not match the static type. + (build_vbase_path): Rename 'alias_this' to 'nonnull'. Use + resolves_to_fixed_type_p again. + +1998-08-24 Mark Mitchell + + * pt.c (tsubst_decl): Move special case code for dealing with + tricky friend templates here from ... + (regenerate_decl_from_template): Here. + +1998-08-24 Jason Merrill + + * decl.c (start_decl): Remove redundant linkage check. + +1998-08-24 Gavin Romig-Koch + + * typeck.c (c_expand_return): Handle the case that valtype + is wider than the functions return type. + +1998-08-24 Mark Mitchell + + * cp-tree.h (CLASS_TYPE_P): New macro. + * decl.c (grokdeclarator): Use it instead of IS_AGGR_TYPE. + * pt.c (process_template_parm): Undo previous change. + +1998-08-24 Benjamin Kosnik + + * cp-tree.h: Declare. + * pt.c (decl_template_parm_p): New function. + * decl.c (pushdecl): Check decls for redeclaring template parms. + (xref_tag): Make redeclaration an error, print decl. + * decl2.c (grokfield): Check field_decls for redeclaration as well. + +1998-08-24 Jason Merrill + + * parse.y (primary): Fix up the type of string constants. + +1998-08-24 Mark Mitchell + + * typeck.c (convert_for_initialization): Move check for odd uses + of NULL to avoid duplicate warnings. + +1998-08-24 Jason Merrill + + * tree.c (lvalue_type): Fix for arrays. + * typeck.c (string_conv_p): New fn. + (convert_for_assignment): Use it. + (build_unary_op): Use lvalue_type. + * call.c (standard_conversion, convert_like): Use string_conv_p. + (add_function_candidate): Use lvalue_type. + * cvt.c (convert_to_reference): Likewise. + * decl2.c (lang_decode_option): Ignore -traditional. + * decl.c (init_decl_processing): flag_writable_strings inhibits + flag_const_strings. + +1998-08-24 Andrew MacLeod + + * lang-options.h (lang_options): Add fconst-strings to the list + of valid options. + * decl2.c (lang_f_options, lang_decode_option): Likewise. + +1998-08-24 Nathan Sidwell + + * lex.c (real_yylex): Don't warn about long long constants if + we're allowing long long. + +1998-08-24 Martin von Löwis + + * decl.c (pushdecl): Use IDENTIFIER_NAMESPACE_VALUE instead of + accessing bindings directly. + + * search.c (my_tree_cons): Reimplement. + + * lang-specs.h: Remove __HONOR_STD. + * inc/exception, inc/new, inc/new.h, inc/typeinfo: Likewise. + +1998-08-23 Mark Mitchell + + * decl.c (grokdeclarator): Complain about in-class initialization + of aggregates and/or references. + * pt.c (process_template_parm): Clear IS_AGGR_TYPE for + TEMPLATE_TYPE_PARMs. + + * decl2.c (grok_array_decl): Add comment. + (mark_used): Don't instantiate an explicit instantiation. + * friend.c (make_friend_class): Remove bogus comment. Fix check + for partial specializations. + * pt.c (check_explicit_specialization): Don't + SET_DECL_EXPLICIT_INSTANTIATION here. + (mark_decl_instantiated): Or here. + (do_decl_instantiation): Do it here, instead. Add checks for + duplicate explicit instantiations, etc. Tidy. + (do_type_instantiation): Likewise. + (instantiate_decl): Improve comments. Complain about explicit + instantiations where no definition is available. + + * cp-tree.h (ansi_null_node): Remove. + * call.c (build_over_call): Warn about converting NULL to an + arithmetic type. + * cvt.c (build_expr_type_conversion): Likewise. Use + null_ptr_cst_p instead of expanding it inline. + * decl.c (ansi_null_node): Remove. + (init_decl_processing): Make null_node always have integral type. + * except.c (build_throw): Warn about converting NULL to an + arithmetic type. + * lex.c (init_parse): Remove handling of ansi_null_node. + * pt.c (type_unification_real): Don't convert NULL to void* type. + * typeck.c (build_binary_op_nodefault): Fix NULL warnings. + (convert_for_assignment): Warn about converting NULL to an + arithmetic type. + (convert_for_initialization): Likewise. + +1998-08-20 Jason Merrill + + * tree.c (search_tree, no_linkage_helper, no_linkage_check): New fn. + * pt.c (coerce_template_parms): Use no_linkage_check. + * decl.c (grokvardecl): Likewise. + (grokfndecl): Likewise. Members of anonymous types have no linkage. + + * method.c (process_overload_item): Remove useless code. + +1998-08-20 Per Bothner + + Handle new'ing of Java classes. + * init.c (build_class_classref): New function. + (build_new_1): If type is TYPE_FOR_JAVA: Call _Jv_AllocObject; + constructor does not return this; don't need to exception-protect. + + * pt.c (lookup_template_class): Copy TYPE_FOR_JAVA flag. + * decl2.c (acceptable_java_type): Handle template-derived types. + +1998-08-20 Per Bothner + + * decl2.c (import_export_vtable): Suppress vtables for Java classes. + +1998-08-20 Mark Mitchell + + * decl.c (duplicate_decls): Always merge the old and new patterns + for templates, regardless of whether or not the new one has + DECL_INITIAL. Don't throw away specializations. Merge + DECL_SAVED_TREE. + * pt.c (tsubst_decl): Use the right pattern when calculating the + complete args for a new template instance. + (do_decl_instantiation): Fix typo in comment. + (regenerate_decl_from_template): Deal with tricky friend template + case. + (instantiate_decl): Likewise. + +Thu Aug 20 09:09:45 1998 Jeffrey A Law (law@cygnus.com) + + * init.c (build_builtin_delete_call): Add missing assemble_external + call. + +1998-08-20 Jason Merrill + + * parse.y (notype_unqualified_id): Also accept ~A. + +1998-08-19 Mark Mitchell + + * typeck.c (build_binary_op_nodefault): Warn on use of NULL in + arithmetic. + * except.c (build_throw): Warn when NULL is thrown, even with + -ansi. Use ansi_null_node, rather than integer_zero_node, in the + thrown expression. + + * cp-tree.h (ansi_null_node): New variable. + * decl.c (ansi_null_node): New variable. + (init_decl_processing): Initialize its type. + * lex.c (init_parse): Initialize its value. Use ansi_null_node + for null_node in non-ANSI mode. + * typeck.c (build_binary_op_nodefault): Use ansi_null_node in + place of null_node to avoid spurious errors. + +1998-08-17 Mark Mitchell + + * cp-tree.h (enter_scope_of): New function. + * parse.y (complex_direct_notype_declarator): Use it. + * semantics.c (enter_scope_of): New function. + +1998-08-17 Jason Merrill + + * decl.c (grokparms): No, here. + + * decl.c (grokdeclarator): Catch parm with pointer to array of + unknown bound here... + * method.c (process_overload_item): ...not here. + + * gxxint.texi: Remove obsolete documentation of overloading code. + + * decl.c (finish_enum): Also set TYPE_SIZE_UNIT. + * class.c (finish_struct_bits): Likewise. + + * tree.c (lvalue_type): Fix for arrays. + * typeck.c (build_unary_op): Use lvalue_type. + * call.c (add_function_candidate): Likewise. + * cvt.c (convert_to_reference): Likewise. + + * decl2.c (lang_decode_option): Ignore -traditional. + + * init.c (build_offset_ref): Don't mess with error_mark_node. + * lex.c (do_scoped_id): Use cp_error. + + * rtti.c (get_tinfo_fn): Don't mess with the context for now. + +1998-08-17 Benjamin Kosnik + + * decl.c (grokdeclarator): Allow anonymous types to be cv-qualified. + +Mon Aug 17 10:40:18 1998 Jeffrey A Law (law@cygnus.com) + + * cp-tree.h (set_identifier_local_value): Provide prototype. + + * decl2.c (do_namespace_alias): Remove unused variables `binding' + and `old'. + +Fri Aug 14 16:42:27 1998 Nick Clifton + + * Makefile.in: Rename BBISON to BISON so that it can be properly + inherited from the parent makefile. + +1998-08-13 Jason Merrill + + * lang-options.h: Add -finit-priority. + * decl2.c: Likewise. Check flag_init_priority instead of + USE_INIT_PRIORITY. + + * decl2.c (setup_initp): New fn. + (start_objects, finish_objects, do_ctors): Handle init_priority. + (do_dtors, finish_file): Likewise. + +1998-08-13 Jason Merrill + + * pt.c (tsubst_copy): Hush warning. + + * rtti.c (get_tinfo_fn): Also set DECL_IGNORED_P. + +1998-08-12 Mark Mitchell + + * pt.c (print_template_context): Don't abort when instantiating a + synthesized method. + + * decl.c (grokdeclarator): Issue errors on namespace qualified + declarators in parameter lists or in class scope. + +1998-08-09 Mark Mitchell + + * pt.c (check_explicit_specialization): Don't abort on bogus + explicit instantiations. + +1998-08-07 Mark Mitchell + + * typeck.c (require_complete_type): Use complete_type_or_else. + (complete_type_or_else): Always return NULL_TREE on failure, as + documented. + + * pt.c (tsubst_aggr_type): Prototype. + (tsubst_decl): New function, split out from tsubst. Set + input_filename and lineno as appropriate. + (pop_tinst_level): Restore the file and line number saved in + push_tinst_level. + (instantiate_class_template): Set input_filename and lineno as + appropriate. + (tsubst): Move _DECL processing to tsubst_decl. Make sure the + context for a TYPENAME_TYPE is complete. + + * decl2.c (grokbitfield): Issue errors on bitfields declared with + function type. + (do_dtors): As in do_ctors, pretend to be a member of the same + class as a static data member while generating a call to its + destructor. + + * cvt.c (cp_convert_to_pointer): Handle NULL pointer + conversions, even in complex virtual base class hierarchies. + +1998-08-06 Mark Mitchell + + * cp-tree.h (ENUM_TEMPLATE_INFO): New macro. + (TYPE_TEMPLATE_INFO): Likewise. + (SET_TYPE_TEMPLATE_INFO): Likewise. + (ENUM_TI_TEMPLATE): Likewise. + (ENUM_TI_ARGS): Likewise. + (lookup_nested_type_by_name): Remove. + * decl.c (maybe_process_template_type_declaration): Handle enums. + (start_enum): Don't check for primary-template enum declarations + here. + (finish_enum): Clean up, document. Make sure template enum + constants get the correct type. + (build_enumerator): Copy initializers for template enumerations, + too. + (grok_enum_decls): Document. + * lex.c (do_identifier): Document use of LOOKUP_EXPR a bit + better. Build LOOKUP_EXPRs for local variables, even if they are + TREE_PERMANENT. + * pt.c (tsubst_enum): Remove field_chain parameter. + (template_class_depth): Include the depth of surrounding function + contexts. + (push_template_decl): Check for primary-template enum declarations + here. Deal with enumeration templates. + (lookup_template_class): Likewise. + (for_each_template_parm): Likewise. + (instantiate_class_template): Don't call tsubst_enum directly, + call tsubst instead, to instantiate enums. Deal with all + field_chain issues here, not in tsubst_enum. + (lookup_nested_type_by_name): Remove. + (tsubst_aggr_type): Revise handling of enumeration types. + (tsubst): Likewise. + (tsubst_copy): Likewise. + (tsubst_expr): Call tsubst, not tsubst_enum for TAG_DEFNs. + +1998-08-04 Mark Mitchell + + * decl.c (pushtag): Don't mangle the name of a TYPE_DECL if it + uses template parameters. + * method.c (build_template_parm_names): Use the full set of + template arguments for tsubst'ing. + (build_overload_identifier): Pass the full set of template + arguments to build_template_parm_names, not just the + innermost_args. + * pt.c (TMPL_ARGS_DEPTH): Define using + TMPL_ARGS_HAVE_MULTIPLE_LEVELS, for clarity. + (NUM_TMPL_ARGS): New macro. + (add_outermost_template_args): Deal with the case where the outer + args will be completely discarded. + (coerce_template_parms): Use the full set of template arguments + for tsubst'ing. Simplify. Add some asserts. Improve + error messages. + (lookup_template_class): Pass the full set of template arguments + to coerce_template_parms. + (tsubst): Add assertion. + (do_type_instantiation): Don't instantiate member template + classes. + + * init.c (build_offset_ref): Deal with a TEMPLATE_ID_EXPR whose + name is a LOOKUP_EXPR, rather than an IDENTIFIER_NODE. + +1998-08-03 Jason Merrill + + * method.c (set_mangled_name_for_decl): Change return type to void. + + * decl.c (lookup_name_real): A namespace-level decl takes priority + over implicit typename. Avoid doing the same lookup twice. + + * search.c (dependent_base_p): New fn. + (dfs_pushdecls, dfs_compress_decls): Use it. + + * typeck.c (get_member_function_from_ptrfunc): Don't try to handle + virtual functions if the type doesn't have any. + +1998-08-03 Mark Mitchell + + * decl2.c (grokfield): Don't mangle the name of a TYPE_DECL if it + uses template parameters. + +1998-08-02 Mark Mitchell + + * cp-tree.def (LOOKUP_EXPR): Document. Remove second argument. + * cp-tree.h (DECL_TI_TEMPLATE): Improve documentation. + * lex.c (do_identifier): Don't use a second argument, or a type, + when building LOOKUP_EXPRs. + (do_identifier): Likewise. + (do_scoped_id): Likewise. + * method.c (hack_identifier): Improve error message. + * pt.c (lookup_template_function): Don't needlessly call + copy_to_permanent or build_min. + (tsubst_copy): Remove #if 0'd code. tsubst into LOOKUP_EXPRs if + necessary. + (do_decl_instantiation): Improve error message. + * tree.c (mapcar, case LOOKUP_EXPR): Don't be sorry; make a copy. + (build_min): Copy the type to the permanent obstack, too. + +1998-08-01 Jason Merrill + + * init.c (init_init_processing): Remove BI* handling. + (build_builtin_call): Remove. + (build_builtin_delete_call): New fn. + (build_delete): Use it. + +1998-07-31 Mark Mitchell + + * cp-tree.h (PROCESSING_REAL_TEMPLATE_DECL_P): New macro. + (maybe_check_template_type): New function. + * decl.c (maybe_process_template_type_declaration): New function, + split out from pushtag Call maybe_check_template_type. + (pushtag): Use it. Use PROCESSING_REAL_TEMPLATE_DECL_P. + (xref_tag): Use PROCESSING_REAL_TEMPLATE_DECL_P. + * friend.c (do_friend): Use PROCESSING_REAL_TEMPLATE_DECL_P. + * pt.c (template_class_depth_real): Generalization of ... + (template_class_depth): Use it. + (register_specialization): Use duplicate_decls for duplicate + declarations of specializations. + (maybe_check_template_type): New function. + (push_template_decl_real): Fix comment. + (convert_nontype_argument): Likewise. + (lookup_template_class): Likewise. Avoid an infinite loop on + erroneous code. + (tsubst_friend_function): Fix comment. + (tsubst, case FUNCTION_DECL): Deal with a DECL_TI_TEMPLATE that is + an IDENTIFIER_NODE. + * semantics.c (begin_function_definition): Use + reset_specialization to note that template headers don't apply + directly to declarations after the opening curly for a function. + +1998-07-29 Jason Merrill + + * decl.c (push_overloaded_decl): Use current_namespace instead of + DECL_CONTEXT (decl) to determine where we go. + + * decl.c (lookup_name_real): Fix typo. + +1998-07-28 Mark Mitchell + + * friend.c (is_friend): Be lenient with member functions to deal + with nested friends. + +1998-07-28 Jason Merrill + + * class.c (finish_struct_1): Convert integer_zero_node to + ssizetype before passing it to set_rtti_entry. + * typeck2.c (initializer_constant_valid_p): Allow conversion of 0 + of any size to a pointer. + +1998-07-27 Mark Mitchell + + * cp-tree.h (TI_USES_TEMPLATE_PARMS): Remove. + (build_template_decl_overload): Remove. + (set_mangled_name_for_decl): New function. + (innermost_args): Remove is_spec parameter. + (most_specialized, most_specialized_class): Remove declarations. + (lookup_template_class): Add entering_scope parameter. + (maybe_process_partial_specialization): New function. + (finish_template_decl): Likewise. + (finish_template_type): Likewise. + * class.c (finish_struct): Clean up processing of member template + specializations. + * decl.c (pushtag): Fix formatting. + (lookup_tag): Improve handling of pseudo-global levels. + (make_typename_type): Adjust call to lookup_template_class. + (shadow_tag): Use maybe_process_partial_specialization. + (xref_tag): Improve handling of member friends. + (start_function): Call push_nested_class before + push_template_decl. Don't call push_template_decl for + specializations. + * decl2.c (grok_x_components): Don't call xref_tag for + template instantiations. Handle UNION_TYPEs like RECORD_TYPEs. + (grokclassfn): Use set_mangled_name_for_decl. + (arg_assoc_class): Adjust call to innermost_args. + (mark_used): Don't call instantiate_decl for a TEMPLATE_DECL. + * error.c (dump_function_name): Improve printing of template + function names. + * friend.c (is_friend): Don't compare types of decls to determine + friendship, unless flag_guiding_decls. + (make_friend_class): Partial specializations cannot be friends. + (do_friend): Use set_mangled_name_for_decl. Call + push_template_decl_real instead of push_template_decl. + * method.c (build_decl_overload_real): Remove prototype. Give it + external linkage. + (build_overload_identifier): Adjust call to innermost_args. + (build_template_decl_overload): Remove. + (set_mangled_name_for_decl): New function. + * parse.y (.finish_template_type): New non-terminal. + (template_def): Use finish_template_decl. Use template_extdef + instead of extdef. + (template_extdef, template_datadef): New non-terminals, containing + only those rules for things which can be templates. + (datadef): Tidy. + (template_type, self_template_type): Use .finish_template_type. + (named_class_head): Use maybe_process_partial_specialization. + * pt.c (mangle_class_name_for_template): Remove context parameter. + (get_class_bindings): Remove outer_args parameter. + (complete_template_args): Remove. + (add_outermost_template_args): New function. + (register_specialization): Return the specialization. + (unregister_specialization): New function. + (tsubst_template_parms): Likewise. + (most_specialized, most_specialized_class): Prototype here as + static. + (original_template): Rename to most_general_template. + (tsubst_template_parms): New function. + (set_mangled_name_for_template_decl): Likewise. + (TMPL_ARGS_DEPTH): New macro. + (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): Adjust. + (TMPL_ARGS_LEVEL): New macro. + (SET_TMPL_ARGS_LEVEL): Likewise. + (TMPL_ARG): Likewise. + (SET_TMPL_ARG): Likewise. + (TMPL_ARGS_DEPTH): Likewise. + (finish_member_template_decl): Use finish_template_decl. + (maybe_process_partial_specialization): New function, split out + from tsubst. + (inline_needs_template_parms): Use TMPL_PARMS_DEPTH. + (maybe_begin_member_template_processing): Use new macros. + (is_member_template): Likewise. + (is_member_template_class): Likewise. + (add_to_template_args): Likewise. Deal with multiple levels of + args. + (maybe_process_partial_specialization): New function. + (retrieve_specialization): Add consistency check. + (determine_specialization): Return full argument list. + (check_explicit_specialization): Tweak friend handling. Use full + argument lists. Simplify. + (current_template_args): Use new macros. + (push_template_decl_real): Change ill-named mainargs to specargs. + Check that a partial specialization actually specializes at least + one parameter. Improve friend handling. Modify for full + template arguments. + (classtype_mangled_name): Don't mangle the names of + specializations. + (lookup_template_class): Add entering_scope parameter. Use it to + avoid finding a template type when an instantiation is required. + Simplify. Use full template arguments. + (tsubst_friend_function): Use unregister_specialization. Use new + macros. Use full template arguments. + (tsubst_friend_class): Substitute, using tsubst_template_parms, + into the template parameters before passing them to + redeclare_class_template. + (instantiate_class_template): Simplify. Use full template + arguments. Adjust calls to get_class_bindings. Use + SET_IDENTIFIER_TYPE_VALUE where needed. Improve friend handling. + (innermost_args): Use new macros. + (tsubst_aggr_type): New function, split out from tsubst. + (tsubst): Use tsubst_aggr_type, tsubst_template_parms, new calling + conventions for lookup_template_class. Refine handling of partial + instantiations. Remove calls to complete_template_args. + Simplify. Add consistency checks. Use set_mangled_name_for_decl + and set_mangled_name_for_template_decl. + (tsubst_copy): Use tsubst_aggr_type. + (instantiate_template): Use full template arguments. + (more_specialized): Improve formatting. + (more_specialized_class): Adjust calls to get_class_bindings. + (get_bindings_real): Don't call complete_template_args. + (most_specialized): Don't overwrite input; create a new list. + (most_specialized_class): Use most_general_template. + (regenerate_decl_from_template): Use unregister_specialization. + Use full template arguments. + (instantiate_decl): Use full template arguments. + (set_mangled_name_for_template_decl): New function. + * semantics.c (begin_class_definition): Use + maybe_process_partial_specialization. + (finish_member_class_template): New function. + (finish_template_decl): Likewise. + (finish_template_type): Likewise. + (typeck.c): Don't crash after issuing a compiler_error. + * Makefile.in (CONFLICTS): Adjust; we removed a s/r conflict. + +1998-07-27 Jason Merrill + + * typeck2.c (build_functional_cast): Handle default-initialization. + + * call.c (build_over_call): Pass 1 to popclass. + + * parse.y (direct_notype_declarator): Add precedence declaration + to notype_unqualified_id case. + * Makefile.in (EXPECT): Adjust. + + * tree.c (ovl_member): Fix for single function in OVL. + +1998-07-27 Dave Brolley + + * c-lex.c (yylex): Fix boundary conditions in character literal and + string literal loops. + +1998-07-24 Jason Merrill + + * decl.c (lookup_name_real): OK, do return the from_obj value + unless got_object depends on template parms. + + * parse.y (nested_name_specifier_1): Pull out the TYPE_MAIN_VARIANT. + + * pt.c (coerce_template_parms): Also complain about local enums. + + * cp-tree.h: Add prototype for set_identifier_local_value. + * decl.c (set_identifier_local_value_with_scope): Make static, + prototype. + * search.c (covariant_return_p): Likewise. + * except.c (build_terminate_handler, alloc_eh_object): Likewise. + + * call.c (build_method_call): Only pull out the type of a destructor + if it's a template type parm. + * decl.c (lookup_name_real): Never return the from_obj value. + +1998-07-23 Jason Merrill + + * except.c (process_start_catch_block_old): Call start_decl_1 for + catch parm. + * decl.c (start_decl_1): Avoid duplicate error. + + * init.c (expand_default_init): Only perform the initialization if + it will do something. + +1998-07-23 H.J. Lu (hjl@gnu.org) + + * parse.y (base_class): Check for invalid base class. + +1998-07-23 Jason Merrill + + * decl2.c (import_export_template): Fold in... + (import_export_class): ...to here. Handle dllimport/export. + + * class.c (build_vtable): Pass at_eof to import_export_vtable. + (prepare_fresh_vtable): Likewise. + * decl2.c (import_export_class): Split out... + (finish_prevtable_vardecl): From here. + * class.c (finish_struct_1): Call import_export_class if at_eof. + + * decl.c (start_function): #if 0 mysterious code I wrote and have + forgotten why. + * rtti.c (get_tinfo_fn): If this is for a class type, set + DECL_CONTEXT. + +1998-07-22 Jason Merrill + + * inc/exception: Change terminate and unexpected to (). + + * parse.y (named_class_head_sans_basetype_defn): A + named_class_head_sans_basetype followed by '{' or ':' is a defn. + +1998-07-21 Jason Merrill + + * tree.c (canonical_type_variant): New fn to handle arrays. + * cp-tree.h (CANONICAL_TYPE_VARIANT): Remove. + * pt.c (unify, default case): Also fold arg. Fix array bounds case. + * method.c (process_overload_item): Use build_overload_value for + arrays. + +1998-07-20 Dave Brolley + + * lex.c (mbchar.h): #include it. + (GET_ENVIRONMENT): New macro. + (init_parse): Set character set based on LANG environment variable. + (real_yylex): Handle multibyte characters in character literals. + (real_yylex): Handle multibyte characters in string literals. + +1998-07-19 Jason Merrill + + * lex.c (do_identifier): Look for class value even if we don't + have a global value. Do implicit declaration if parsing is 2. + * semantics.c (finish_call_expr): Pass 2 if we're doing Koenig + lookup. + +1998-07-19 Mark Mitchell + + * decl.c (pushtag): Revert previous change. + * pt.c (lookup_template_class): Don't put out debugging + information for types that use template parameters. + + * decl.c (pushtag): Don't put out debugging information for + compiler-generated typedefs. + + * error.c (dump_type_real): Don't crash when presented with + intQI_type_node or the like. + + * semantics.c (finish_translation_unit): Fix spelling error in + comment. + +1998-07-17 Jason Merrill + + * decl.c (lookup_name_real): Pull out single function here. + (select_decl): Not here. + (unqualified_namespace_lookup): Use CP_DECL_CONTEXT. + + * decl.c (qualify_lookup): Tweak again. + + * pt.c (lookup_template_class): Don't mess with the context of the + instantiation. + * decl2.c (current_decl_namespace): Remove special handling for + templates. + + * pt.c (tsubst, case FUNCTION_DECL): Fix getting complete args for + a member template specialization. + + * tree.c (ovl_member): Use decls_match to compare functions. + * decl.c (decls_match): Check the context of a function. + + * parse.y (primary): Use notype_unqualified_id instead of IDENTIFIER + in Koenig lookup support rules. + * semantics.c (finish_call_expr): Handle the new cases. + + * typeck.c (build_x_function_call): Handle overloaded methods. + + * decl.c (grokvardecl): Don't call build_static_name for extern "C". + +1998-07-16 Mark Mitchell + + * semantics.c (finish_object_call_expr): Revert previous change. + * call.c (build_new_method_call): Likewise. Instead, convert + TYPE_DECLs to IDENTIFIERs here, in the presence of templates. + +1998-07-16 Jason Merrill + + * decl.c (qualify_lookup): Handle templates. + + * decl2.c (do_using_directive): Don't pass ancestor. + * decl.c (push_using_directive): Calculate ancestor. + + * decl2.c (do_nonmember_using_decl): Allow for type shadowing. + * decl.c (pushdecl): Move type shadowing handling from here... + (duplicate_decls): ...to here. + * decl.c (set_identifier_local_value_with_scope): New fn. + (pushdecl): Use it. + (set_identifier_local_value, lookup_type_current_level): New fns. + * decl2.c (do_local_using_decl): Handle types and binding level + stuff properly. + + * init.c (build_offset_ref): Don't call mark_used on an OVERLOAD. + * decl.c (select_decl): Extract a lone function from an OVERLOAD. + (lookup_namespace_name): Likewise. + * typeck.c (build_unary_op): Not here anymore. + + * decl2.c (do_class_using_decl): Make sure we get an identifier. + * class.c (handle_using_decl): Ignore TYPE_DECLs. + + * decl.c (qualify_lookup): New fn. + (lookup_name_real): Use it. + +1998-07-16 Martin v. Löwis + + * decl2.c (add_using_namespace): When directly using a namespace + that was indirect before, promote it. + + * cp-tree.h (LOOKUP_PREFER_TYPES, LOOKUP_PREFER_NAMESPACES, + LOOKUP_PREFER_BOTH, LOOKUP_NAMESPACES_ONLY, LOOKUP_TYPES_ONLY, + LOOKUP_QUALIFIERS_ONLY, LOOKUP_TEMPLATES_EXPECTED): New macros. + * decl.c (select_decl): Replace two flag parameters by one. + (unqualified_namespace_lookup): Likewise, pass flag. + (lookup_flags): New function. + (lookup_name_real): Compute flags, pass them. + (lookup_namespace_name): Call with zero-flag. + * decl2.c (ambiguous_decl): Add flag parameter, complain only + according to flags. + (lookup_using_namespace, qualified_lookup_using_namespace): + Add flag parameter, pass them through. + * lex.c (do_scoped_id): Call with zero-flag. + +1998-07-16 Jason Merrill + + * typeck.c (convert_for_assignment): Use comptypes. + +1998-07-16 Mark Mitchell + + * semantics.c (finish_object_call_expr): Move test for the + function called being a TYPE_DECL to ... + * call.c (build_new_method_call): Here. + +1998-07-15 Jason Merrill + + * decl2.c (arg_assoc_class): Also look at template arguments, if any. + (arg_assoc): Handle error_mark_node and multiple levels of TREE_LIST. + + * lex.c (looking_for_typename): Don't initialize. + + * decl2.c (ambiguous_decl): Clarify error message. + + * decl.c (push_using_directive): Iterate over namespaces used + indirectly. + +1998-07-15 Martin v. Löwis + + * decl2.c (add_using_namespace): Iterate over namespaces used + indirectly. + + * decl.c (lookup_name_real): Accept namespace aliases as locals. + (cat_namespace_levels): Ignore aliases. + (duplicate_decls): Ignore duplicate aliases. + * decl2.c (do_namespace_alias): Process block level namespace + aliases. Store alias with pushdecl. Remove odr errors. + * parse.y (namespace_alias): New non-terminal. + (extdef): Use it. + +1998-07-15 Jason Merrill + + * decl2.c (arg_assoc_type): Handle METHOD_TYPE like FUNCTION_TYPE. + Handle TEMPLATE_TYPE_PARM. + (arg_assoc): Rewrite. + + * pt.c (complete_template_args): Don't look at the context unless + we have to. + + * method.c (build_decl_overload_real): Fix namespace handling. + + * typeck.c (build_unary_op): Extract a lone function from an + OVERLOAD. + + * call.c (build_scoped_method_call): Handle getting a namespace + for basetype in a destructor call. + (check_dtor_name): Handle enums. + + * parse.y (using_directive): New nonterminal. + (extdef, simple_stmt): Use it. + +1998-07-14 Martin von Löwis + + * decl2.c (add_function): Move error message ... + (arg_assoc_namespace): ... from here. + +1998-07-14 Jason Merrill + + * parse.y (namespace_qualifier): Fix multiple level handling. + * decl2.c (namespace_ancestor): Use CP_DECL_CONTEXT. + (arg_assoc): Don't skip the first argument of a function. + +Tue Jul 14 20:09:22 1998 Jeffrey A Law (law@cygnus.com) + + * search.c (my_tree_cons): Clean up. + +1998-07-14 Jason Merrill + + * call.c (joust): Don't warn about "confusing" conversions to the + same type. + +1998-07-14 Martin von Löwis + + * class.c (push_nested_class): Complain about namespaces. + * decl.c (start_decl): Enter the object's namespace. + (cp_finish_decl): Leave it. + (grokdeclarator): Likewise. + * decl2.c (check_decl_namespace): New function. + (finish_file): Call it. + * parse.y (complex_direct_notype_declarator): Set complexity + of namespace-qualified ids to -1, enter the namespace. + + * method.c (build_template_decl_overload): Expect _DECL as first + parameter. Put context temporarily into current_namespace. + * pt.c (check_explicit_specialization): Change caller. + (tsubst): Likewise. + + * init.c (build_offset_ref): Call mark_used and + convert_from_reference for namespace members. + +Mon Jul 13 23:25:28 1998 Martin von Löwis + + * search.c (my_tree_cons): The bitfield is at index 2. + +Mon Jul 13 17:21:01 1998 Nick Clifton + + * lang-options.h: Format changed to work with new --help support + in gcc/toplev.c + +1998-07-12 Martin von Löwis + + * decl2.c (build_expr_from_tree): Change calls of do_identifier. + Do Koenig lookup in CALL_EXPR. + (arg_assoc): Handle error_mark. + * lex.c (is_global): New function. + (do_identifier): Expect arguments for Koenig lookup. + * parse.y (primary): Add rules for calls of unqualified function calls. + (do_id): Change call of do_identifier. + * pt.c (finish_stmt_expr): Likewise. + * semantics.c (finish_id_expr): Likewise. + (finish_call_expr): Add integer parameter to indicate + argument-dependent lookup. + + * decl.c (struct binding_level): New field using_directives. + (push_using_decl): Not sorry anymore. + (push_using_directive): New function. + (lookup_tag): Use CP_DECL_CONTEXT to iterate. + (unqualified_namespace_lookup): New function, code from ... + (lookup_name_real): ... here. + * decl2.c (lookup_using_namespace): Pass using list instead of + initial scope. + (validate_nonmember_using_decl): New function. + (do_nonmember_using_decl): New function. + (do_toplevel_using_decl): Use them. + (do_local_using_decl): New function. + (do_using_directive): Support block-level directives. + * parse.y (simple_stmt): Support using declarations and + directives. + (namespace_qualifier, namespace_using_decl): New non-terminals. + + * xref.c (classname): New function. + (GNU_xref_hier): Change class and base parameters to tree. + * decl.c (xref_baseypes): Change caller. + * friend.c (make_friend_class): Likewise. + +1998-07-12 Kriang Lerdsuwanakij + + * typeck.c (comptypes, case TEMPLATE_TEMPLATE_PARM): Add parameter + comparison. + + * pt.c (for_each_template_parm, case TEMPLATE_DECL): If it is a + template template parameter, record its use. + (for_each_template_parm, case TEMPLATE_TEMPLATE_PARM): Traverse + its template arguments if exists. + + * pt.c (coerce_template_template_parms): New function equivalent + to coerce_template_parms when IS_TMPL_PARM is true. + (coerce_template_parms): Use it. Remove the IS_TMPL_PARM parameter, + all callers changed. + + (coerce_template_parms): Access ARGLIST properly when creating a + new vector. Only accept implicit TYPE_DECL as valid argument for + a template template parameter when it is a base class of + current_class_type. Don't display error message when COMPLAIN is + false. + +1998-07-12 Klaus Kaempf (kkaempf@progis.de) + + * repo.c (get_base_filename): Use file_name_nondirectory. + (open_repo_file): Likewise. + * cp-tree.h (file_name_nondirectory): Add prototype. + +1998-07-12 Jason Merrill + + * friend.c (do_friend): Pull the identifier out of declarator. + Use cp_error and friends. + * decl2.c (qualified_lookup_using_namespace): Fix call to + purpose_member. + * decl.c (lookup_name_real): Don't call complete_type on a namespace. + (grokvardecl): Use DECL_CLASS_SCOPE_P. + * cvt.c (convert_pointer_to_real): Check for error_mark_node sooner. + * class.c (warn_hidden): Fix for OVERLOAD. + From grahams@rcp.co.uk: + * cp-tree.h (DEFARG_NODE_CHECK): New macro. + (DEFARG_LENGTH, DEFARG_POINTER): Use it. + +Sun Jul 12 01:20:57 1998 Jeffrey A Law (law@cygnus.com) + + * g++.1 (-traditional): Remove duplicated documentation. + +1998-07-11 Mark Mitchell + + * method.c (flush_repeats): Add nrepeats parameter. + (issue_nrepeats): Likewise. + (is_back_referenceable_type): New function. Don't back-reference + TEMPLATE_TYPE_PARMs as well as simple types like integers. + (build_mangled_name_for_type): Likewise. + (build_mangled_name_for_type_with_Gcode): Likewise. + (lasttype): Remove. + (nrepeats): Likewise. + (Nrepeats): Likewise. + (start_squangling): Don't clear the variables removed above. + (end_squangling): Likewise. + (flush_repeats): Tidy. Use nrepeats parameter rather than + Nrepeats global. + (issue_nrepeats): Likewise, but with nrepeats global. Use + is_backreferenceable_type. + (build_overload_nested_name): Tidy. Add comment. Use + build_mangled_name_for_type. + (build_underscore_int): Comment. + (build_overload_scope_ref): Use build_mangled_name_for_type. + (build_overload_int): Likewise. + (build_template_template_parm_names): Tidy. + (build_template_parm_names): Use build_mangled_name_for_type. + (build_overload_identifier): Add comments. + (build_mangled_name_for_type_with_Gcode): Split out from + build_mangled_name. + (build_mangled_name_for_type): Use it. + (build_mangled_name): Rework to use build_mangled_name_for_type + and to not use global nrepeats/Nrepeats. Tidy. + (process_modifiers): Tidy. + (check_btype): Use is_backreferenceable_type. Add comment. + Rename `node' to `type'. + (process_overload_item): Set numeric_output_need_bar here. + Use build_mangled_name_for_type. Tidy. + (build_decl_overload_real): Tidy. Don't use Nrepeats. Use + build_mangled_name_for_type. + + * pt.c (push_template_decl_real): Don't look at DECL_TEMPLATE_INFO + for TYPE_DECLs. + +1998-07-08 Vladimir N. Makarov + + * cp-tree.h (warn_long_long): Define. + * decl.c (grokdeclarator): Add flag `warn_long_long' as guard for + warning "ANSI C++ does not support `long long'". + * decl2.c (warn_long_long): Define. + (lang_decode_option): Parse -Wlong-long, -Wno-long-long options. + +1998-07-07 Jason Merrill + + * decl.c (xref_tag): Handle attributes between 'class' and name. + * parse.y (aggr): Likewise. + * semantics.c (finish_class_definition): Likewise. + * Makefile.in (EXPECTED): Adjust. + + * cp-tree.h: Declare flag_optional_diags and warn_multichar. + * decl2.c: Define them. + (lang_decode_option): Handle them. + * lang-options.h: Add -foptional-diags. + * class.c (finish_struct): Don't complain about multiple meanings of + name if -fno-optional-diags. + * decl.c (pushdecl_class_level): Likewise. + * lex.c (real_yylex): Check warn_multichar. + +1998-07-06 Jason Merrill + + * decl.c (lookup_tag): Use CP_DECL_CONTEXT. + + * tree.c (make_binfo): Fix length. + +1998-06-30 Benjamin Kosnik + + * decl2.c (lang_decode_option): Remove warn_template_debugging. + * lang-options.h: Likewise. + +Mon Jun 29 20:17:40 1998 Kaveh R. Ghazi + + * except.c (build_eh_type_type_ref): Remove unused variable `susp'. + (process_start_catch_block): Likewise for variables + `false_label_rtx', `call_rtx' and `return_value_rtx'. + +1998-06-29 Brendan Kehoe + + * tree.c (build_srcloc): Make sure we allocate this node on the + permanent obstack. + +Sat Jun 27 23:34:18 1998 Fred Fish + + * g++spec.c (NEED_MATH_LIBRARY): Define to 1 if not already defined. + (lang_specific_driver): Initialize need_math with NEED_MATH_LIBRARY. + (lang_specific_driver): Only add -lm automatically if need_math is + nonzero. + +Sat Jun 27 12:22:56 1998 Jeffrey A Law (law@cygnus.com) + + * Make-lang.in (g++): Depend on mkstemp.o. Link in mkstemp.o + +Sat Jun 27 07:36:09 1998 Kaveh R. Ghazi + + * Makefile.in (EXPR_H): New dependency variable. + (decl2.o): Depend on $(EXPR_H). + (typeck.o): Likewise. + (init.o): Likewise. + (expr.o): Likewise. + +1998-06-25 Benjamin Kosnik + + * decl.c (start_enum): Put local enums on permanent_obstack. + +1998-06-25 Mark Mitchell + + * cp-tree.h (c_get_alias_set): Declare. + * decl.c (init_decl_processing): Set lang_get_alias_set. + +1998-06-25 Andrew MacLeod + + * cp-tree.h (mark_all_runtime_matches): Add function prototype. + * except.c (mark_all_runtime_matches): Set TREE_SYMBOL_REFERENCED + flag for all function decls which are in the exception table. + * exception.cc (__cplus_type_matcher): Check for CATCH_ALL_TYPE match. + * decl2.c (finish_file): Call mark_all_runtime_matches to make sure + code is emitted for any referenced rtti function. + +1998-06-25 Dave Brolley + + * lang-specs.h: Use new | syntax to eliminate + string concatenation. + +1998-06-25 Jason Merrill + + * cp-tree.h (CP_DECL_CONTEXT): New macro. + * decl2.c (is_namespace_ancestor, lookup_using_namespace): Use it. + * method.c (build_overload_nested_name): Likewise. + * sig.c (build_signature_pointer_or_reference_type): Don't set + DECL_CONTEXT. + +1998-06-24 Martin v. Löwis + + Set DECL_CONTEXT for globals to NULL_TREE instead of global_namespace. + * cp-tree.h (FROB_CONTEXT): New macro. + (DECL_MAIN_P): ::main should have a DECL_CONTEXT of NULL_TREE. + * decl.c (namespace_binding): Replace NULL_TREE with + global_namespace. + (set_namespace_binding, pop_namespace, lookup_name_real): Likewise. + * decl2.c (is_namespace_ancestor, lookup_using_namespace): + Likewise. + * decl.c (pushtag): Use FROB_CONTEXT. + (pushdecl, make_typename_type, define_function, grokdeclarator): + Likewise. + * decl2.c (set_decl_namespace, do_namespace_alias): Likewise. + * pt.c (push_template_decl_real, lookup_template_class, tsubst): + Likewise. + * decl2.c (decl_namespace): Return global_namespace if no context. + * method.c (build_overload_nested_name): Expect null as context. + * pt.c (mangle_class_name_for_template): Do nothing for null + contexts. + (lookup_template_class): Allow for null id_context. + +1998-06-25 Richard Henderson + + * method.c (emit_thunk): Set current_function_is_thunk for the + ASM_OUTPUT_MI_THUNK case as well. + +1998-06-23 Andrew MacLeod + + * exception.cc (__cplus_type_matcher): Get a match_info pointer + instead of an exception table entry as a parameter. + +1998-06-23 Andrew MacLeod + + * parse.y (function_try_block): Don't call start_catch_handler. + * except.c (call_eh_info): Remove coerced field from declaration. + (build_eh_type_type_ref): New function to create an address of a + rtti function for the new style exception tables. + (expand_start_catch_block): Split function, this contains the + common part. + (process_start_catch_block_old): New function to perform the rest + of expand_start_catch_block under old style exceptions. + (process_start_catch_block_old): New function to perform the rest + of expand_start_catch_block under new style exceptions. + (expand_end_catch_block): Only pop the false label off the stack under + the old style of exceptions. + * semantics.c (finish_try_block): Don't call start_catch_handler. + * exception.cc (struct cp_eh_info): Add original_value field. + (__cplus_type_matcher): Perform type matching on the original exception + value, and if we have a match, set the current value. + (__cp_push_exception): Set the original exception value. + +1998-06-23 Jason Merrill + + * call.c (joust): Fix confusing conversion warning. + + * call.c (build_op_delete_call): Add placement parm. Check + LOOKUP_SPECULATIVELY. + * cp-tree.h, decl2.c, init.c: Adjust. + * decl.c (finish_function): Use it. + + * pt.c (tsubst): Diagnose creating void fields or variables. + +Mon Jun 22 08:50:26 1998 Kaveh R. Ghazi + + * call.c (build_scoped_method_call): Remove unused variable `tmp'. + + * cp-tree.h (check_dtor_name): Add prototype. + + * init.c (expand_member_init): Remove unused variables + `ptr_type_node', `parm' and `rval'. + + * ptree.c (print_lang_type): Use HOST_WIDE_INT_PRINT_DEC specifier + in call to fprintf. + (lang_print_xnode): Likewise. + + * typeck2.c (enum_name_string): Cast argument to sprintf to long + and use %ld specifier. + + * xref.c (GNU_xref_end_scope): Use HOST_WIDE_INT_PRINT_DEC + specifier in call to fprintf. + (GNU_xref_member): Cast argument to sprintf to int. + +Fri Jun 19 23:22:42 1998 Bruno Haible + + * typeck2.c (pop_init_level): Warn about implicit zero initialization + of struct members. + +Thu Jun 18 09:32:32 1998 Kaveh R. Ghazi + + * cp-tree.h: Prototype function `check_java_method'. + +1998-06-17 Jason Merrill + + * class.c (finish_struct): Make conflicting use of id a pedwarn. + * decl.c (pushdecl_class_level): Likewise. + +1998-06-17 Mark Mitchell + + * pt.c (convert_nontype_argument): Issue an error when presented + with an integer (real) constant that cannot be simplified to an + INT_CST (REAL_CST). + + * cp-tree.h (c_get_alias_set): Remove declaration added in + 1998-06-13 change that should never have been checked in. + +1998-06-17 Jason Merrill + + * typeck.c (build_binary_op_nodefault): Change % in format strings + to %%. + + * decl.c (grokvardecl): Don't build_static_name for decls that + aren't at namespace scope. + + * init.c (perform_member_init): Catch default-initialization of + references. + +1998-06-17 Mark Mitchell + + * errfn.c (cp_thing): Handle the `%%' formatting sequence. + +1998-06-17 Jason Merrill + + * method.c (hack_identifier): Complain about getting a namespace + or class template. + * typeck.c (decay_conversion): Remove check for namespaces. + * typeck2.c (incomplete_type_error): Likewise. + * parse.y (template_arg): Add PTYPENAME expansion. + +1998-06-16 Andrew MacLeod + + * decl.c (grokvardecl): Don't build external assembler names for + TYPENAMEs in other namespaces as there is no declarator. + * error.c (cp_file_of, cp_line_of): Don't extract file or line number + info from DECL_CONTEXT if it is NULL. + +1998-06-16 Jason Merrill + + * call.c (check_dtor_name): Split out. + (build_scoped_method_call): Use it. + (build_method_call): Use it. + * init.c (build_offset_ref): Use it. + + * typeck.c (build_static_cast): Fix handling of pointers to members. + + * decl.c (finish_function): Just return nothing from a constructor. + * typeck.c (c_expand_return): Complain about returning a void + expression from a destructor. + +1998-06-13 Mark Mitchell + + * class.c (alter_access): Accept a BINFO explaining how to get + from the entity whose accessed is being altered to the type doing + the altering. + (handle_using_decl): New function containing code split out from ... + (finish_struct_1): Here. + + * cp-tree.h (complete_type_or_else): Declare. + * init.c (build_new_1, build_delete): Use it. + * typeck.c (require_complete_type): Use complete_type, rather than + expanding it inline. + (complete_type_or_else): New function. + (build_component_ref): Use it. + (pointer_int_sum): Make sure the type pointed to is complete. + (pointer_diff): Likewise. + + * pt.c (for_each_template_parm): Traverse the TYPE_CONTEXT for + types. + + * search.c (get_matching_virtual): Note that member templates + cannot override virtual functions. + +1998-06-12 Brendan Kehoe + + * pt.c (check_explicit_specialization): If DECLARATOR turned into + an error_mark_node from lookup_template_function, return the same. + (determine_specialization): Also make sure TEMPLATE_ID isn't an + error_mark_node, before we try to read its operands. + * decl.c (grokdeclarator): If we got an error_mark_node from + check_explicit_specialization, just return it right back. + +1998-06-12 Mark Mitchell + + * class.c (instantiate_type): Don't treat template-ids that don't + specify any template arguments as equivalent to ordinary + identifiers. Use OFFSET_REF instead of SCOPE_REF to refer to + pointer-to-members for member templates. Tidy slightly. + * cp-tree.def (TEMPLATE_ID_EXPR): Revise documentation. + * init.c (build_offset_ref): Handle template-ids like ordinary + identifiers, for the most part, but store a TEMPLATE_ID_EXPR in the + offset part of the OFFSET_REF. + * typeck.c (build_unary_op): Change check for unknown types to + look for OFFSET_REFs, not SCOPE_REFs. + +1998-06-11 Mark Mitchell + + * pt.c (is_member_template_class): New function. + (push_template_decl_real): Use it. + +1998-06-11 Benjamin Kosnik + + * friend.c (do_friend): Add support for nested classes using + member functions of the enclosing class as friends. + +1998-06-10 Mark Mitchell + + * call.c (convert_default_arg): Make global, not static. + (convert_arg_for_ellipsis): Split out from ... + (build_over_call): Here. + * cp-tree.h (convert_default_arg); Declare. + (convert_arg_to_ellipsis): Likewise. + (do_member_init): Remove. + * init.c (do_member_init): Remove; this code is dead. + (expand_member_init): Remove much of this code; it is dead. + * typeck.c (convert_arguments): Use convert_default_arg and + convert_arg_for_ellipsis, rather than duplicating here. + + * call.c (convert_like): Don't fail silently if + build_user_type_conversion fails. Always return error_mark_node + for failure. + +1998-06-10 Jason Merrill + + * search.c (covariant_return_p): Complain about ambiguous base. + + * typeck.c (build_component_ref): Diagnose ref to nested type. + +1998-06-10 Brendan Kehoe + + * decl.c (grokparms): Check that INIT isn't an error_mark_node + before giving error about invalid type for default arg. + +1998-06-10 Jason Merrill + + * call.c (build_method_call): Fix thinko. + +1998-06-10 Dave Brolley + + * decl2.c (lang_decode_option): New argc/argv interface. + * cp-tree.h (lang_decode_option): New argc/argv interface. + * lang-specs.h (default_compilers): Only call cpp if -E, -M or -MM is + specified for cpplib-enabled compilers. + * lex.c (lang_init): Don't check_newline for cpplib. + (init_parse): Don't initialize cpplib here. + +1998-06-10 Brendan Kehoe + + * typeck.c (build_component_ref): Make sure FIELD has a lang_specific + piece before checking DECL_MUTABLE_P. + +1998-06-10 John Carr + + * tree.c (debug_binfo): Make printf format match arguments. + + * error.c (OB_PUTI): Make printf format match arguments. + +1998-06-10 Jason Merrill + + * init.c (perform_member_init): Handle default-initialization. + + * except.c (build_throw): Handle throwing NULL. + + * typeck.c (build_x_function_call): Use resolve_offset_ref. + + * search.c (compute_access): Only strip an anonymous union + for a FIELD_DECL. + + * call.c (add_builtin_candidates): Tweak. + + * cvt.c (build_expr_type_conversion): Restore code for conversion + from class types. + * decl2.c (delete_sanity): Use it. Clean up. + + * typeck.c (comp_ptr_ttypes_real): Fix cv-qual comparisons. + +1998-06-10 Branko Cibej + + * typeck.c (c_expand_return): Don't warn about void expressions on + return statements in functions returning void. + +1998-06-09 Mark Mitchell + + * pt.c (fn_type_unification): Revise documentation. Tidy. + (type_unification): Likewise. + +1998-06-09 Andrew MacLeod + + * semantics.c (finish_try_block): Rename expand_start_catch, and delete + expand_end_catch. + * parse.y (function_try_block): Rename expand_start_catch, and delete + expand_end_catch. + * except.c (expand_end_eh_spec): Rename expand_start_catch, and delete + expand_end_catch. + +1998-06-09 Jason Merrill + + * search.c (lookup_member): New fn. + * class.c (finish_struct_1): Use it. + * decl.c (lookup_name_real): Use it. + +Mon Jun 8 20:45:52 1998 Kaveh R. Ghazi + + * Makefile.in (decl2.o): Depend on dwarf2out.h and dwarfout.h. + + * cp-tree.h: Add prototype for `maybe_print_template_context' and + `maybe_make_one_only'. + + * decl.c (auto_function): Remove unused variable `decl'. + + * decl2.c: Include dwarf2out.h and dwarfout.h. + + * lex.c: Remove redundant declarations of `set_float_handler' and + `asm_out_file'. + +1998-06-08 Andrew MacLeod + + * except.c (init_exception_processing): Remove NEW_EH_MODEL compile + time flag. Call __cp_eh_info instead of __cp_exception_info. + * exception.cc (struct cp_eh_info): Remove NEW_EH_MODEL flag. + (__cp_exception_info): Return offset into cp_eh_info structure to + match what use to be the start of this structure. + (__cp_eh_info): New function to return a pointer to cp_eh_info struct. + (__cplus_type_matcher, __cp_push_exception): Remove NEW_EH_MODEL + compile time flag. + (__uncatch_exception, __check_eh_spec, std::uncaught_exception): Call + __cp_eh_info instead of __cp_exception_info. + +1998-06-08 Jason Merrill + + * decl.c (cp_finish_decl): Disable inlining of extern inlines + with static variables. + +1998-06-08 Mark Mitchell + + * init.c (build_offset_ref): Correct previous change to use build, + not build_min. + +1998-06-07 Mark Mitchell + + * class.c (instantiate_type): Handle pointer-to-members where the + member is a template. + * init.c (build_offset_ref): Likewise. + * typeck.c (build_unary_op): Likewise. + +1998-06-07 Richard Henderson + + * lex.c (lang_init_options): New function. + (lang_init): Remove flag_exceptions == 2 hack. + +1998-06-05 Jason Merrill + + * search.c (envelope_add_decl): Tweak for implicit typename. + + * call.c (joust): Also warn about confusing conversion op/constructor + overload resolution. + + * spew.c (yylex): Also return the TYPE_DECL if got_object. + Don't clear got_object after '~'. + * call.c (build_scoped_method_call): Tweak destructor handling. + (build_method_call): Likewise. + * pt.c (tsubst_copy, case METHOD_CALL_EXPR): Don't mess with + TYPE_MAIN_VARIANT for destructors. + * semantics.c (finish_object_call_expr): Complain about calling a + TYPE_DECL. + +1998-06-05 Per Bothner + + * g++spec.c (lang_specific_pre_link, lang_specific_extra_ofiles): + Define - update needed by gcc.c change. + +1998-06-05 Jason Merrill + + * error.c (cp_printers): Use 'o' instead of '_' for the null entry. + +1998-06-05 Martin v. Löwis + + * cp-tree.h (DECL_NAMESPACE_ALIAS, ORIGINAL_NAMESPACE): Declare. + * decl.c (lookup_name_real): Add namespaces_only parameter. + If set, return only NAMESPACE_DECLs. + (select_decl): Likewise. + (identifier_type_value): Give additional parameter. + (lookup_name_nonclass): Likewise. + (lookup_name): Likewise. + (find_binding): Skip namespace aliases. + (binding_for_name): Likewise. + (push_namespace): Check for namespace aliases. + (lookup_name_namespace_only): New function. + (begin_only_namespace_names, end_only_namespace_names): New functions. + * decl2.c (set_decl_namespace): Skip namespace aliases. + (do_using_directive): Likewise. + (do_namespace_alias): Produce namespace aliases, fix alias + redeclaration. + * error.c (dump_decl): Support SCOPE_REF. + * parse.y (extdef): Wrap lookup with namespace_only for namespace + aliases and using declarations. + +1998-06-04 Jason Merrill + + * tree.c (really_overloaded_fn): Only see through one TREE_LIST. + + * error.c (dump_expr): Clean up NEW_EXPR case. + +1998-06-04 Martin von Löwis + + Suggested by Brendan Kehoe + * decl2.c (do_toplevel_using_decl): When decl is a TYPE_DECL, + treat it as using ::decl. + + * decl2.c (arg_assoc_type): Process unknown_type_node and OFFSET_TYPE. + + * tree.c (mapcar): Support NEW_EXPR. + + * error.c (dump_expr): Support NEW_EXPR. + +1998-06-03 Jason Merrill + + * method.c (make_thunk): Use overload machinery to make name. + * search.c (covariant_return_p): New fn. + (get_matching_virtual): Use it. + + * init.c (build_new_1): Fix check for void. + +1998-06-01 Per Bothner + + * cp-tree.h (TYPE_FOR_JAVA): New macro. + * decl.c, cp-tree.h (java_byte_type_node, java_short_type_node, + java_int_type_node, java_long_type_node, java_float_type_node, + java_double_type_node, java_char_type_node, java_boolean_type_node): + New "primitive" types, with predefined names __java_byte etc. + (record_builtin_java_type): New function. + (init_decl_processing): Make Java types with record_builtin_java_type. + (pushtag, grokdeclarator): Set TYPE_FOR_JAVA if in extern "JAVA". + (xref_baseypes): If base class was TYPE_FOR_JAVA, so is this class. + (grokfndecl): Call check_java_method for Java classes. + * method.c (is_java_type): Removed. Replaced with TYPE_FOR_JAVA. + (process_overload_item): Match types against specific + java_XX_type_node types, rather than using is_java_type. + * class.c (finish_struct_1): Don't add default copy constructor + or operator= if TYPE_FOR_JAVA. + (pop_lang_conext): Restore strict_prototyp proper if Java. + * decl2.c (acceptable_java_type, check_java_method): New functions. + * pt.c (instantiate_class_template): Copy TYPE_FOR_JAVA from pattern. + (tsubst): Move common statement after if statement. + * typeck.c (comptypes): If strict, TYPE_FOR_JAVA must match. + +1998-06-01 Jason Merrill + + * pt.c (for_each_template_parm): Use first_rtl_op. + + * tree.c (build_cplus_array_type_1): Also check index_type for + template parms. + +1998-05-31 Jason Merrill + + * pt.c (tsubst): Always copy BINFO_BASETYPES. + +1998-05-29 scott snyder + + * tree.c (layout_basetypes): If we change TYPE_SIZE, change + TYPE_SIZE_UNIT too. + +1998-05-29 Mark Mitchell + + * decl.c (grokdeclarator): Don't complain about in-class + initialization of static consts if we don't really know the type + of the variable. + +1998-05-29 Jason Merrill + + * cp-tree.h (DECL_DESTRUCTOR_P): New macro. + * method.c (build_destructor_name): New fn. + * decl2.c (maybe_retrofit_in_chrg): Split out... + (grokclassfn): From here. Reorganize. + * decl.c (grok_ctor_properties): Make sure ctors for types with + vbases have the in_chrg parm. + * pt.c (instantiate_class_template): Update + TYPE_USES_VIRTUAL_BASECLASSES from tsubsted bases. Don't call + grok_*_properties. + (tsubst): Call grok_ctor_properties and maybe_retrofit_in_chrg. + +1998-05-28 Mark Mitchell + + * pt.c (instantiate_decl): Make test for whether or not static + variables should be instantiated early match its comment. + +1998-05-28 Jason Merrill + + * decl.c (start_decl): Always pedwarn about vacuously redeclaring + a member. + (start_function): Call check_default_args. + * decl2.c (grokfield): Don't call check_default_args. + (check_default_args): Use cp_error_at. + * lex.c (do_pending_defargs): Call check_default_args. + +1998-05-27 Brendan Kehoe + + * call.c (build_method_call): Make sure get_type_value returns + something before we try to use its TYPE_MAIN_VARIANT. + (build_scoped_method_call): Likewise. + +1998-05-27 Jason Merrill + + * typeck2.c (digest_init): Complain about getting a TREE_LIST to + initialize an array. + + * search.c (expand_upcast_fixups): Don't set DECL_CONTEXT and + DECL_VIRTUAL_P. + + * friend.c (do_friend): Clarify template warning. + +1998-05-27 Mark Mitchell + + * decl.c (shadow_label): Don't treat decls as identifiers. + (maybe_push_to_top_level): Clear shadowed_labels. + + * pt.c (instantiate_decl): Reset lineno and filename after calling + regenerate_decl_from_template. + + * decl.c (grokdeclarator): Don't try to use TYPE_OBSTACK on an + error_mark_node. + +1998-05-27 Kevin Buhr + + * parse.y (base_class): Use is_aggr_type, not IS_AGGR_TYPE. + +1998-05-26 Kriang Lerdsuwanakij + + * pt.c (process_template_parm): Accept TYPENAME_TYPE nodes. + (convert_nontype_argument): Handle cases when nontype template + parameters become classes after substitution. + +1998-05-26 Mark Mitchell + + * friend.c (is_friend): Use comptypes, rather than == to compare + types. Modify for new representation of template friends. + (make_friend_class): Likewise. + * pt.c (tsubst_friend_class): Undo 1998-05-21 change. Tweak. + (instantiate_class_template): Deal with template friends. + + * decl.c (store_parm_decls): Remove redundant call to + expand_main_function. + +1998-05-26 Benjamin Kosnik + + * decl.c (start_decl): Check for DECL_LANG_SPECIFIC before + DECL_USE_TEMPLATE. + +1998-05-26 Per Bothner + + * language_as_string: Handle lang_java. + +1998-05-26 Jason Merrill + + * decl.c (pushdecl): Don't copy the type_decl. + +1998-05-26 Martin v. Löwis + + * class.c (pushclass): Always store TYPE_MAIN_VARIANT in + current_class_type. + * decl.c (grokdeclarator): Put typedefs on the type's obstack. + + * parse.y (complex_direct_notype_declarator): Use $1 to access + scope of notype_qualified_id. + +1998-05-26 Dave Brolley + + * lex.c (parse_options,yy_cur,yy_lim): Add for cpplib. + (init_parse): Initialize cpplib interface. + + * Makefile.in (CXX_OBJS): Make sure dependencies never end with an + empty continuation. + +1998-05-26 Mark Mitchell + + * decl.c (pushtag): Avoid crashing on erroneous input. + +1998-05-25 Martin v. Löwis + + * decl.c (push_namespace): Only produce one unique name for + anonymous namespaces. + (get_unique_name): Remove. + +1998-05-25 Mark Mitchell + + * call.c (tourney): Don't do any extra comparisons. + + * decl2.c (build_anon_union_vars): Don't crash on empty sub-unions. + + * cp-tree.h (processing_template_parmlist): Declare. + * decl.c (pushtag): Don't call push_template_decl when we + shouldn't. + * pt.c (processing_template_parmlist): New variable. + (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): New macro. + (complete_template_args): Use it. + (add_to_template_args): Likewise. + (innermost_args): Likewise. + (tsubst): Likewise. + (begin_template_parm_list): Use processing_template_parmlist. + (end_template_parm_list): Likewise. + + * cp-tree.h (ANON_UNION_TYPE_P): New macro. + * decl.c (grokdeclarator): Use it. + * decl2.c (grok_x_components): Likewise. + * init.c (initializing_context): Likewise. + * method.c (do_build_copy_constructor): Likewise. + (do_build_assign_ref): Likewise. + * search.c (compute_access): Likewise. + * typeck.c (build_component_ref): Likewise. + + * decl.c (grokdeclarator): Don't give a cv-qualified version of an + unnamed type a typedef name "for linkage purposes". + + * pt.c (lookup_template_class): Don't look at + IDENTIFIER_CLASS_VALUE when there's no current_class_type. + + * method.c (build_overload_int): Handle error cases gracefully. + + * pt.c (instantiate_decl): Handle static member variables + correctly. + + * pt.c (tsubst): Use the tsubst'd type when producing new + TEMPLATE_PARM_INDEX nodes. + +1998-05-24 Mark Mitchell + + * tree.c (cp_tree_equal): Handle pointers to member functions. + + * call.c (maybe_handle_implicit_object): Handle QUAL_CONVs. Make + sure the type of the REF_BIND is a reference type. + (maybe_handle_ref_bind, compare_ics): Rename reference_type to + target_type for clarity. + + * parse.y (xcond): Move call to condition_conversion ... + * semantics.c (finish_for_cond): Here. + * parse.c: Regenerated. + +1998-05-24 Jason Merrill + + * decl.c (push_namespace): Namespaces have type void. + * typeck2.c (incomplete_type_error): Complain about namespace + used as expression. + * typeck.c (decay_conversion): Likewise. + +1998-05-24 Martin von Löwis + + * error.c (dump_expr): Support namespaces. + +1998-05-23 Jason Merrill + + * cp-tree.def: Add SRCLOC. + * cp-tree.h: Add struct tree_srcloc and accessor macros. + * tree.c (build_srcloc, build_srcloc_here): New fns. + * pt.c (add_pending_template): Use build_srcloc_here. + (push_tinst_level): Update last_template_error_tick before erroring. + (instantiate_decl): Restore lineno and input_filename before + calling add_pending_template. + * decl2.c (finish_file): Set up lineno and input_filename for + pending templates. + +1998-05-22 Jason Merrill + + * decl.c (lang_print_error_function): New fn. + (init_decl_processing): Set print_error_function to use it. + * errfn.c (cp_thing): Don't call maybe_print_template_context here. + + * call.c (maybe_handle_ref_bind): Propagate ICS_USER_FLAG and + ICS_BAD_FLAG. + + * cvt.c (ocp_convert): Don't set LOOKUP_NO_CONVERSION for + copy-initialization. + + * class.c (build_vtable_entry): Use int_fits_type_p. + (build_vtable): Pass a signed offset to build_vtable_entry. + (prepare_fresh_vtable, modify_one_vtable, fixup_vtable_deltas1, + set_rtti_entry): Likewise. + +1998-05-22 Per Bothner + + * cp-tree.h: Add comments documenting which LANG_FLAGS are used. + (C_TYPE_VARIABLE_SIZE, C_DECL_VARIABLE_SIZE): Removed, not used. + +1998-05-22 Jason Merrill + + * pt.c (print_template_context): Use fprintf instead of cp_error. + + * pt.c (determine_specialization): Just return an error_mark_node. + Also print the decl we want in error messages. If we complain, + return error_mark_node. + (tsubst_friend_function): Set lineno and input_filename so + error messages will be useful. + (instantiate_template): Just return an error_mark_node. + (check_explicit_specialization): Don't mess with a returned + error_mark_node. + + * pt.c (print_template_context): Add new argument. + (maybe_print_template_context): New fn. + (push_tinst_level): Increment tinst_level_tick. + (pop_tinst_level): Likewise. + * errfn.c (cp_thing): Call maybe_print_template_context. Use + xrealloc instead of xmalloc. + + * typeck.c (build_unary_op, CONVERT_EXPR): Propagate TREE_CONSTANT. + +1998-05-21 Jason Merrill + + * pt.c (tsubst_friend_class): Don't call redeclare_class_template + if the template we looked up is the same as the one we already + have. + +Thu May 21 11:54:44 1998 Dave Brolley + + * lex.c: (handle_sysv_pragma): FILE* parameter not used. + (cpp_reader,parse_in): Add for cpplib. + (check_newline): Call handle_sysv_pragma with new interface. + (check_newline): Call GET_DIRECTIVE_LINE, not get_directive_line. + + * input.c: (yy_cur,yy_lim,yy_get_token,GETC): Add for cpplib. + (sub_getch): Call GETC for cpplib. + + * cp-tree.h: (get_directive_line): Different prototype for cpplib. + (GET_DIRECTIVE_LINE): Macro wrapper for get_directive_line. + + * Makefile.in (CXX_OBJS): Add @extra_cxx_objs@ for cpplib. + +1998-05-21 Jason Merrill + + * decl2.c (maybe_make_one_only): New fn. + (import_export_vtable): Use it. + (import_export_decl): Likewise. + * pt.c (mark_decl_instantiated): Likewise. + +1998-05-21 Mark Mitchell + + * decl2.c (find_representative_member): Rename to ... + (build_anon_union_vars): New function. + (finish_anon_union): Fix stupidity of previous change. + +1998-05-20 Jason Merrill + + * decl.c (grokfndecl): Handle definition of specialization in + friend declaration. + + * error.c (dump_decl): Fix LOOKUP_EXPR handling. + +1998-05-20 Mark Mitchell + + * class.c (delete_duplicate_fields_1): Use DECL_DECLARES_TYPE_P + to look for type declarations. + (finish_struct): Deal with templates on the CLASSTYPE_TAGS list. + * cp-tree.h (DECL_DECLARES_TYPE_P): New macro. + (finish_member_class_template): Declare. + * decl.c (pushtag): Put member class templates on the + CLASSTYPE_TAGS list, just as for ordinary member classes. + (pushdecl_class_level): Use DECL_DECLARES_TYPE_P. + (lookup_tag): Look for IDENTIFIER_CLASS_VALUEs, just as with + IDENTIFIER_NAMESPACE_VALUEs. + * parse.y (component_decl): Move code to ... + * semantics.c (finish_member_class_template): New function. + Don't put member class templates on the list of components for a + class. + * parse.c: Regenerated. + * pt.c (classtype_mangled_name): Don't try DECL_CONTEXT on types. + In fact, don't use DECL_CONTEXT at all here. + +1998-05-20 Martin von Löwis + + * decl.c (record_unknown_type): New function. + (init_decl_processing): Call it for the unknown and global type + nodes. + +1998-05-20 Mark Mitchell + + * decl2.c (find_representative_member): New function. + (finish_anon_union): Use it. + + * cp-tree.h (MAIN_NAME_P): New macro. + (DECL_MAIN_P): Likwise. + * decl.c (pushdecl): Avoid crashing on redefinitions of `main'. + (grokfndecl): Use the new macros. + (grokdeclarator): Likewise. + (start_function): Likewise. + (store_parm_decls): Likewise. + (finsh_function): Likewise. + * friend.c (do_friend): Likewise. + * typeck.c (build_function_call_real): Likewise. + (build_unary_op): Likewise. + +Wed May 20 02:16:01 1998 Jason Merrill + + * decl2.c (start_objects, finish_objects, do_dtors, + do_ctors): Split out from... + (finish_file): ...here. + +Tue May 19 20:36:23 1998 Jason Merrill + + * tree.c (is_overloaded_fn): Don't abort on placeholders from + push_class_decls. + +Tue May 19 15:16:22 1998 Brendan Kehoe + + * class.c (is_empty_class): Return 0 if TYPE is an error_mark_node. + + * error.c (dump_expr): Handle an ARROW_EXPR. + +Tue May 19 15:13:39 1998 Mark Mitchell + + * decl.c (saveable_obstack): Declare. + (pushdecl): Copy TYPE_DECLs to the same obstack as the type they + declare, if necessary. + +Tue May 19 14:50:27 1998 Mark Mitchell + + * call.c (compare_qual): Remove. + (is_subseq): Tweak. + (is_properly_derived_from): New function. + (maybe_handle_ref_bind): Likewise. + (maybe_handle_implicit_object): Likewise. + (compare_ics): Modify substantially to bring into conformance with + the standard. + * cp-tree.h (TYPE_PTRMEMFUNC_OBJECT_TYPE): New macro. + (comp_cv_qualification): Declare. + (comp_cv_qual_signature): Likewise. + * typeck.c (comp_cv_qualification): Likewise. + (comp_cv_qual_signature): Likewise. + +Tue May 19 10:05:02 1998 Kaveh R. Ghazi + + * Makefile.in (parse.o): Depend on toplev.h. + + * class.c (typecode_p): Remove prototype and definition. + + * cp-tree.h (currently_open_class, is_empty_class, member_p): + Add prototype. + + * decl.c (push_overloaded_decl_top_level): Remove prototype and + definition. + + * errfn.c (cp_error): Cast function pointer `error' to (errorfn *) + in call to `cp_thing'. + (cp_warning): Likewise for function pointer `warning'. + + * except.c (do_function_call): Remove prototype and definition. + (call_eh_info): Wrap variable `t1' in macro NEW_EH_MODEL. + + * method.c (is_java_type): Add prototype and make it static. + + * parse.y: Include toplev.h. + + * pt.c (type_unification): Remove unused variable `arg'. + (instantiate_decl): Likewise for `save_ti'. + + * tree.c (propagate_binfo_offsets): Likewise for `base_binfos'. + +Tue May 19 02:43:25 1998 Jason Merrill + + * init.c (build_member_call): Handle template_ids. + * parse.y (primary): Add global_scope template_id. + +Mon May 18 23:22:52 1998 Jason Merrill + + * decl2.c (get_sentry): Use end_temporary_allocation. + Don't declare permanent_obstack. + +Mon May 18 12:28:44 1998 Mark Mitchell + + * parse.y (.finish_new_placement): New non-terminal. + (unary_expr, new_type_id): Use it. + * parse.c: Regenerated. + +Mon May 18 12:20:27 1998 Brendan Kehoe + + * pt.c (redeclare_class_template): Say where the original definition + of the template-parameter's default argument appeared. + +Mon May 18 03:00:57 1998 Jason Merrill + + * call.c (build_over_call): Tweak empty class handling. + + * decl.c (make_typename_type): Use currently_open_class. + + * class.c (instantiate_type): Don't abort on TREE_NONLOCAL_FLAG. + +Mon May 18 01:43:01 1998 Martin v. Löwis + + * decl.c (lookup_name_real): Don't look at IDENTIFIER_LOCAL_VALUE + for a type unless it is one. + + * class.c (finish_struct_1): Use OVL_CURRENT in error message. + +Mon May 18 01:24:08 1998 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (program_transform_name, objdir): Define. + + * Makefile.in (BISON): Use bison from the build tree if it exists. + (FLEX): Likewise. + +Sun May 17 14:52:08 1998 Martin v. Löwis + + * typeck.c (type_unknown_p): Return true for TREE_LIST also. + + * call.c (build_method_call): Use TYPE_MAIN_VARIANT on typedefs. + +Sun May 17 14:51:41 1998 Jason Merrill + + * call.c (build_scoped_method_call): Likewise. + +Sun May 17 13:53:48 1998 Mark Mitchell + + * init.c (build_new_1): Call suspend_momentary around the creation + of values that must be saved for exception handling. + * parse.y (.build_new_placement): New non-terminal. + (unary_expr, new_placement): Use it. + * parse.c: Regenerated. + +Sun May 17 12:32:08 1998 Jason Merrill + + * decl.c (duplicate_decls): Use CANONICAL_TYPE_VARIANT to compare + old and new types. + + * pt.c (tsubst): Make sure that BINFO_TYPE of new binfos is the + canonical type. + + * call.c (build_over_call): Don't use IS_SIGNATURE on a namespace. + +Fri May 15 20:28:00 1998 Jason Merrill + + * decl.c (start_decl): Revert problem change. + + * Makefile.in (CONFLICTS): Fix. + +Fri May 15 15:34:02 1998 Benjamin Kosnik + + * decl.c (duplicate_decls): Clean up, add DECL_DATA_AREA bits. + +Fri May 15 00:46:05 1998 Jason Merrill + + * class.c (finish_struct_1): Use BINFO_SIZE. + + * decl.c (start_decl): Use 'tem'. + +Thu May 14 16:30:47 1998 Andrew MacLeod + + * exception.cc: Include eh-common.h. + (struct cp_eh_info): Add eh_info struct with NEW_EH_MODEL. + (__cplus_type_matcher): First stab at new C++ runtime type matcher. + (__cp_push_exception): Initialize eh_info struct as well. + * except.c: Remove local structs and include eh-common.h. + (init_exception_processing): Set language and version codes. + (call_eh_info): Add presence of eh_info to runtime description of + struct cp_eh_info. + (expand_end_eh_spec): Call start_catch_block() and end_catch_block(). + * semantics.c (finish_try_block): Call start_catch_block() and + end_catch_block(). + * parse.y (function_try_block): Call start_catch_block() and + end_catch_block(). + +Thu May 14 12:27:34 1998 Brendan Kehoe + + * typeck.c (original_type): New function. + (common_type): Use it to get the DECL_ORIGINAL_TYPE for T1 and T2, + to see if they're actually the same. + * cp-tree.h (original_type): Declare. + +Wed May 13 12:54:30 1998 Kaveh R. Ghazi + + * Makefile.in (lex.o): Depend on output.h. + + * call.c (add_function_candidate): Remove unused variable `cand'. + (add_conv_candidate): Likewise. + (build_builtin_candidate): Likewise. + + * cp-tree.h: Add prototype for `types_overlap_p'. + + * decl.c (signal_catch): Mark parameter `sig' with ATTRIBUTE_UNUSED. + + * decl2.c (merge_functions): Remove unused variables `tmp' and + `tempn'. + + * error.c (expr_as_string): Mark parameter `v' with ATTRIBUTE_UNUSED. + (code_as_string): Likewise. + (language_as_string): Likewise. + (parm_as_string): Likewise. + (op_as_string): Likewise. + (assop_as_string): Likewise. + (cv_as_string): Likewise. + + * lex.c: Include output.h. + + * pt.c (type_unification): Cast first argument of `bzero' to a char*. + + * search.c (dfs_no_overlap_yet): Mark parameter `t' with + ATTRIBUTE_UNUSED. + + * tinfo.cc (__class_type_info::dcast): Change the type of variable + `i' from int to size_t. + + * typeck.c (language_lvalue_valid): Mark parameter `exp' with + ATTRIBUTE_UNUSED. + +Tue May 12 21:37:49 1998 Jason Merrill + + * error.c (dump_simple_decl): Use DECL_CLASS_SCOPE_P and/or + DECL_NAMESPACE_SCOPE_P. + (lang_decl_name): Likewise. + * pt.c (tsubst_friend_function, tsubst): Likewise. + * decl.c (pushdecl, redeclaration_error_message, start_decl, + cp_finish_decl, start_function): Likewise. + * class.c (finish_struct_1): Likewise. + * call.c (build_over_call): Likewise. + (compare_ics): Use DERIVED_FROM_P. + +Tue May 12 07:24:18 1998 Mark Mitchell + + * cp-tree.h (CANONICAL_TYPE_VARIANT): New macro. + * method.c (build_mangled_name): Use it. + (build_decl_overload_real): Likewise. + + * error.c (dump_simple_decl): New function, broken out from ... + (dump_decl): Use it. + +Mon May 11 11:38:07 1998 Mark Mitchell + + * ptree.c (lang_print_xnode): Add missing `break'. + + * pt.c (tsubst): Remove duplicate check for IDENTIFIER_NODE. + + * call.c (add_template_candidate): Adjust for changes to + fn_type_unification. + (add_template_candidate_real): Likewise. + (add_template_conv_candidate): Likewise. + (build_user_type_conversion_1): Likewise. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + * class.c (instantiate_type): Likewise. + * cp-tree.h (unification_kind_t): New type. + (fn_type_unification): Adjust prototype. + (type_unificaiton): Likewise. + * pt.c (UNIFY_ALLOW_NONE): New macro. + (UNIFY_ALLOW_MORE_CV_QUAL): Likewise. + (UNIFY_ALLOW_LESS_CV_QUAL): Likewise. + (UNIFY_ALLOW_DERIVED): Likewise. + (unify): Change prototype. + (maybe_adjust_types_for_deduction): New function. + (check_cv_quals_for_unify): Likewise. + (determine_specialization): Adjust. + (fn_type_unification): Likewise. + (type_unification): Likewise. + (type_unification_real): Likewise. Use + maybe_adjust_types_for_deduction. Fix mishandling of + back-unification of template functions passed as arguments. Pass + appropriate combination of UNIFY_ALLOW_* to unify. + (unify): Remove unused NTPARMS parameter. Use + check_cv_quals_for_unify. Remove bogus code that allowed + too-generous unification in order to adhere more closely to standard. + (get_bindings_real): Adjust. + (get_class_bindings): Likewise. + + * method.c (build_overload_identifier): Only use the innermost + template arguments when mangling. + * pt.c (tsubst_template_argument_vector): New function. + (complete_template_args): Deal with the situation where the + extra_args contain more than one level of arguments. + (lookup_template_class): Deal with member template classes, which + may have more than one level of arguments. + (tsubst): Don't tsbust into the TREE_TYPE of an IDENTIFIER_NODE. + Improve handling of member template classes. Use + DECL_PRIMARY_TEMPLATE instead of inline expansion. Use + tsubst_template_argument_vector where appropriate. + (regenerate_decl_from_template): Break out from ... + (instantiate_decl): Here. + + * lex.c (yyprint): Remove TYPENAME_ELLIPSIS. + * parse.h: Regenerated. + * parse.c: Really regenerated. + + * cp-tree.h (finish_unary_op_expr): New function. + (finish_id_expr): Likewise. + (begin_new_placement): Likewise. + (finish_new_placement): Likewise. + (finish_declarator): Likewise. + (finish_translation_unit): Likewise. + (finish_parmlist): Likewise. + (begin_class_definition): Likewise. + (finish_class_definition): Likewise. + (finish_default_args): Likewise. + (finish_inline_definitions): Likewise. + * parse.y (GCC_ASM_KEYWORD): Remove. + (TYPENAME_ELLIPSIS): Likewise. + * parse.c: Regenerated. + Use new functions in semantics.c in the actions for many rules. + * gxx.gperf (GCC_ASM_KEYWORD): Just use ASM_KEYWORD. + * hash.h: Regenerated. + * semantics.c (finish_expr_stmt): Allow NULL expr. + (finish_unary_op_expr): New function, containing + code previously in parse.y. + (finish_id_expr): Likewise. + (begin_new_placement): Likewise. + (finish_new_placement): Likewise. + (finish_declarator): Likewise. + (finish_translation_unit): Likewise. + (finish_parmlist): Likewise. + (begin_class_definition): Likewise. + (finish_class_definition): Likewise. + (finish_default_args): Likewise. + (finish_inline_definitions): Likewise. + +Sun May 10 23:43:13 1998 Mark Mitchell + + * typeck.c (build_c_cast): Don't decay arrays and functions to + pointer type when converting to a class type. + +Sun May 10 22:53:56 1998 Jason Merrill + + * cp-tree.h (DECL_NAMESPACE_SCOPE_P): New macro. + (DECL_CLASS_SCOPE_P): Likewise. + +Sun May 10 22:48:22 1998 H.J. Lu (hjl@gnu.org) + + * class.c (finish_struct_1): Use OVL_CURRENT on TREE_VEC_ELT. + * decl2.c (constructor_name_full): Likewise. + +Sun May 10 22:48:12 1998 Mike Stump + + * tree.c (mapcar): Add OVERLOAD support. + + * init.c (resolve_offset_ref): We must use basetype_path before we + destroy it with a call to convert_pointer_to. + +Sat May 9 14:44:37 1998 Jason Merrill + + * class.c (currently_open_class): New fn. + * decl.c (lookup_name_real): Use it. + * search.c (lookup_field): Likewise. + +Fri May 8 23:32:42 1998 Martin von Löwis + + * cp-tree.def (OVERLOAD): New node. + * cp-tree.h (BINDING_TYPE, SET_IDENTIFIER_GLOBAL_VALUE, + SET_IDENTIFIER_NAMESPACE_VALUE): Define. + (NAMESPACE_BINDING): Remove. + (IDENTIFIER_GLOBAL_VALUE, IDENTIFIER_NAMESPACE_VALUE): Use + namespace_binding. + (OVL_FUNCTION, OVL_CHAIN, OVL_CURRENT, OVL_NEXT, OVL_USED): + Define. + (tree_overload): New struct. + (IDENTIFIER_TYPE_VALUE): Use identifier_type_value. + (REAL_IDENTIFIER_TYPE_VALUE): Define. + (IDENTIFIER_HAS_TYPE_VALUE): Use IDENTIFIER_TYPE_VALUE. + (lang_decl_flags): Remove in_namespace. + (lang_decl): Remove chain. + (DECL_CHAIN, DECL_NAMESPACE): Remove. + (flag_honor_std): Declare extern. + (identifier_type_value, pushdecl_namespace_level, push_using_decl, + namespace_binding, set_namespace_binding, + lookup_function_nonclass, cat_namespace_levels, + set_decl_namespace, lookup_arg_dependent, binding_init, ovl_cons, + scratch_ovl_cons, ovl_member, build_overload): Declare. + (decl_list_length, get_namespace_id, current_namespace_id, + overloaded_globals_p): Remove. + (lookup_using_namespace, qualified_lookup_using_namespace): Change + return type. + (push_scratch_obstack): New macro. + * call.c (add_function_candidate): Special-case type of OVERLOAD node. + (build_user_conversions_1): Iterate using OVL_NEXT for ctors, + convs, fns. + (build_new_function_call): Iterate using OVL_CHAIN. + Print DECL_NAME in when reporting ambiguities. + (build_object_call): Iterate using OVL_NEXT for fns, convs. + (build_new_op): Call lookup_function_nonclass. + Iterate using OVL_NEXT. + (build_op_delete_call): Change detection of members. + Do not wrap TREE_LIST around fields and single global functions. + (build_over_call): Don't push a class level if the context is a + namespace. + (build_new_method_call): Iterate using OVL_NEXT. + * class.c (add_method): Chain overloaded members using + build_overload. Remove copying of method. + (grow_method): When iterating through the obstack, expect OVERLOAD + nodes. Chain overload members. + (finish_struct_methods): Chain overload members. Unpack OVERLOAD + nodes in call to get_baselinks. + (duplicate_tag_error): Expect OVERLOAD nodes when unchaining. + (finish_struct_1): Iterate over ctor using OVL_NEXT. Handle + fdecls that are OVERLOAD nodes. + (validate_lhs): New function. + (instantiate_type): Do not copy OVERLOAD nodes. Remove dead + code. Use DECL_NAME in error messages. Split code between global + and member function processing. + * decl.c (global_type_node): New static variable. + (in_std): New global. + (struct binding_level): New field usings. + (resume_binding_level): Assert that we are not in a class. + (toplevel_bindings_p): Just check for namespace_p or + pseudo_global. + (resume_level): Remove. + (find_binding): New function. + (binding_for_name): Call it. + (namespace_binding, set_namespace_binding): New functions. + (push_namespace): Associate binding level with new namespace, + resume_binding_level for existing namespace. Remove old code. + Fake std by counting. + (store_bindings): Use REAL_IDENTIFIER_TYPE_VALUE. + (maybe_push_to_top_level): Save current namespace. + (pop_from_top_level): Restore saved namespace. + (pop_namespace): Call suspend_binding_level. Remove old code. + (cat_namespace_levels): New function. + (set_identifier_type_value_with_scope): For namespace bindings, + set BINDING_TYPE, and use global_type_node. + Use REAL_IDENTIFIER_TYPE_VALUE otherwise. + (identifier_type_value): New function. + (pushtag): If no context, use current_namespace. + (duplicate_decls): Don't process DECL_CHAIN. + (pushdecl): Set DECL_CONTEXT to current_namespace, if it is not + already set. Never reset it to NULL_TREE. Lookup global variables + in their namespace. Push overloaded templates if they are on + namespace level. + (pushdecl_namespace_level): New function. + (pushdecl_top_level): Implement using pushdecl_namespace_level. + (pushdecl_using_decl): New function. + (overloaded_globals_p): Remove. + (push_overloaded_decl): Create OVERLOAD nodes, and iterate through + them. Use namespace_binding and set_namespace_value. + (redeclaration_error_message): Complain if the declarations come + from different namespaces. + (lookup_tag): On namespace level, look in the BINDING_TYPE. + (lookup_namespace_name): Pass tree_bindings from stack. Remove + old code. + (select_decl): New function. + (lookup_name_real): Call it for qualified and unqualified lookup. + Pass tree_bindings from the stack. + If prefer_type is 1, also accept namespaces. + (lookup_function_nonclass): New function. + (init_decl_processing): Set the binding level of the global + namespace to global_binding_level. + Build a proper type list for __builtin_apply. + Initialize std_node to "fake std" if flag_honor_std is set. + Initialize global_type_node. + Allocated bad_alloc in namespace std if flag_honor_std. + (define_function): Set the DECL_CONTEXT to the current_namespace. + (start_decl): A namespace is not considered as a context here. If + the DECL_CONTEXT is a namespace, push the decl. + (cp_finish_decl): Check for namespaces used as initializers. + (grokfndecl): Add namespace parameter. Remove processing of + DECL_CHAIN. + (grokvardecl): Add namespace parameter. + (grokdeclarator): Process SCOPEs that are namespaces. For + mangling, temporarily set the DECL_CONTEXT on anonymous structs. + (start_function): Check for contexts that are namespaces. + Set context for declarations that have not been pushed. + (store_parm_decls): Check for ::main only. + (finish_function): Likewise. + (start_method): Check for contexts that are namespaces. + (start_method): Remove DECL_CHAIN processing. + * decl2.c (flag_honor_std): Declare. + (lang_decode_option): Set it if -fhonor-std or -fnew-abi is given. + (decl_namespace_list): New static global. + (grok_x_components): Ignore namespaces as type contexts. + (check_classfn): Expect OVERLOAD nodes. + (grokfield): Remove DECL_CHAIN processing. + (finish_file): Call cat_namespace_levels. + (merge_functions): New function. + (ambiguous_decl): Rewrite. + (lookup_using_namespace): Produce tree_bindings. + (qualified_lookup_using_namespace): Likewise. + (set_decl_namespace, decl_namespace, current_decl_namespace, + push_decl_namespace, pop_decl_namespace): New functions. + (arg_lookup): New struct. + (add_function, arg_assoc_namespace, arg_assoc_class, + arg_assoc_type, arg_assoc_args, arg_assoc, lookup_arg_dependent): + New functions. + (get_namespace_id, current_namespace_id): Remove. + (do_toplevel_using_decl): Rewrite. + (do_class_using_decl): Complain about namespace qualifiers. + (do_using_directive): Sorry if not on namespace level. Complain + about unknown namespaces. + * error.c (dump_aggr_type): Check for namespace contexts. + * except.c (init_exception_processing): Push terminate into std. + * friend.c (is_friend): A namespace is not a context, here. + * init.c (expand_member_init): Remove DECL_CHAIN processing. + (build_offset_ref): Process OVERLOAD nodes. + * lang-specs.h (__HONOR_STD): Define if -fnew-abi or -fhonor-std. + * lex.c (identifier_type): Loop using OVL_CHAIN. + (see_typename): Set looking_for_typename to 2. + (real_yylex): Likewise. + (do_identifier): Expect OVERLOAD nodes instead of TREE_LISTs. + (do_scoped_id): Expect OVERLOAD nodes. + Change calling convention for qualified_lookup_using_namespace. + (build_lang_decl): Don't set in_namespace anymore. + * method.c (typevec_size): New global. + (build_overload_nested_name): Return if global_namespace. + Otherwise, always expect a declaration context. + (build_qualified_name): Likewise. + Make sure we don't write beyond typevec_size. + (build_decl_overload_real): Likewise. + Allocate one extra slot for the namespace. + (hack_identifier): Mark code dead. + Process OVERLOAD and NAMESPACE_DECL nodes. + * parse.y (program): Pop namespaces until in global namespace. + (extdef): In a using-declaration, don't discard the identifier if + there is no declaration. + (left_curly): Ignore type contexts which are namespaces. + (typename_sub2): Use IDENTIFIER_TYPE_VALUE to retrieve the type + used as scope. + * pt.c (template_class_depth): Expect types to be namespaces. + (determine_specialization): Simplify by expecting OVERLOAD nodes. + (push_template_decl): Push into namespace level. + Reset ctx if it is a namespace. + Set DECL_CONTEXT to current_namespace if not set already. + Ignore real contexts that are namespaces. + (mangle_class_name_for_template): Skip global_namespace. + Mangle other namespaces as declarations. + (lookup_template_function): Set type of OVERLOAD nodes to unknown. + (lookup_template_class): Push into namespace of context. + If the context is a namespace, set it to global_namespace. + Use id_context for mangling. + (for_each_template_parm): Handle OVERLOAD and NAMESPACE_DECL nodes. + (tsubst_friend_function): Ignore namespace contexts. + Push into namespace level. + (tsubst): Handle NAMESPACE_DECL nodes. + Remove DECL_CHAIN processing. + (type_unification_real): Recognize OVERLOAD instead of TREE_LIST nodes. + * ptree.c (print_lang_identifier): Print bindings. + (lang_print_xnode): Print OVERLOAD nodes. + * rtti.c (init_rtti_processing): Push type_info into std. + * search.c (lookup_fnfields_here): Expect OVERLOAD nodes. + (lookup_fnfields_1, get_virtuals_named_this, get_matching_virtual, + dfs_debug_mark, dfs_pushdecls, dfs_compress_decls, add_conversions, + lookup_fnfields_here): Likewise. + Process all nodes, instead of going through TREE_CHAIN. + * sig.c (build_signature_pointer_or_reference_type): Set context + to global_namespace. + (build_signature_table_constructor): Expect OVERLOAD nodes. + * spew.c (yylex): Save old setting of looking_for_typename. + * tree.c (decl_list_length): Remove. + (binding_init): New function. + (count_functions): Rewrite. + (is_overloaded_fn): Expect OVERLOAD nodes. + (really_overloaded_fn, get_first_fn, lvalue_type): Likewise. + (ovl_cons, scratch_ovl_cons, build_overload, build_overload_after, + ovl_member): New functions. + * typeck.c (require_complete_type): Expect OVERLOAD nodes. + (type_unknown_p): Likewise. + (require_instantiated_type): Likewise. + (build_component_ref): Declare code dead. + (build_x_function_call): Create and expect OVERLOAD nodes. + (build_function_call_real): Check for ::main only. + (build_unary_op): Likewise. Expect OVERLOAD nodes. + (convert_for_assignment): Check for TREE_LIST before accessing + TREE_VALUE. + * decl.c (duplicate_decls): Check for namespace bindings instead + of global bindings. + (pushdecl, push_overloaded_decl, lookup_tag, lookup_name_real, + lookup_name_current_level, start_decl, xref_tag, + finish_enum): Likewise. + * init.c (build_offset_ref): Likewise. + * search.c (lookup_field): Likewise. + (lookup_fnfields): Likewise. + (dfs_debug_mark): Likewise. + * decl.c (poplevel): Use SET_IDENTIFIER_TYPE_VALUE. + (poplevel_class, pop_from_top_level): Likewise. + * decl2.c (finish_method): Likewise. + * class.c (build_vtable): Use SET_IDENTIFIER_GLOBAL_VALUE. + * decl.c (record_builtin_type): Likewise. + (init_decl_processing, grokfndecl): Likewise. + * lex.c (get_time_identifier, do_identifier, do_scoped_id): Likewise. + (make_lang_type): Likewise. + * parse.y (make_thunk): Likewise. + * pt.c (tsubst): Likewise. + * tree.c (debug_binfo): Likewise. + * exception.cc, new.cc, new1.cc, new2.cc, tinfo.cc, tinfo.h, + tinfo2.cc, inc/new.h: Add std qualifications. + * inc/new: Wrap with namespace std if __HONOR_STD. + * inc/typeinfo: Likewise. + +Fri May 8 00:43:50 1998 Jason Merrill + + * call.c (build_user_type_conversion_1): Handle second_conv + properly for templates. + +Thu May 7 17:09:25 1998 Andrew MacLeod + + * method.c (build_decl_overload_real): Set TREE_USED flag to + zero for build_type_variants nodes as well. + +Wed May 6 19:27:09 1998 Jason Merrill + + * pt.c (tsubst): Don't tsubst the type of an IDENTIFIER_NODE. + +Wed May 6 16:49:48 1998 Jim Wilson + + * Makefile.in (call.o, class.o, decl.o, decl2.o, errfn.o, error.o, + except.o, expr.o, friend.o, init.o, lex.o, method.o, pt.o, repo.o, + rtti.o, search.o, semantics.o, sig.o, tree.o, typeck.o, typeck2.o, + xref.o): Add toplev.h dependencies. + +Wed May 6 16:44:58 1998 Jeffrey A Law (law@cygnus.com) + + * errfn.c (cp_error, cp_warning): Remove declarations for + error and warning respectively. + +Wed May 6 14:28:18 1998 Kaveh R. Ghazi + + * error.c: Convert to using ctype macros defined in system.h. + * method.c: Likewise. + * xref.c: Likewise. + * lex.c: Likewise. Also remove redundant system header stuff. + +Wed May 6 06:36:41 1998 Robert Lipe + + * call.c, class.c, decl.c, decl2.c, errfn.c, error.c, except.c, + expr.c, friend.c, init.c, lex.c, method.c, pt.c, repo.c, rtti.c, + search.c, semantics.c, sig.c, tree.c, typeck.c, typeck2.c, + xref.c: Add include of toplev.h. + +Wed May 6 02:33:39 1998 Jason Merrill + + * tree.c (perm_manip): Also regenerate the RTL of an extern. + (copy_to_permanent): Use end_temporary_allocation. + +Tue May 5 23:54:04 1998 Jason Merrill + + * init.c (expand_vec_init): The initialization of each array + element is a full-expression. + +Tue May 5 18:24:13 1998 Andrew MacLeod + + * method.c (build_mangled_name): Add a call to build_type_variant + to get the right type. + +Tue May 5 01:25:03 1998 Jason Merrill + + * Makefile.in: Add .SUFFIXES. + + * cp-tree.def: Remove NAMESPACE_DECL. + +Sun May 3 01:32:14 1998 Jason Merrill + + * call.c (build_over_call): Do evaluate arg even if it has empty + class type. + * decl.c (start_function): Don't push a member function. + +Thu Apr 30 18:59:23 1998 Jim Wilson + + * Makefile.in (g++FAQ.info): Put -o option before input file. + +Thu Apr 30 13:05:33 1998 Andrew MacLeod + + * gxxint.texi: Add info for squangling codes K and B. + +Tue Apr 28 13:22:01 1998 Mark Mitchell + + * semantics.c (begin_stmt_expr): Avoid duplicating the effect of + the expression in templates. + (finish_stmt_expr): Likewise. + +1998-04-28 Brendan Kehoe + + * decl2.c (ambiguous_decl): Fix NAME parm to be a tree, not int. + +Mon Apr 27 13:58:10 1998 Mark Mitchell + + * decl.c (maybe_push_to_top_level): Always clear + current_template_parms and processing_template_decl. + (pushtag): Remove check of current_class_type and some comments, + since maybe_push_to_top_level no longer creates confusion. + +Sun Apr 26 12:10:18 1998 Mark Mitchell + + * cp-tree.h (CLASSTYPE_IS_TEMPLATE): New macro. + (DECL_CLASS_TEMPLATE_P): Likewise. + (DECL_PRIMARY_TEMPLATE): Likewise. + (PRIMARY_TEMPLATE_P): Use it. + (push_template_decl_real): New function. + (redeclare_class_template): Take new template parameters as + input. + (is_specialization_of): New function. + (comp_template_args): Declare. + * decl.c (pushtag): Handle friend template classes. + (xref_tag): Likewise. Use new calling convention for + redeclare_class_template. + * decl2.c (grok_x_components): Handle friend templates. + * friend.c (is_friend): Use is_specialization_of where + appropriate. Deal with friend class templates. + (make_friend_class): Let a class template be friends with itself. + * pt.c (comp_template_args): Remove declaration. + (tsubst_friend_class): New function. + (push_template_decl_real): New function. + (push_template_decl): Use it. + (redeclare_class_template): Adjust for new calling convention. + (comp_template_args): Give it external linkage. + (instantiate_class_type): Use tsubst_friend_class to deal + with friend templates. + * typeck.c (comptypes): Use comp_template_args, rather than + expanding it inline. + * parse.y (component_decl): Handle a nested template type + like other component type declarations. + + * pt.c (check_explicit_specialization): Handle overloaded + constructors correctly. + + * pt.c (mabybe_get_template_decl_from_type_decl): New function. + (lookup_template_class): Use it. + +Thu Apr 23 21:19:06 1998 Jason Merrill + + * cp-tree.def: Add WRAPPER. USER_CONV now only has two ops. + * cp-tree.h: Add WRAPPER support. + * call.c (add_candidate): Split out from add_*_candidate fns. + (build_over_call): Take the candidate instead of function and args. + Enforce access control here. Emit overload warnings here. + (add_warning): New fn. + (joust): Add WARN parm. If not set, call add_warning instead of + printing a warning. Re-enable some warnings. + (tourney): Pass it. + (convert_like): Adjust. + (build_new_op): Adjust. + (build_new_function_call): Adjust. + (build_user_type_conversion_1): Adjust. + (USER_CONV_FN): Adjust. + * tree.c (build_expr_wrapper, build_expr_ptr_wrapper, + build_int_wrapper): New fns. + +Thu Apr 23 18:27:53 1998 Mark P. Mitchell + + * pt.c (unify): Fix typo in previous change. + +Thu Apr 23 09:32:58 1998 Jason Merrill + + * error.c (dump_type_real): Declare canonical_name. + + * typeck.c (comp_target_types): Fix PMFs. + +Wed Apr 22 13:24:48 1998 Mark Mitchell + + * class.c (finish_struct): Set TREE_PRIVATE and TREE_PROTECTED for + the DECL_RESULTs of a member TEMPLATE_DECL, not just the + TEMPLATE_DECL. + + * pt.c (tsubst): Decrease the template-level of + TEMPLATE_TEMPLATE_PARMS. Likewise for the DECL_INITIAL of a + TEMPLATE_PARM_INDEX. + (template_decl_level): New function. + (unify): Make sure to record unifications for template + parameters, even when the parameters exactly match the arguments. + Combine duplicated code for TEMPLATE_TEMPLATE_PARMs and + TEMPLATE_TYPE_PARMS. Don't try to unify template parameters that + aren't from the level we're currently working on. + +Tue Apr 21 22:00:04 1998 Mark Mitchell + + * errfn.c (cp_thing): Use xrealloc, not xmalloc, to copy memory. + + * decl2.c (check_member_template): Set DECL_IGNORED for member + class templates, too. + + * decl2.c (grokfield): Remangle the name of a member TYPE_DECL. + +Tue Apr 21 18:59:11 1998 Benjamin Kosnik + + * decl.c (duplicate_decls): Only check DECL_FRIEND_P if function. + +Tue Apr 21 14:22:00 1998 Jeffrey A Law (law@cygnus.com) + + * cp-tree.h (intTI_type_node, unsigned_intTI_type_node): Declare. + * decl.c (intTI_type_node, unsigned_intTI_type_node): Define. + (init_decl_processing): Handle TI types. + * typeck.c (unsigned_type, signed_type): Handle TI types. + +Sat Apr 18 15:25:21 1998 Jim Wilson + + * g++spec.c (lang_specific_driver): New argument in_added_libraries. + New local added_libraries. Increment count when add library to + arglist. + +Fri Apr 17 21:25:00 1998 Mark Mitchell + + * cp-tree.h (type_as_string_real): New function. + * pt.c (mangle_class_name_for_template): Use it. + * error.c (dump_aggr_type): Change prototype. + (dump_type_prefix): Likewise. + (dump_type_suffix): Likewise. + (dump_type_real): Convert from dump_type. If desired, the + "canonica" name of a typedef, i.e., the name of the underlying + type, can be printed. + (dump_type): Call dump_type_real. + +Fri Apr 17 14:30:45 1998 Jason Merrill + + * decl2.c (lang_decode_option): -fnew-abi implies -fvtable-thunks. + + * typeck.c (comp_target_types): Tweak pedantic case. + (comp_target_parms): Tweak pedantic case. Clean up somewhat. + Return -1 or 1 instead of 1 or 2. + (compparms): Remove STRICT handling. + (convert_for_assignment): Fix handling of pmfs. + +Fri Apr 17 14:04:16 1998 Mark Mitchell + + * typeck.c (comp_target_types): Handle references like pointers. + (comp_target_parms): Note that return code from comp_target_types + can be negative to indicate failure. + +Fri Apr 17 09:10:52 1998 Andreas Schwab + + * Make-lang.in (c++.all.build): Don't depend on $(DEMANGLER_PROG), + which requires a working target compiler to build. + +Fri Apr 17 08:57:35 1998 Jeffrey A Law (law@cygnus.com) + + * tree.c (avoid_overlap): Add prototype. + + * spew.c (num_tokens): Add prototype. + (nth_noken, add_token, consume_token, debug_yychar): Likewise. + + * search.c (dfs_check_overlap): Add prototype. + (dfs_no_overlap_yet): Likewise. + + * pt.c (original_template): Add prototype. + (inline_needs_template_parms): Likewise. + (push_inline_template_parms_recursive): Likewise. + (retrieve_specialization, register_specialization): Likewise. + (print_candidates, reduce_template_parm_level): Likewise. + (build_template_decl, mark_template_parm): Likewise. + (tsubst_friend_function, get_bindings_real): Likewise. + + * method.c (start_squangling): Add prototype. + (end_squangling, check_ktype, issue_ktype): Likewise. + (build_overloaded_scope_ref, check_btype): Likewise. + (build_mangled_template_parm_index): Likewise. + + * lex.c (init_cpp_parse): Add prototype. + (handle_cp_pragma, handle_sysv_pragma): Likewise. + (reduce_cmp, token_cmp): Likewise. + + * except.c (call_eh_info): Add prototype. + (push_eh_info, get_eh_info, get_eh_value, get_eh_type): Likewise. + (get_eh_caught, get_eh_handlers, do_pop_exception): Likewise. + + * decl2.c (is_namespace_ancestor): Add prototype. + (namespace_ancestor, add_using_namespace): Likewise. + (ambiguous_decl): Likewise. + + * decl.c (indent): Add prototype. + + * call.c (add_template_candidate_real): Add prototype. + +Fri Apr 17 01:57:12 1998 Jason Merrill + + * decl2.c (build_expr_from_tree): Just return a PMF. + +Fri Apr 17 00:45:12 1998 Mark Mitchell + + * typeck2.c (process_init_constructor): Don't strip cv-qualifiers + when doing initializations. + + * pt.c (unify): Use comptypes to compare type args. + +Fri Apr 17 00:24:22 1998 Jason Merrill + + * decl.c (duplicate_decls): Fix check for when it's safe to free + the new decl. + + * pt.c (mangle_class_name_for_template): Don't pass a typedef type + to type_as_string. + +Thu Apr 16 17:47:30 1998 Jeffrey A Law (law@cygnus.com) + + * pt.c (build_template_parm_index): Add prototype. + + * search.c (my_tree_cons): Don't clear words outside the + newly allocated node. + +Wed Apr 15 15:34:44 1998 Dave Brolley + + * lex.c (init_parse): Now returns char* containing the filename. + +Wed Apr 15 13:20:06 1998 John Carr + Jeff Law + + * errfn.c: Rework to avoid problems when HOST_WIDE_INT is longer + than a pointer. + +Sun Apr 12 22:31:19 1998 Richard Kenner + + * cvt.c (cp_convert_to_pointer): Use TYPE_PRECISION. + +Fri Apr 10 12:16:49 1998 Benjamin Kosnik + + * decl.c (duplicate_decls): Don't warn for redundant decls if + friend: let add_friend take care of it. + +Thu Apr 9 02:40:48 1998 Jason Merrill + + * sig.c (build_signature_pointer_constructor): Don't set + TREE_HAS_CONSTRUCTOR for a signature pointer. + * cvt.c (ocp_convert): Don't force a temporary for internal structs. + * init.c (resolve_offset_ref): Warn about implicit & on pmfs + here, too. + * typeck.c (build_unary_op): Only allow taking the address of a + real constructor. + * typeck2.c (digest_init): Simplify. + (store_init_value): Don't pedwarn about using { } for pmfs. + +Thu Apr 9 22:16:57 1998 Per Bothner + + * cp-tree.h (start_decl): Update prototype. + * decl.c (start_decl): Like the C version, new parameters + for the attributes. Call cplus_decl_attributes here, + (pushdecl): Like C version, do build_type_copy if TYPE_DECL, + (grokdeclarator): Pass NULL for new start_decl arguments. + * pt.c (tsubst_expr): Likewise. + * parse.y: Merge cplus_decl_attribute calls into start_decl calls. + * typeck.c (common_type): Check TYPE_MAIN_VARIANT. + * lex.c (build_lang_decl): Add lang_name_java. + * class.c (push_lang_context): Add lang_name_java. + * method.c (build_mangled_name): Check for is_java_type. + +Thu Apr 9 22:16:57 1998 Benjamin Kosnik + + * decl.c (grokdeclarator): Check TYPE_MAIN_VARIANT. + * call.c (build_scoped_method_call): Check for TREE_CODE for + VOID_TYPE instead of type == void_type_node. + (build_method_call): Likewise. + * decl.c (lookup_name_real): Likewise. + (grokdeclarator): Likewise. + (start_decl): Likewise. + (grokparms): Likewise. + (start_function): Likewise. + (finish_function): Likewise. + (start_method): Likewise. + +Thu Apr 9 00:18:44 1998 Dave Brolley (brolley@cygnus.com) + + * lex.c (finput): New variable. + (init_cpp_parse): Renamed from init_parse. + (init_parse): Handle !USE_CPPLIB. Call init_cpp_parse when finished. + (finish_parse): New function. + * cp-tree.h (init_lex, init_parse): Remove declarations. + +Mon Apr 6 02:25:05 1998 Jason Merrill + + * call.c (build_call): Still evaluate the actual argument. + * class.c (is_empty_class): Update for -fnew-abi. + + * decl2.c: -fnew-abi implies -fsquangle. + + * method.c (do_build_assign_ref): Don't do anything to copy + an empty class. + (do_build_copy_constructor): Likewise. + * call.c (build_over_call): Likewise. + +Sat Apr 4 18:43:58 1998 Jason Merrill + + * tree.c (avoid_overlap): Return a value. + +Sat Apr 4 12:52:35 1998 Jeffrey A Law (law@cygnus.com) + + * method.c (check_btype): Add missing argument to xrealloc. + (check_ktype): Likewise. + +Fri Apr 3 02:22:59 1998 Jason Merrill + + Implement empty base optimization. + * class.c (finish_struct_1): Add vbase fields earlier. Set + CLASSTYPE_SIZE of an empty base to 0. Types with bases can be empty. + * search.c (dfs_check_overlap, dfs_no_overlap_yet): New fns. + (types_overlap_p): New fn. + * tree.c (avoid_overlap): New fn. + (build_base_fields): Use it to avoid overlapping empty bases. + * cp-tree.h, decl2.c, lang-options.h: Add -fnew-abi. + + * decl.c (cplus_expand_expr_stmt): Strip unused INDIRECT_REFs. + + Re-implement allocation of base class subobjects. + * tree.c (unshare_base_binfos): New fn. + (layout_basetypes): Use it. Now handles offsets of both virtual and + non-virtual bases, after layout_type. + (layout_vbasetypes): Remove. + (build_base_fields): Generate FIELD_DECLs for each non-virtual base. + (build_vbase_pointer_fields): Split out from old layout_basetypes. + * class.c (finish_base_struct): Lose offset handling code. + Move nonvdtor warning here. Don't mess with t_binfo anymore. + (finish_struct_1): Don't mess with t_binfo anymore. Use fns above. + * cp-tree.h: Adjust. + +Thu Apr 2 14:25:13 1998 Jason Merrill + + * cp-tree.h: Lose CLASSTYPE_VBASE_SIZE, some unused stuff. + * decl.c, decl2.c, pt.c, ptree.c, lex.c: Likewise. + * class.c (duplicate_tag_error): Likewise. + (finish_struct_1): Set CLASSTYPE_SIZE, CLASSTYPE_MODE, CLASSTYPE_ALIGN. + * tree.c (layout_vbasetypes): Update from layout_record, remove + var_size support, use CLASSTYPE_SIZE instead of CLASSTYPE_VBASE_SIZE. + (layout_basetypes): Likewise. + +Wed Apr 1 18:22:25 1998 Jeffrey A Law (law@cygnus.com) + + * class.c, Make sure system.h is included just after config.h. + Delete lingering stdio and errno references too. + * decl.c, errfn.c, parse.y, ptree.c search.c, xref.c: Likewise. + +Wed Apr 1 15:38:36 1998 Jason Merrill + + * friend.c (is_friend): Fix access control for local classes. + + * class.c (is_empty_class): New fn. + * call.c (build_call): Don't pass empty class objects to a function. + +Wed Apr 1 14:58:35 1998 Mark Mitchell + + * call.c (build_over_call): Do name resolution for default + arguments of function templates in the scope of the templates. + +Tue Mar 31 13:43:57 1998 Jeffrey A Law (law@cygnus.com) + + * call.c: Include system.h. Remove includes, declarations and + defines provided by system.h. + * class.c, cvt.c, decl.c, decl2.c, errfn.c error.c: Likewise. + * except.c, expr.c friend.c, g++spec.c, init.c, input.c: Likewise. + * lex.c, parse.y, pt.c, ptree.c repo.c rtti.c, search.c: Likewise. + * semantics.c, sig.c, spew.c, tree.c, typeck.c: Likewise. + * typeck2.c, xref.c: Likewise. + * Makefile.in: Dependencies updated as appropriate. + * Make-lang.in: Likewise. + +Mon Mar 30 12:15:00 1998 Mark Mitchell + + * pt.c (fn_type_unification): Allow incomplete unification without + an immediate error message. + +Mon Mar 30 08:55:42 1998 Jason Merrill + + * tree.c (member_p): New fn. + * decl2.c (finish_file): Only set DECL_STATIC_FUNCTION_P for + initializing class members. + + * cp-tree.def (TEMPLATE_PARM_INDEX): Class 'x'. + * ptree.c (lang_print_xnode): Handle TEMPLATE_PARM_INDEX. + + * call.c (build_method_call): Handle non-scoped destructors, too. + * pt.c (tsubst_copy): Likewise. + + * pt.c (print_template_context): Split out... + (push_tinst_level): ...from here. + + * friend.c (is_friend): Don't pass a type to decl_function_context. + + * typeck.c (convert_for_initialization): Always hand off + conversions to class type. + +Sun Mar 29 20:01:59 1998 Jason Merrill + + * friend.c (is_friend): Local classes have the same access as the + enclosing function. + +Sun Mar 29 00:47:32 1998 Jeffrey A Law (law@cygnus.com) + + * typeck.c (expand_target_expr): Delete dead function. + + * search.c: Put various prototypes inside #ifdef MI_MATRIX. + + * repo.c (save_string): Delete dead function. + + * method.c (thunk_printable_name): Delete dead function. + + * lex.c (yynextch): Delete dead function. + + * expr.c (tree_extract_aggr_init): #if 0 out. + + * except.c (do_unwind): Delete dead function. + (easy_expand_asm): Likewise. + + * cvt.c (build_conversion_type_1): Delete dead function. + + * cp-tree.h (push_expression_obstack): Declare. + + * call.c (source_type): #if 0 out. + + * class.c (alter_access): Remove unused label. Add braces + around empty else clause. + + * lex.c (yyprint): Fix argument to printf. + +Sat Mar 28 17:43:52 1998 Mark Mitchell + + * pt.c (tsubst): Clear TREE_USED for new FUNCTION_DECLs. + + * pt.c (instantiate_class_template): Make sure template + arguments are permanent. + * init.c (resolve_offset_ref): Don't go looking around in + template types. + + * semantics.c: Add routines to handle expressions, and some + declaration processing. + * parse.y: Use them. + (current_class_depth): Move declaration to cp-tree.h. + * parse.c: Regenerated. + * cp-tree.h: Use them. + (current_class_depth): Declare. + * pt.c (tsubst_copy): Use begin_stmt_expr and finish_stmt_expr. + +Fri Mar 27 20:23:18 1998 Mark Mitchell + + * error.c (dump_decl): Be a bit more explicit with template + type arguments, when verbose. + +Fri Mar 27 18:16:40 1998 Jason Merrill + + * inc/exception: Reorder closing braces. + +Fri Mar 27 13:22:18 1998 Mark Mitchell + + * pt.c (redeclare_class_template): New function. + * cp_tree.h (redeclare_class_template): Declare it. + * decl.c (xref_tag): Use it. + +Thu Mar 26 11:16:30 1998 Jason Merrill + + * call.c (build_over_call): Check IS_AGGR_TYPE, not + TYPE_LANG_SPECIFIC. + * typeck.c (convert_arguments): Likewise. + + * decl.c (grokdeclarator): Remove const and volatile from type after + setting constp and volatilep. + + * class.c (finish_struct_1): Don't warn about bool bitfield larger + than one bit. + +Thu Mar 26 10:25:52 1998 Mark Mitchell + + * pt.c (convert_nontype_argument): STRIP_NOPS where appropriate. + +Thu Mar 26 10:24:05 1998 Mark Mitchell + + * call.c (build_object_call): Complain about ambiguous operator(), + rather that crashing. + (build_new_op): Likewise. + (build_op_delete_call): Likewise. + +Thu Mar 26 10:23:24 1998 Mark Mitchell + + * cvt.c (perform_qualification_conversions): Use comp_target_types + instead of comp_ptr_ttypes. + +Wed Mar 25 16:10:50 1998 Mark Mitchell + + * cp-tree.h (enforce_access): Declare. + * call.c (enforce_access): Make it extern, not static. + * class.c (alter_access): Use enforce_access; modify code for ISO + compliance, rather than ARM rules. + +Wed Mar 25 12:10:45 1998 Kriang Lerdsuwanakij + + * cp-tree.h: Fix typo. + +Wed Mar 25 02:01:02 1998 Jason Merrill + + * expr.c (cplus_expand_expr): Only do PCC_STATIC_STRUCT_RETURN thing + if (aggregate_value_p (type)). + + * decl2.c (constructor_name_full): Handle TYPENAME_TYPE. + +Tue Mar 24 16:12:01 1998 Mark Mitchell + + * tree.c (mapcar): When dealing with a DECL, use it's constant + value, if any. + * pt.c (lookup_template_class): Don't mangle the names of template + classes whose arguments are unknown. + + * pt.c (tsubst_expr): Handle GOTO_STMT correctly. + +Tue Mar 24 12:21:55 1998 Benjamin Kosnik + + * decl.c (init_decl_processing): Set TYPE_PRECISON for bools to 1. + +Tue Mar 24 12:21:48 1998 Jim Wilson + + * decl.c (init_decl_processing): Initialize TYPE_MAX_VALUE for + boolean_type_node to 1. + +Tue Mar 24 10:23:47 1998 Mark Mitchell + + * error.c (dump_expr): Remove unused variable `l'. + + * pt.c (for_each_template_parm): New function, created by + converting uses_template_parms. + (tree_fn_t): New typedef. + (uses_template_parms): Use it. + (mark_template_parm): New function. + (push_template_decl): Check that the argument list of a partial + specialization uses all the template parameters. + + * Make-lang.in (c++filt): Don't delete cxxmain.c after we're done + with it; we might want it for debugging. + * cp-tree.h (type_unification): Change interface. + * class.c (finish_struct_1): Skip nested template types, just like + ordinary nested types. + (instantiate_type): Use new interface to type_unification. + * lex.c (init_lex): Add __sz as opname for sizeof. + * method.c (build_overload_scope_ref): New function. + (build_overload_int): Handle complex expressions. Set + numeric_output_need_bar if necessary. + (build_overload_value): Handle non-PARM_DECL nodes; this + routine is now used by build_overload_int. Remove some + assignments to numeric_output_need_bar. Use + build_overload_scope_ref. + (build_qualified_name): Note that some template mangled names end + with digits, and set numeric_output_need_bar appropriately. Use + build_underscore_int. + * pt.c (unify): Change interface. + (type_unification_real): Likewise. + (determine_specialization): Use new interfaces. + (tsubst): Deal gracefully with situations in which the argument + vector is not fully filled. + (fn_type_unification): Use new interfaces. + (type_unification): Likewise. Remove NOP_EXPR hack. + (type_unification_real): Likewise. + (unify): Likewise. Deal with unification of complex expressions. + +Mon Mar 23 12:24:37 1998 Jason Merrill + + * pt.c (complete_template_args): Initialize skip properly. + + * decl.c (make_typename_type): Revert. + (make_implicit_typename): Remove. + (lookup_name_real): Don't call it. Call lookup_field if we see a + TYPE_DECL from a template base. + * search.c (lookup_field): Do implicit typename stuff. + +Sun Mar 22 00:50:42 1998 Nick Clifton + Geoff Noer + + * Makefile.in: Various fixes for building cygwin32 native toolchains. + * Make-lang.in: Likewise. + +Fri Mar 20 18:07:39 1998 Kriang Lerdsuwanakij + + * pt.c (tsubst, TEMPLATE_TEMPLATE_PARM): Simplify. + +Fri Mar 20 10:42:07 1998 Jason Merrill + + * decl.c (make_implicit_typename): Rewrite removed code. + (make_typename_type): Call it if the type we look up comes from + a base that uses template parms. + + * pt.c (complete_template_args): Rewrite. + (tsubst, FUNCTION_DECL): Use it. + +Fri Mar 20 08:12:43 1998 H.J. Lu (hjl@gnu.org) + + * semantics.c (finish_asm_stmt): Fix combine strings. Call + c_expand_asm_operands () if output_operands, input_operands or + clobbers is not NULL_TREE. + +Fri Mar 20 00:10:19 1998 Kriang Lerdsuwanakij + + * pt.c (complete_template_args): New function. + (get_bindings): Deal with specializations of function templates + with return type containing parameters from outer class + templates. + (tsubst, TEMPLATE_TEMPLATE_PARM): When reducing parameter level, + substitute arguments and compose a new type. + +Thu Mar 19 19:01:48 1998 Mark Mitchell + + * pt.c (tsubst): Clear DECL_PENDING_INLINE_INFO for new + FUNCTION_DECLs. + +Thu Mar 19 11:51:58 1998 Jason Merrill + + * decl.c (make_implicit_typename): Lose useless code. + + * call.c (standard_conversion): Handle A* -> const A* properly. + + * pt.c (get_bindings_real): Rename from get_bindings. Add + check_rettype parm. + (get_bindings): Pass 1. + (get_bindings_overload): Pass 0. + +Wed Mar 19 09:08:12 1998 Mark Mitchell + + * pt.c (check_explicit_specialization): When reverting a static + member function, also remove the `this' parameter from + last_function_parms. + +Thu Mar 19 02:27:48 1998 Jason Merrill + + * pt.c (tsubst_copy, CONST_DECL): Don't bother tsubsting + a function context. + + * decl.c (store_bindings): Use free_binding_vecs. + (pop_from_top_level): Likewise. + +Wed Mar 18 12:41:43 1998 Jason Merrill + + * decl.c (make_implicit_typename): Only change the type of a + TYPENAME_TYPE. + +Wed Mar 18 10:09:51 1998 Mark Mitchell + + * semantics.c: New file, containing routines to perform the + semantic phase of parsing. + * parse.y: Use it. + * pt.c (tsubst_expr): Likewise. + * cp-tree.h: Declare the various functions in semantics.c. + Provide macros to access _STMT tree nodes. + * cp-tree.def: Add ASM_STMT tree node. + * Makefile.in, Make-lang.in: Add dependencies on and for + semantics.c. + +Wed Mar 18 00:24:10 1998 Jason Merrill + + * pt.c (push_template_decl): Only check primary templates. + + * pt.c (check_explicit_specialization): Complain about default args + in explicit specialization. + + * parse.y (nomods_initdcl0): Also call cp_finish_decl for a + constructor_declarator. + +Tue Mar 17 14:44:54 1998 Mark Mitchell + + * typeck2.c (build_x_arrow): Don't crash when an aggregate type + has no overloaded operator ->. + + * call.c (build_field_call): Don't crash when presented with a + field that is actually a nested type. + + * decl.c (pushtag): Deal with friend class injection in local + classes. + + * call.c (build_object_call): Don't crash if OBJ is a + pointer-to-member-function. + +Tue Mar 17 11:40:26 1998 Jason Merrill + + * pt.c (push_template_decl): Complain about template with C linkage, + anonymous template class. + +Mon Mar 16 12:10:39 1998 Jason Merrill + + * class.c (pushclass): Only use the mi_matrix stuff #ifdef MI_MATRIX. + * search.c: Likewise. + + * lex.c (do_pending_defargs): Only call + maybe_{begin,end}_member_template_processing for FUNCTION_DECLs. + + * parse.y (initdcl0_innards): Move maybeasm back into initdcl0 et al. + +Mon Mar 16 10:47:22 1998 Mark Mitchell + + * parse.y: Deal with CONSTRUCTORS in new_initializers. + +Mon Mar 16 10:54:21 1998 Mark Mitchell + + * pt.c (tsubst_copy): Deal with BIND_EXPR in a way that more + closely mimics the behavior in parse.y. + (tsubst_expr): Return the resulting BLOCK when making a tsubst'ing + into a compound statement. + +Sun Mar 15 02:07:26 1998 Jason Merrill + + * cp-tree.h (TEMPLATE_PARMS_FOR_INLINE): New macro. + * pt.c (inline_needs_template_parms): New fn. + (original_template): New fn. + (push_inline_template_parms_recursive): New fn. + (maybe_begin_member_template_processing): Use them. + (maybe_end_member_template_processing): Likewise. + (is_member_or_friend_template): Rename to is_member_template. + Member functions of local classes are never member templates. + +Sun Mar 15 01:14:22 1998 Kriang Lerdsuwanakij + + * lex.c (do_identifier): Handle TEMPLATE_DECL that was + added in the class scope to catch redefinition error. + + * pt.c (reduce_template_parm_level): Also copy + the DECL_TEMPLATE_PARMS field. + +Sun Mar 15 10:54:08 1998 Mark Mitchell + + * pt.c (tsubst): Clear TYPE_REFERENCE_TO when creating a + reduced-level template type parameter. + +Sun Mar 15 12:26:02 1998 Manfred Hollstein + + * cp-tree.h (struct lang_decl_flags): Add needs_final_overrider. + (DECL_NEEDS_FINAL_OVERRIDER_P): New macro. + * class.c (override_one_vtable): Set DECL_NEEDS_FINAL_OVERRIDER_P. + * decl.c (duplicate_decls): Propagate it. + * typeck2.c (abstract_virtuals_error): Use two loops to emit + abstract virtual functions and virtual functions which need a + final overrider separately. + +Thu Mar 12 09:39:40 1998 Manfred Hollstein + + * lang-specs.h: Properly put brackets around array elements in + initializer. + + * typeck.c (build_binary_op_nodefault): Correctly place parens around + && and || in expression. + +Thu Mar 12 09:26:04 1998 Manfred Hollstein + + * call.c (default_parm_conversions): Remove prototype definition. + (build_method_call): Remove unused variable result. + + * cvt.c (ocp_convert): Remove unused variable conversion. + + * decl2.c (ambiguous_decl): Add explicit parameter definition for name. + + * except.c (do_unwind): #if 0 definition of unused variables fcall + and next_pc. + + * expr.c (extract_scalar_init): #if 0 prototype and function + definition. + + * init.c (expand_aggr_init_1): Remove unused variable init_type. + (build_new_1): Remove unused variable t. + + * pt.c (instantiate_class_template): Remove unused variable newtag; + cast called function return value to void. + (do_decl_instantiation): Remove unused variables name and fn. + + * tree.c (get_type_decl): Add default return to shut up compiler from + complaining control reaches end of non-void function. + + * typeck.c (build_x_conditional_expr): Remove unused variable rval. + +Thu Mar 12 09:12:15 1998 Manfred Hollstein + + * call.c (default_parm_conversions): Remove prototype definition. + (build_method_call): Remove unused variable result. + (build_over_call): Add default case in enumeration switch. + +Thu Mar 12 08:39:13 1998 Manfred Hollstein + + * decl2.c (lang_decode_option): Change j's type to size_t. + + * tree.c (layout_vbasetypes): record_align and desired_align are of + type unsigned int; const_size and nonvirtual_const_size likewise. + +Wed Mar 11 07:25:20 1998 Mark Mitchell + + * parse.y (new_initializer): Make sure all initializers are + lists. + +Tue Mar 10 07:32:36 1998 Mark Mitchell + + * decl2.c (import_export_decl): Mark tinfo functions for + cv-qualified versions of class types as DECL_NOT_REALLY_EXTERN. + +Fri Mar 6 23:27:35 1998 Jeffrey A Law (law@cygnus.com) + + * method.c: Fix typo. + +Fri Mar 6 10:06:59 1998 Kaveh R. Ghazi + + * method.c: Include "system.h" to get stdlib.h, stdio.h, + ctype.h, string.h, etc. + (issue_nrepeats): Add default case in enumeration switch. + (check_btype): Likewise. + (process_overload_item): Likewise. + + * Makefile.in (method.o): Depend on system.h. + +Wed Mar 4 22:26:53 1998 Andreas Schwab + + * lex.c (do_scoped_id): Fix parenthesizing. + +Wed Mar 4 12:11:53 1998 Michael Tiemann + + * rtti.c (get_tinfo_fn_dynamic): If this function is called an + FLAG_RTTI is unset, initialize type info machinery and continue + with FLAG_RTTI enabled. + (get_typeid): Likewise. + +Wed Mar 4 11:47:55 1998 Jason Merrill + + * typeck.c (unary_complex_lvalue): &D::i has type B::* if i comes + from B. + +Wed Mar 4 11:28:08 1998 Mark Mitchell + + * pt.c (finish_member_template_decl): Deal more gracefully with + invalid declarations. + +Tue Mar 3 01:38:17 1998 Jason Merrill + + * cvt.c, decl.c, decl2.c, init.c, rtti.c, typeck.c, typeck2.c, + cp-tree.h: Clean up more old overloading code, old RTTI code, and + some formatting quirks. + + * call.c, class.c, cp-tree.h, cvt.c, decl.c, init.c, lex.c, + method.c, pt.c, ptree.c, typeck.c: Remove support for + -fno-ansi-overloading and overloading METHOD_CALL_EXPR. + * class.h: Remove. + * Makefile.in: Adjust. + + * pt.c (unify): Don't allow reduced cv-quals when strict. + + * call.c, class.c, pt.c, cp-tree.h: Remove nsubsts parm from + *type_unification* and unify. + +Mon Mar 2 12:11:06 1998 Jason Merrill + + * parse.y (explicit_template_type): Remove TEMPLATE keyword. + (nested_name_specifier): And add it before this use. + (typename_sub0): And this use. Also add use without the keyword. + (typename_sub1): Likewise. + * pt.c (instantiate_class_template): Don't actually instantiate + anything if our type uses template parms. + +Mon Mar 2 11:04:59 1998 Jim Wilson + + * decl.c (start_function): Don't call temporary_allocation for a + nested function. + +Sun Mar 1 21:06:37 1998 Jason Merrill + + * pt.c (instantiate_class_template): Don't mess with friends if + our type uses template parms. + +Sat Feb 28 12:06:44 1998 Jason Merrill + + * parse.y (nested_name_specifier): Use explicit_template_type. + (typename_sub): Allow a template_type, an explicit_template_type, + or an implicit template type at the end. + * lex.c (yyprint): Handle a PTYPENAME being a TEMPLATE_DECL. + * decl.c (make_typename_type): Handle template-id where the name + is a TEMPLATE_DECL. + * call.c (build_scoped_method_call): Handle member template + destructor call. + * pt.c (tsubst_copy, METHOD_CALL_EXPR): Don't assume a member + destructor is represented by the type. + + * cp-tree.h (TYPENAME_TYPE_FULLNAME): New macro. + * parse.y (nested_name_specifier): Add 'template' case. + (explicit_template_type): New rule. + (typename_sub): Use it. + * decl.c (make_typename_type): Handle getting a template-id for NAME. + * pt.c (tsubst): Likewise. + +Fri Feb 27 11:17:50 1998 Jason Merrill + + * pt.c (add_to_template_args): Fix thinko. + (instantiate_class_template): Call it later. + + * pt.c (get_class_bindings): Add outer_args parm. + (most_specialized_class): Likewise. + (instantiate_class_template): Pass it. + (more_specialized_class): Likewise. + (lookup_template_class): Get context from template if none + was specified. + (finish_member_template_decl): Don't do anything with a + partial specialization. + * decl2.c (check_member_template): Use IS_AGGR_TYPE instead of + AGGREGATE_TYPE_P. + * class.c (finish_struct): Member class templates have already been + checked for name clashes. + * decl.c (pushdecl_with_scope): Handle pushing at class level. + +Fri Feb 27 02:25:16 1998 Jason Merrill + + * pt.c (tsubst, TEMPLATE_DECL): Support member class templates. + (tsubst, *_PARM): Support multiple levels of template classes. + (instantiate_class_template): Look up the pattern from the + original template. + (lookup_template_class): Handle getting a template for d1. + (push_template_decl): Correct setting of 'primary'. + (reduce_template_parm_level): Add 'levels' parm. + (finish_member_template_decl): Support member class templates. + (template_class_depth): Handle multiple levels. + * parse.y (component_decl_1, fn.def2): Remove member template case. + (component_decl): Add member template cases. + * decl2.c (check_member_template): We now handle member template + classes. + * decl.c (pushtag): Handle member templates. + * method.c (do_inline_function_hair): Don't touch + IDENTIFIER_GLOBAL_VALUE. + * init.c (build_offset_ref): If name isn't an identifier, just + return it. + * spew.c (yylex): Handle PTYPENAME like TYPENAME. + + * typeck.c (get_delta_difference): Do adjust for conversions to + and from virtual base. + +Wed Feb 25 09:51:29 1998 Jason Merrill + + * typeck.c (get_delta_difference): Give hard error for conversion + from virtual base. + + * cp-tree.h: Tweak formatting. + +Wed Feb 25 00:35:33 1998 Jason Merrill + + * decl.c (push_namespace): Handle redeclaration error. + + * cp-tree.h (IDENTIFIER_NAMESPACE_VALUE): New macro. + (IDENTIFIER_NAMESPACE_BINDINGS): New macro. + (NAMESPACE_BINDING): New macro. + (IDENTIFIER_GLOBAL_VALUE): Use NAMESPACE_BINDING. + * *.c: Use them. + + * pt.c (push_template_decl): Use innermost_args. + + * decl.c (get_unique_name): Tweak from earlier in the name. + +Tue Feb 24 22:15:04 1998 Martin von Löwis + + * cp-tree.def: Add CPLUS_BINDING node. + * cp-tree.h (tree_binding): New struct. + (BINDING_SCOPE, BINDING_VALUE): New macros. + (current_namespace, global_namespace): Declare extern. + (struct lang_decl_flags): New field in_namespace. + (DECL_NAMESPACE_USING, DECL_NAMESPACE_USERS): New macros. + (DECL_NAMESPACE, SET_DECL_NAMESPACE): New macros. + (TREE_INDIRECT_USING): New macro. + * decl2.c (current_namespace, global_namespace): Declare. The + value is a NAMESPACE_DECL now, not a TREE_LIST. + (is_namespace_ancestor, namespace_ancestor): New static functions. + (add_using_namespace, ambiguous_decl): Likewise. + (lookup_using_namespace): New support function for lookup_name. + (qualified_lookup_using_namespace): New support function for + do_scoped_id and lookup_namespace_name. + (get_namespace_id): Mark as obsolete. + (current_namespace_id): Likewise. + (do_namespace_alias): Implement. + (do_using_directive): Implement as call to add_using_namespace. + * decl.c (binding_for_name): New function. + (push_namespace, pop_namespace): Implement. + (push_decl): Don't install a FUNCTION_DECL in the global branch. + (lookup_namespace_name): Implement using qualified lookup. + (lookup_name_real): For global scoping, lookup in + global_namespace. For namespace scoping, lookup in given + namespace. For unscoped lookup, iterate over namespace, + considering using directives. + (init_decl_processing): Initialize global_namespace. + (grokvardecl): Build assembler name as static name for globals. + (grokdeclarator): Remove old namespace mangling. + (xref_tag): When installing a global binding for the + tag, make sure we have an identifier. + * method.c (build_overload_nested_name): Mangle namespaces. + (build_qualified_name): Likewise. + (build_decl_overload_real): Likewise. + * lex.c (build_lang_decl): Set namespace for new declaration to + current_namespace. + (do_scoped_id): Find global names in global or current + namespace, or using qualified namespace lookup, depending on + context. + * init.c (build_member_call): When scope is namespace, use + build_x_function_call instead. + (build_offset_ref): When scope is namespace, collapse processing + to lookup_namespace_name instead. + * error.c (dump_decl): Support NAMESPACE_DECL. + * decl.c (pushdecl): Bind globals to current namespace. + (push_overloaded_decl): Likewise. + (lookup_tag): Likewise. + (lookup_name_current_level): Likewise. + (xref_tag): Likewise. + (start_function): Likewise. + * lex.c (do_identifier): Likewise. + (identifier_typedecl_value): Likewise. + (real_yylex): Likewise. + * method.c (do_inline_function_hair): Likewise. + * parse.y (unscoped): Likewise. + * pt.c (check_explicit_specialization): Likewise. + (lookup_template_class): Likewise. + * rtti.c (call_void_fn): Likewise. + * sig.c (build_sigtable): Likewise. + * ptree.c (lang_print_xnode): New function. + +Tue Feb 24 01:40:24 1998 Jason Merrill + + * pt.c (instantiate_class_template): Don't instantiate if pedantic + and the args use template parms. + + * pt.c (push_tinst_level): If the instantiation uses template parms, + fail silently. + * decl.c (xref_basetypes): Do call complete_type for basetypes + that involve template parameters. + +Tue Feb 24 00:36:43 1998 Jason Merrill + + * typeck2.c (process_init_constructor): Fix labeled init check. + +Mon Feb 23 05:08:55 1998 Jason Merrill + + * pt.c, call.c, decl.c, method.c, cp-tree.h: Remove unused NARGS + argument to tsubst and friends. + + * pt.c (tsubst, FUNCTION_DECL): Tidy. + + * typeck.c (build_x_function_call): Handle static member function + templates like non-templates. Handle friend templates like normal + function templates. + * pt.c (tsubst, *_PARM): Don't use orig_level. + (get_bindings): Don't call add_to_template_args. + (instantiate_template): Likewise. + (tsubst, FUNCTION_DECL): Call add_to_template_args as appropriate. + * ptree.c (print_lang_type): Print index/level for template parms. + +Mon Feb 23 02:52:29 1998 Mark Mitchell + + * Make-lang.in (cc1plus): Note that cc1plus depends on + cp/cp-tree.h and cp/cp-tree.def. + + * cp-tree.def (TEMPLATE_CONST_PARM): Remove. + (TEMPLATE_PARM_INDEX): New tree code, used to indicate a + position in a template parameter list. + * cp-tree.h (template_parm_index): New structure, used as the tree + structure for a TEMPLATE_PARM_INDEX. + (TEMPLATE_PARM_IDX): New macro. + (TEMPLATE_PARM_LEVEL): Likewise. + (TEMPLATE_PARM_DESCENDANTS): Likewise. + (TEMPLATE_PARM_ORIG_LEVEL): Likewise. + (TEMPLATE_PARM_DECL): Likewise. + (TEMPLATE_TYPE_PARM_INDEX): Likewise. + (TEMPLATE_TYPE_ORIG_LEVEL): Likewise. + (TEMPLATE_TYPE_DECL): Likewise. + (TEMPLATE_CONST_IDX): Remove. + (TEMPLATE_CONST_LEVEL): Likewise. + (TEMPLATE_CONST_SET_INFO): Likewise. + (TEMPLATE_TYPE_SET_INFO): Likewise. + (TEMPLATE_TYPE_IDX): Redefine in terms of TEMPLATE_PARM_INDEX + node. + (TEMPLATE_TYPE_LEVEL): Likewise. + * decl.c (decls_match): Call comp_template_parms, rather than + expanding it inline. + (duplicate_decls): If two template declarations are being merged, + then their TEMPLATE_INFOs should be merged as well. + (grokfndecl): Save template-id information when declaring a friend + with explicit template arguments. Pass arguments to + check_explicit_specialization via correct convention; at some + point check_explicit_specialization changed, but these call-sites + did not. + (grokdeclarator): Tidy up slightly. + * decl2.c (check_classfn): Tidy up slightly. Don't assume that + two template functions with the same DECL_ASSEMBLER_NAME the same, + since the names are not yet mangled. + * error.c (dump_decl): Use TEMPLATE_PARM_INDEX instead of + TEMPLATE_CONST_PARM. + (dump_expr): Likewise. Use the TEMPLATE_PARM_DECL to get at the + decl for a non-type parameter, rather than printing `'. + * friend.c (is_friend): Handle TEMPLATE_DECL friends. + (do_friend): Deal with template friends. + * lex.c (do_pending_inlines): Call + maybe_begin_member_template_processing, rather than + conditionally calling begin_member_template_processing. + (process_next_inline): Likewise. Call + maybe_end_member_template_processing, rather than + conditionally calling end_member_template_processing. + (do_pending_defargs): Likewise. + (do_identifier): Use TEMPLATE_PARM_INDEX instead of + TEMPLATE_CONST_PARM. + * method.c (build_mangled_template_parm_index): New function. + (build_overload_value): Use it. + (build_overload_name): Likewise. + * pt.c (finish_member_template_decl): Allow friend declarations. + (template_class_depth): New function. + (is_member_template): Rename, and modify, to become... + (is_member_or_friend_template): New function. + (end_member_template_processing): Rename, and modify, to become... + (maybe_end_member_template_processing). + (build_template_parm_index): New function. + (reduce_template_parm_level): New function. + (process_template_parm): Modify to use build_template_parm_index. + (push_template_decl): Deal with friend templates. + (uses_template_parms): Use TEMPLATE_PARM_INDEX instead of + TEMPLATE_CONST_PARM. + (tsubst_friend_function): New function. + (instantiate_class_template): Generate the DECL_FRIENDLIST + for a new instantiation by using tsubst_friend_function rather + than just tsubst. + (tsubst): Don't tsubst into a type which is a TEMPLATE_DECL. + Use TEMPLATE_PARM_INDEX instead of TEMPLATE_CONST_PARM, and the + appropriate new macros. Use reduce_template_parm_level to + generate lower-level template parameters. Handle tsubst'ing into + TEMPLATE_DECLS that declare TEMPLATE_TEMPLATE_PARMS. Don't forget + to tsubst the DECL_CONTEXT and DECL_CLASS_CONTEXT of newly created + templates. Similarly for the template parameters for a new + template. + (tsubst_copy): Tidy up slightly. Use TEMPLATE_PARM_INDEX instead + of TEMPLATE_CONST_PARM. Handle TYPE_DECLs by tsubsting into them. + (unify): Use TEMPLATE_PARM_INDEX instead of TEMPLATE_CONST_PARM. + (get_bindings): Call add_to_template_args if necessary. + (instantiate_decl): Handle instantiations of friend templates. + * search.c (lookup_field_1): Don't treat the TYPE_FIELDS of a + TEMPLATE_TYPE_PARM as a list of fields; it's not! + * spew.c (yylex): Do a little manual constant propagation to + clarify the code. + +Sun Feb 22 19:53:29 1998 Jeffrey A Law (law@cygnus.com) + + * error.c: Include sys/types.h. + +Thu Feb 19 14:49:09 1998 Jeffrey A Law (law@cygnus.com) + + * method.c (build_mangled_name): Start CPP directives in column zero. + +Thu Feb 19 10:36:48 1998 Jason Merrill + + * typeck2.c (process_init_constructor): Sorry about non-trivial + labeled initializers. + * parse.y (initlist): Re-enable labeled initializers. + +Thu Feb 19 10:15:55 1998 Kriang Lerdsuwanakij + + * pt.c (coerce_template_parms): Add a new parameter, is_tmpl_parm, + all callers changed. Rely on the new parameter instead of arg + being a TREE_LIST when determine whether we are working inside + template template parameter. Clean up is_type test. + +Thu Feb 19 10:04:12 1998 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Preserve TREE_CONSTANT. + * typeck2.c (initializer_constant_valid_p): Allow conversions + between pointers and references. + +1998-02-19 Brendan Kehoe + + * typeck.c (build_unary_op): Only warn about incr/decr a pointer + if pedantic || warn_pointer_arith. + +Thu Feb 19 09:37:21 1998 Kriang Lerdsuwanakij + + * pt.c (unify): Handle TEMPLATE_DECL. + +1998-02-18 Brendan Kehoe + + * cp-tree.h (strip_attrs): Remove decl. + +1998-02-18 Doug Evans + + * decl.c (duplicate_decls): Call merge_machine_decl_attributes. + Update olddecl's attributes too. + (strip_attrs): Remove function. + * typeck.c (common_type): Call merge_machine_type_attributes. + +Tue Feb 17 14:07:52 1998 Mark Mitchell + + * parse.y (initdcl0_innards): New grammar symbol. + (nomods_initdecls, nomods_initdcl0): Change type from itype to + none, since the resulting value is never used. + (parse_decl): New function. + (datadef): Remove redundant actions. + (initdcl0, notype_initdcl0, nomods_initdcl0): Use initdcl0_innards. + * parse.c: Regenerated. + +Tue Feb 17 11:54:16 1998 Jason Merrill + + * parse.y (simple_stmt): Use getdecls() to check for decl. + +Sat Feb 14 11:50:51 1998 Manfred Hollstein + + * Make-lang.in (DEMANGLER_INSTALL_NAME, DEMANGLER_CROSS_NAME): New + macros. + (c++.install-common): Install c++filt properly as native or as cross + variant. + (c++.uninstall): Add c++filt. + +Fri Feb 13 14:55:37 1998 Jason Merrill + + * call.c (standard_conversion): Fix multi-level ptr conversions. + +Fri Feb 13 14:06:22 1998 Mike Stump + + * init.c (build_new): Propagate error_mark_node up. + +Fri Feb 13 13:24:32 1998 Jason Merrill + + * parse.y (simple_stmt): If the condition isn't a declaration, + start the controlled block after the test. + +Fri Feb 13 02:26:10 1998 Andreas Schwab + + * call.c (build_over_call): Convert builtin abs, labs and fabs to + tree-codes. + * decl.c (init_decl_processing): Re-enable abs, labs and fabs as + builtins. + +Fri Feb 13 01:36:42 1998 Jason Merrill + + * call.c (standard_conversion): A BASE_CONV replaces an RVALUE_CONV. + +Fri Feb 13 00:21:59 1998 Jason Merrill + + * cp-tree.h: Add access_protected_virtual_node. + * class.c (init_class_processing): Initialize it. + * decl.c (xref_basetypes): Use it. + * parse.y (base_class_access_list): Likewise. + + * Make-lang.in (DEMANGLER_PROG): Add $(exeext). + (c++.install-common): Install c++filt. + +Thu Feb 12 12:46:51 1998 Benjamin Kosnik + + * decl.c (shadow_tag): Give error for typedef-ing built-in types. + +Wed Feb 11 23:28:05 1998 Mark Mitchell + + * call.c (reference_binding): Use comptypes when comparing + TYPE_MAIN_VARIANTS to handle non-canonical array/index types. + +Wed Feb 11 16:42:04 1998 Mark Mitchell + + * tree.c (is_overloaded_fn): Use really_overloaded_fn. + (really_overloaded_fn): Move check here from is_overloaded_fn. + (get_first_fn): Use really_overloaded_fn and is_overloaded_fn. + +Wed Feb 11 15:54:18 1998 Mark Mitchell + + * typeck.c (build_ptrmemfunc): Type-check pointer-to-member + conversions. + +Mon Feb 9 22:23:31 1998 Mark Mitchell + + * cp-tree.h (push_template_decl): Return the decl passed in, or an + equivalent duplicate. + * decl.c (pushtag): Use the return value from push_template_decl. + (duplicate_decls): When duplicating a template declaration, merge + the DECL_TEMPLATE_RESULTs as well. + (make_implicit_typename): Don't try to dive into typename types to + find a context for making a new implicit typename. + (start_decl): Use the return value from push_template_decl. + (grokdeclarator): Complain about declarations list `const operator + int'. Since we don't correctly handle in-class initializations of + non-static data members, complain about this (now illegal) + practice. Issue an error for initializations of non-const statics + since that is illegal as well, and since we don't handle that case + correctly either. + (start_function): Use the return value from push_template_decl. + (start_method): Likewise. + * decl2.c (grokfield): Likewise. Since the change to + grokdeclarator ensures that all initialized fields are in fact + static, remove a redundant test for TREE_PUBLIC. + * parse.y (initlist): Disable labeled initializers since they do + not work as per the documentation, and since they do not use the + same syntax as the C front end. + * pt.c (push_template_decl): Return the decl passed in, or an + equivalent duplicate. + (lookup_template_class): When searching in a nested context, + use the right arguments. + (uses_template_parms): Handle the DECL_INITIAL for a CONST_DECL. + * typeck.c (build_component_ref): Assign the correct type to the + result of build_vfn_ref. + +Tue Feb 10 23:56:46 1998 Jason Merrill + + * pt.c (convert_nontype_argument): Fix typo. + (check_explicit_specialization): Allow old-style specialization + of class template members. + +Tue Feb 10 20:36:52 1998 Jason Merrill + Manfred Hollstein + + * decl.c (grokdeclarator): Use DECL_USE_TEMPLATE instead + when deciding to override DECL_ASSEMBLER_NAME. + +Tue Feb 10 15:30:55 1998 Andrew MacLeod + + * decl2.c (lang_f_options): Add -fsquangle to option processing list. + * cp-tree.h (flag_do_squangling): Add declaration. + * lang-options.h: Add -fsquangle and -fno-squangle. + * method.c: Add macros and static variables for squangling. + (build_overload_name): Rename to build_mangled_name, add logic for B + compression, and split into process_modifiers and + process_overload_item. + (process_modifiers): New function, to handle constant, reference, + and pointer types. + (process_overload_item): New function, handles issue of type codes. + (build_overload_name): New function, start squangling and call + build_mangled_name. + (ALLOCATE_TYPEVEC, DEALLOCATE_TYPEVEC): Remove macro and expand inline. + (start_squangling): New function to initialize squangling structs. + (end_squangling): New function to destroy squangling structs. + (nrepeats): Rename variable to Nrepeats. + (issue_nrepeats): New function for issuing 'n' type repeats. + (check_ktype): New function to check for type K name compression. + (build_overload_nested_name): Add a check for K name compression. + (build_qualified_name): Add a check for K name compression and don't + use DECL_ASSEMBLER_NAME when squangling is on. + (check_btype): New function, checks for B type compression. + (build_static_name, build_decl_overload_real): Initiate squangling. + (build_typename_overload, build_overload_with_type): Initiate + squangling + +Sun Feb 8 23:47:38 1998 scott snyder + + * method.c (make_thunk): Avoid name buffer overflow. + +Sat Feb 7 16:48:54 1998 Jason Merrill + + * pt.c (instantiate_decl): Call cp_finish_decl for vars even if we + don't define them yet. + + * parse.y (nomods_initdcl0): Add constructor_declarator case. + +Fri Feb 6 21:32:25 1998 Richard Kenner + + * config-lang.in (diff_excludes): Use basename only. + +Thu Feb 5 19:10:40 1998 Jason Merrill + + * tinfo2.cc: Add tinfo for signed char. + +Thu Feb 5 14:38:23 1998 Mike Stump + + * search.c (compute_access): Handle protected constructors in derived + classes as accessible. + +Wed Feb 4 01:26:49 1998 Jason Merrill + + * expr.c (cplus_expand_expr, PCC_STATIC_STRUCT_RETURN code): + Call convert_from_reference sooner. + +Tue Feb 3 23:50:52 1998 Mark Mitchell + + * cvt.c (ocp_convert): Obtain the constant values from constant + decls even if the destination type is the same as the type of the + decl. + + * decl2.c (finish_file): Make sure that static inlines with + definitions are not marked DECL_EXTERNAL before returning. + +Tue Feb 3 22:43:42 1998 Jason Merrill + + * decl.c: Lose arg_looking_for_template. + (lookup_name_real): Likewise. + * parse.y: Lose processing_template_arg, template_arg1. + (primary): Likewise. + * spew.c (yylex): Set lastiddecl for PTYPENAMEs, too. + +Tue Feb 3 22:04:01 1998 Kriang Lerdsuwanakij + + * error.c (dump_decl): Fix type of default arguments for template + template parameters and nontype template parameters. + * parse.y (template_parm): Handle invalid default template + template arguments here. + + * parse.y (template_parm): Use template_arg instead of PTYPENAME + for default template template argument. + * pt.c (coerce_template_parms): Merge default template argument + codes. Can treat RECORD_TYPE as template name if it is implicitly + created. Fix argument index in error message. + * typeck.c (comptypes): Merge template argument comparison codes in + TEMPLATE_TEMPLATE_PARM and RECORD_TYPE. + +Tue Jan 6 01:42:44 1998 Mumit Khan + + * lex.c (file_name_nondirectory): Also check for '/'. + +Mon Feb 2 11:24:22 1998 Mark Mitchell + + * parse.y (primary): Deal with statement-expressions in + templates. + * pt.c (tsubst_copy): Handle BIND_EXPR. + * tree.c (mapcar): Likewise. + + * call.c (add_template_candidate_real): Pass extra parameter to + fn_type_unification. + * cp-tree.h (fn_type_unification): Add parameter. + * pt.c (fn_type_unification): Add additional parameter to deal with + static member functions. + (get_bindings): Deal with static member functions. + + * cp-tree.h (DECL_NONSTATIC_MEMBER_FUNCTION_P): New macro. + (revert_static_member_fn): Declare. + * decl.c (revert_static_member_fn): Remove declaration. Change + linkage from internal to external. + (cp_finish_decl): Deal with virtual functions in classes local to + template functions. + * decl2.c (finish_file): Don't forget to emit increment/decrement + expressions in initializers for file-scope variables. + * parse.y (typename_sub2): If the typename doesn't names a + template, rather than a type, issue an error message. + * pt.c (check_explicit_specialization): Handle specializations of + static member functions. + (coerce_template_parms): Handle offset references to lists of + member functions. + * search.c (note_debug_info_needed): Don't crash when handed a + type which is being defined. + * typeck.c (complete_type): Don't crash when handed NULL_TREE; + that can happen with some illegal code. + +Mon Feb 2 00:57:38 1998 Kaveh R. Ghazi + + * call.c (user_harshness): Initialize `code' to 0. + (build_method_call): Initialize `candidates', `cp' and `len' to 0. + (null_ptr_cst_p): Add parentheses around && within ||. + (standard_conversion): Likewise. + (z_candidate): Likewise. + (build_user_type_conversion_1): Initialize `args' to NULL_TREE. + (build_object_call): Likewise for `mem_args'. + (build_new_op): Likewise for `mem_arglist'. Add `return' from + default case in enumeration switch. + + * class.c (build_vtable_entry): Add explicit braces to avoid + ambiguous `else'. + (build_class_init_list): Likewise. + (finish_struct_1): Initialize `width' to 0. + (instantiate_type): Initialize `name' to NULL_TREE. Add + explicit braces to avoid ambiguous `else'. + + * cvt.c (convert_to_aggr): Add explicit braces to avoid ambiguous + `else'. + + * decl.c (grok_reference_init): Eliminate unused parameter, all + callers changed. + (record_builtin_type): Initialize `tdecl' to NULL_TREE. + (init_decl_processing): Initialize `vb_off_identifier' to NULL_TREE. + (cp_finish_decl): Initialize `ttype' to NULL_TREE. + (grokdeclarator): Add parentheses around && within ||. Add + explicit braces to avoid ambiguous `else'. + (grokparms): Initialize `type' to NULL_TREE. + (xref_tag): Remove unused label `just_return'. + (finish_enum): Initialize `minnode' and `maxnode' to NULL_TREE. + (finish_function): Initialize `cond' and `thenclause' to NULL_TREE. + (hack_incomplete_structures): Add parentheses around assignment + used as truth value. + + * decl2.c (coerce_delete_type): Hide definition of `e3'. + + * error.c: Include . + (dump_expr): Change the type of `i' to size_t. Remove unused + label `error'. + + * except.c (init_exception_processing): Remove unused variable `d'. + (expand_throw): Likewise for `label'. + + * friend.c (add_friends): Add explicit braces to avoid ambiguous + `else'. + + * init.c (sort_member_init): Initialize `last_field' to NULL_TREE. + (sort_base_init): Likewise for `binfo'. + (expand_member_init): Likewise for `rval'. + (build_member_call): Add parentheses around assignment used as + truth value. + (build_offset_ref): Add explicit braces to avoid ambiguous `else'. + (build_new): Initialize `nelts' to NULL_TREE. Initialize + `old_immediate_size_expand' to 0. + (build_new_1): Initialize `nelts' and `alloc_node' to NULL_TREE. + (build_vec_delete_1): Remove unused variable `block'. + (expand_vec_init): Initialize `itype' to NULL_TREE. + + * lex.c: Include if we don't have . Protect + declaration of `index' and `rindex' with autoconf macros. + (reinit_parse_for_expr): Remove unused variables + `look_for_semicolon' and `look_for_lbrac'. + (cons_up_default_function): Initialize `args' to NULL_TREE. + (readescape): Initialize `firstdig' to 0. + (real_yylex): Add parentheses around assignment used as truth value. + + * method.c: Include if we don't have . + Protect declaration of `index' with autoconf macro. + + * parse.y (primary): Add explicit braces to avoid ambiguous `else'. + Initialize `type' to NULL_TREE. + (structsp): Remove unused variable `id'. + + * pt.c (coerce_template_parms): Add explicit braces to avoid + ambiguous `else'. + (lookup_template_class): Initialize `template' to NULL_TREE. + (instantiate_class_template): Remove unused variable `name' and `e'. + (tsubst): Likewise for `i'. Initialize `last' to NULL_TREE. + (do_poplevel): Initialize `saved_warn_unused' to 0. + (type_unification): Remove unused varable `parm'. + (unify): Likewise for `j'. + + * repo.c (init_repo): Add parentheses around assignment used as + truth value. + (finish_repo): Remove unused varable `p'. + + * search.c (get_binfo): Initialize `type' to NULL_TREE. + (get_base_distance): Likewise. + (lookup_field): Initialize `rval_binfo_h', `type', `basetype_path' + and `new_v' to NULL_TREE. + (lookup_fnfields): Likewise for `rval_binfo_h'. + (breadth_first_search): Add parentheses around assignment used as + truth value. + (get_template_base): Initialize `type' to NULL_TREE. + + * sig.c (append_signature_fields): Initialize `last_mfptr' to + NULL_TREE. + (build_signature_table_constructor): Likewise for + `last_rhs_field', `pfn' and `vt_off'. + (build_sigtable): Likewise for `init'. + + * tree.c (break_out_calls): Initialize `t2' to NULL_TREE. + (propagate_binfo_offsets): Likewise for `delta'. + (hash_tree_cons): Initialize hashcode to 0. + (can_free): Likewise for `size'. + (cp_tree_equal): Add explicit braces to avoid ambiguous `else'. + + * typeck.c (convert_sequence): Hide prototype. + (common_type): Add explicit braces to avoid ambiguous `else'. + (comp_target_types): Likewise. + (build_x_function_call): Initialize `ctypeptr' to NULL_TREE. + (build_function_call_real): Add explicit braces to avoid ambiguous + `else'. + (convert_arguments): Initialize `called_thing' to 0. + (convert_for_initialization): Initialize `savew' and `savee' to 0. + + * typeck2.c (incomplete_type_error): Initialize `errmsg' to 0. + (digest_init): Initialize `old_tail_contents' to NULL_TREE. + (build_x_arrow): Likewise for `last_rval'. + + * xref.c (GNU_xref_decl): Initialize `cls' to 0. + +Sun Feb 1 12:45:34 1998 J"orn Rennecke + + * decl.c (init_decl_processing): Use set_sizetype. + * decl2.c (sizetype): Don't declare. + * typeck.c (c_sizeof): Convert result of *_DIV_EXPR to sizetype. + (c_sizeof_nowarn, build_binary_op_nodefault): Likewise. + (build_component_addr, unary_complex_lvalue): Likewise. + * rtti.c (expand_class_desc): Likewise. + * class.c (get_vfield_offset): Likewise. + +Thu Jan 29 10:39:30 1998 Mark Mitchell + + * pt.c (convert_nontype_argument): Move check for is_overloaded_fn + early to avoid bogus error. Handle overloaded function + names provided as template arguments correctly. + (coerce_template_parms): Don't mishandle overloaded functions when + dealing with template template parameters. + (lookup_template_class): Issue an error message, rather than + crashing, when the TYPE_DECL provided is not a template type. + +Wed Jan 28 23:14:44 1998 Jason Merrill + + * class.c (instantiate_type): Don't just return a known type if + it's wrong. + +Wed Jan 28 11:04:07 1998 Mark Mitchell + + * class.c (instantiate_type): Remove handling of FUNCTION_DECL + since that code could never be reached. + + * error.c (dump_decl): Avoid aborting in the midst of printing an + error message about an illegal template declaration. + + * parse.y (structsp): Print an error message, rather than crashing, + when a class-head does not name a class. + + * pt.c (convert_nontype_argument): Allow REAL_TYPE and COMPLEX_TYPE + template arguments as a g++ extension. + + * cp-tree.def (ALIGNOF_EXPR): New tree code. + * decl2.c (grok_alignof): If processing_template_decl, just store + the expression. + * typeck.c (c_alignof): Likewise. + * decl2.c (build_expr_from_tree): Handle ALIGNOF_EXPR. + * error.c (dump_expr): Likewise. + * pt.c (tsubst_copy): Likewise. + * tree.c (cp_tree_equal): Likewise. + * pt.c (uses_template_parms): Correctly determine whether or not a + SIZEOF_EXPR/ALIGNOF_EXPR uses template parameters so that constant + folding can be done. + + * cp-tree.h (grok_enum_decls): Remove type parameter. + * decl.c (grok_enum_decls): Likewise. + * decl2.c (grok_x_components): Call grok_enum_decls + unconditionally, since it will do nothing if there is no + current_local_enum. Use the new calling sequence. + * pt.c (tsubst_enum): Use the new calling sequence for + grok_enum_decls. + + * decl.c (start_function): Make member functions of local classes + in extern inline functions have comdat linkage here... + (grokdeclarator): Rather than here. + +Wed Jan 28 10:55:47 1998 Jason Merrill + + * pt.c (convert_nontype_argument): Use decl_constant_value. + +Tue Jan 27 16:42:21 1998 Mark Mitchell + + * call.c (add_template_candidate_real): New function. + (add_template_candidate): Use it. + (add_template_conv_candidate): Likewise. + (joust): Pass extra argument to more_specialized. + * class.c (instantiate_type): Handle a single FUNCTION_DECL. + (is_local_class): Remove. + (finish_struct): Check TI_PENDING_SPECIALIZATION_FLAG. + * cp-tree.h (is_local_class): Remove. + (perform_array_to_pointer_conversion): Likewise. + (finish_member_template_decl): Add. + (check_explicit_specialization): Return a tree, not an int. + (more_specialized): Take additional argument. + (get_bindings): Likewise. + (TI_PENDING_SPECIALIZATION_FLAG): New macro. + * cvt.c (perform_qualification_conversions): Use comp_ptr_ttypes. + (perform_array_to_pointer_conversion): Remove. + * decl.c (saved_scope): Add processing_specialization, + processing_explicit_instantiation fields. + (maybe_push_to_top_level): Save them. + (pop_from_top_level): Restore them. + (grokfndecl): Use new return value from + check_explicit_specialization. + (start_decl): Don't check flag_guiding_decls before pushing + decls. + (cp_finish_decl): Remove previous (bogus) change. + (grok_declarator): Use decl_function_context rather than + is_local_class. + * decl2.c (finish_file): Pass extra argument to get_bindings. + (build_expr_from_tree): Let build_x_component_ref check + validity of arguments rather than doing it here. + * lex.c (cons_up_default_function): Remove code fooling with + processing_specialization, processing_explicit_instantiation + flags, as that is now done in {maybe_push_top,pop_from}_top_level. + * method.c (build_overload_identifier): Mangle local classes in + template functions correctly. + * parse.y (finish_member_template_decl): Move to pt.c. + * pt.c (finish_member_template_decl): Moved here from parse.y. + (print_candidates): New function. + (determine_specialization): Change interface. Properly look for + most specialized versions of template candidates. + (check_explicit_specialization): Fully process explicit + instantiations. + (push_template_decl): Avoid looking at CLASSTYPE fields in + FUNCTION_DECLS. + (determine_overloaded_function): Remove. + (convert_nontype_argument): Change name from + convert_nontype_parameter. Use determine_overloaded_function + instead of instantiate_type. + (mangle_class_name_for_template): Handle type contexts as well as + function contexts. + (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 + proclaiming a function a match. + (do_decl_instantiation): Remove code searching for function to + instantiate; that is now done in check_explicit_specialization. + (add_maybe_template): Pass extra argument to get_bindings. + * tree.c (really_overloaded_fn): Use is_overloaded_fn to simplify + implementation. + * typeck.c (build_component_ref): Check for invalid arguments. + +Tue Jan 27 01:44:02 1998 Jason Merrill + + * expr.c (cplus_expand_expr, AGGR_INIT_EXPR): Don't check that + return_target and call_target are equivalent. + + * pt.c (type_unification_real): Just accept function parms that + don't use any template parms. + +Sun Jan 25 03:30:00 1998 Jason Merrill + + * decl.c (cp_finish_decl): When bailing on a comdat variable, also + unset DECL_NOT_REALLY_EXTERN. + + * parse.y (typename_sub*): Fix std::. + +Sat Jan 24 12:13:54 1998 Jason Merrill + + * error.c (dump_decl): Fix type default template args. + (dump_type): Hand TEMPLATE_DECL off to dump_decl. + +Fri Jan 23 18:34:37 1998 Mumit Khan + + * lex.c (DIR_SEPARATOR): Define to be '/' if not already defined. + (file_name_nondirectory): Use. + +Wed Jan 21 10:29:57 1998 Kriang Lerdsuwanakij + + * pt.c (coerce_template_parms): Don't access elements of ARGLIST + that are not really present. Substitute default arguments in + template template arguments. Correctly convert TEMPLATE_DECL to + TEMPLATE_TEMPLATE_PARM. + (comp_template_args): TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM + are no longer treated specially here. + * parse.y (template_template_parm): Fix copy error. + * decl.c (grokdeclarator): Warn about missing `typename' for nested + type created from template template parameters. + * parse.y (bad_parm): Likewise + + * class.c (finish_struct): Handle TEMPLATE_TEMPLATE_PARM. + (push_nested_class): Likewise. + * cp-tree.def (TEMPLATE_TEMPLATE_PARM): New tree code. + * cp-tree.h (DECL_TEMPLATE_TEMPLATE_PARM_P): New macro. + (copy_template_template_parm): Declare. + * decl.c (arg_looking_for_template): New variable. + (lookup_name_real): Handle TEMPLATE_TEMPLATE_PARM. + Try to return TEMPLATE_DECL or TEMPLATE_TEMPLATE_PARM + node if arg_looking_for_template is nonzero. + (pushdecl): Handle TEMPLATE_TEMPLATE_PARM. + (grok_op_properties, xref_tag, xref_basetypes): Likewise. + (grokdeclarator): Handle TEMPLATE_DECL. + * decl2.c (constructor_name_full): Handle TEMPLATE_TEMPLATE_PARM. + * error.c (dump_type): Add TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM. + (dump_type_prefix, dump_type_suffix): Handle TEMPLATE_TEMPLATE_PARM. + (dump_decl): Handle unnamed template type parameters. + Handle template template parameters. + (dump_function_name): Handle template template parameters. + * init.c (is_aggr_typedef, is_aggr_type, get_aggr_from_typedef): + Handle TEMPLATE_TEMPLATE_PARM. + * method.c (build_template_template_parm_names): New function. + (build_template_parm_names): Handle TEMPLATE_DECL. + (build_overload_nested_name, build_overload_name): + Handle TEMPLATE_TEMPLATE_PARM. + * parse.y (maybe_identifier): New nonterminal. + (template_type_parm): Use it. + (template_template_parm, template_arg1): New nonterminal. + (template_parm): Add template_template_parm rules. + (template_arg): Set processing_template_arg. + (template_arg1): Rules moved from template_arg. + (primary, nonnested_type): Set arg_looking_for_template if we are + processing template arguments. + * pt.c (begin_member_template_processing): Handle TEMPLATE_DECL. + (process_template_parm): Handle template template parameters. + (coerce_template_parms, comp_template_args): Likewise. + (mangle_class_name_for_template, lookup_template_class): Likewise. + (uses_template_parms): Handle TEMPLATE_DECL and + TEMPLATE_TEMPLATE_PARM. + (current_template_args): Handle TEMPLATE_DECL. + (tsubst, tsubst_copy, unify): Handle TEMPLATE_TEMPLATE_PARM. + * search.c (dfs_walk, dfs_record_inheritance): + Handle TEMPLATE_TEMPLATE_PARM. + * tree.c (copy_template_template_parm): New function. + (mapcar): Handle TEMPLATE_TEMPLATE_PARM. + * typeck.c (comptypes): Handle TEMPLATE_TEMPLATE_PARM. + +Mon Jan 19 22:40:03 1998 Mark Mitchell + + * decl.c (start_decl): Don't allow duplicate definitions of static + data members. + + * call.c (build_user_type_conversion_1): Handle user-defined + template conversion operators correctly. + + * decl2.c (build_expr_from_tree): Issue an error message if the + object in a COMPONENT_REF is a TEMPLATE_DECL. + + * typeck.c (incomplete_type_error): Handle TEMPLATE_TYPE_PARMs. + + * class.c (is_local_class): New function. + * cp-tree.h (is_local_class): Declare it. + (last_tree): Likewise. + (begin_tree): Likewise. + (end_tree): Likewise. + (lookup_template_class): Change prototype. + * decl.c (cp_finish_decl): Check for NULL where necessary. + Consider FUNCTION_DECLS to declare objects with top-level binding, + when calling make_decl_rtl. + (grokdeclarator): Give members of local classes internal linkage. + (start_function): Remove declaration of last_tree. + (finish_function): Set flag_keep_inline_functions around call to + rest_of_compilation if we are processing a member function in a + local class. + (start_method): Call push_template_decl for member functions of + local classes in template functions. + * decl2.c (import_export_decl): Don't give external linkage to + instantiations of templates with internal linkage. + * parse.y (last_tree): Remove declaration. + (template_type): Pass extra parameter to lookup_template_class. + (self_template_type): Likewise. + (structsp): Move call to reset_specialization into left_curly. + (left_curly): Call reset_specialization, and begin_tree. + * pt.c (saved_trees): New variable. + (mangle_class_name_for_template): Change prototype. Use + additional function context to name local classes in templates + correctly. + (classtype_mangled_name): Pass the context. + (push_template_decl): Handle local classes and templates, and + member functions for such classes. + (convert_nontype_parameter): Fix handling of pointer-to-member + constants. + (lookup_template_class): Handle local classes in templates. + (tsubst): Likewise. Don't assume that template instantiations + have external linkage; pay attention to the template declaration. + (mark_decl_instantiated): Likewise. + (begin_tree): New function. + (end_tree): Likewise. + + * decl.c (xref_basetypes): Don't call complete_type for basetypes + that involve template parameters; that can lead to infinite + recursion unnecessarily. + + * pt.c (register_specialization): Do not register specializations + that aren't ready to be registered yet. + (check_explicit_specialization): Handle explicit specialization of + constructors and destructors. + (build_template_decl): New function. + (push_template_delc): Handle out-of-class specializations of + member templates. + + * pt.c (check_explicit_specialization): Set up the template + information before registering the specialization. + (coerce_template_parms): Fix thinko. + (tsubst): Handle specializations of member templates correctly. + + * class.c (finish_struct_methods): Remove calls to + check_explicit_specialization from here. + (finish_struct): And insert them here. + * cp-tree.h (perform_qualification_conversions): New function. + (perform_array_to_pointer_conversion): Likewise. + (begin_explicit_instantiation): Likewise. + (end_explicit_instantiation): Likewise. + (determine_specialization): Renamed from + determine_explicit_specialization. + (comp_template_parms): New function. + (processing_explicit_instantiation): New variable. + * cvt.c (perform_qualification_conversions): New function. + (perform_array_to_pointer_conversion): Likewise. + * decl.c (duplicate_decls): Don't consider template functions + alike unless they have the same parameters. Refine handling of + instantiation/specialization mismatches. + (start_decl): Don't call pushdecl for template specializations, + since they don't affect overloading. + (start_function): Likewise. + (grokfndecl): Call check_explicit_specialization a little later. + Don't call duplicate_decls for memberm template specializations. + (grokdeclarator): Don't update template_count for classes that are + themselves specializations. Remove use of `2' as parameter to + grokfndecl since that value isn't used. + * lex.c (cons_up_default_function): Save and restore + processing_explicit_instantiation around calls to grokfield. + * parse.y (finish_member_template_decl): New function. + (component_decl_1): Use it. + (fn.def2): Likewise. + (template_arg_list_opt): New nonterminal. + (template_type): Use it. + (self_template_type): Likewise. + (template_id): Likewise. + (object_template_id): Likewise. + (notype_template_declarator): Likwise. + (begin_explicit_instantiation): Likewise. + (end_explicit_instantiation): Likewise. + (explicit_instantiation): Use them. + * pt.c (coerce_template_parms): Add parameters. + (processing_explicit_instantiation): New variable. + (convert_nontype_parameter): New function. + (determine_overloaded_function): Likewise. + (begin_explicit_instantiation): Likewise. + (end_explicit_instantiation): Likewise. + (retrieve_specialization): Likewise. + (register_specialization): Likewise. + (processing_explicit_specialization): Removed. + (determine_specialization): Handle specializations of member + functions of template class instantiations. + (check_explicit_specialization): Refine to conform to standard. + (comp_template_parms): New function. + (coerce_template_parms): Call convert_nontype_parameter. + (tsubst): Refine handling of member templates. Use + register_specialization. + (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. + * typeck.c (build_unary_op): Call determine_specialization, rather + than determine_explicit_specialization. + +Mon Jan 19 13:18:51 1998 Jason Merrill + + * cvt.c (build_up_reference): A TARGET_EXPR has side effects. + +Fri Jan 16 11:40:50 1998 Bruno Haible + + * error.c (dump_decl): For enum tags, output the tag, not its value. + +1998-01-13 Brendan Kehoe + + * decl.c (init_decl_processing): Only call init_rtti_processing + FLAG_RTTI is set. + +Mon Jan 12 01:35:18 1998 Jason Merrill + + * init.c (build_new_1): Split out from build_new. + (build_new): Just return a NEW_EXPR. + * expr.c (cplus_expand_expr): Handle NEW_EXPR. + + * decl2.c (get_temp_regvar): Tweak. + + * cp-tree.h (TREE_CALLS_NEW): Comment out. + * class.c (resolves_to_fixed_type_p): Remove use. + * method.c (build_opfncall): Likewise. + * call.c (build_new_op): Likewise. + +Wed Jan 7 23:47:13 1998 Jason Merrill + + * exception.cc (__eh_alloc, __eh_free): New fns. + (__cp_push_exception, __cp_pop_exception): Use them. + (__uncatch_exception): Call terminate here if no exception. + * except.c (build_terminate_handler): New fn. + (expand_start_catch_block): Use it. + (expand_exception_blocks): Likewise. + (alloc_eh_object): New fn. + (expand_throw): Use it. Protect exception init with terminate. + * typeck.c (build_modify_expr): Remove code that ignores trivial + methods. + + + +Copyright (C) 1998 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-1999 b/gcc/cp/ChangeLog-1999 new file mode 100644 index 000000000..b321e9897 --- /dev/null +++ b/gcc/cp/ChangeLog-1999 @@ -0,0 +1,6794 @@ +1999-12-31 Mark Mitchell + + * cp-tree.h (VF_NORMAL_VALUE): Remove. + * class.c (struct base_info): Remove vfield, vfields, and rtti. + (set_primary_base): New function, split out from ... + (finish_base_struct): ... here. Rename to ... + (determine_primary_base): ... this. Simplify. + (create_vtable_ptr): Tweak accordingly. + (finish_struct_1): Simplify. + + * cp-tree.h (CLASSTYPE_VBASECLASSES): Update documentation. + (CLASSTYPE_N_BASECLASSES): Likewise. + (BINFO_FOR_VBASE): New macro. + (get_vbase_types): Change prototype. + * class.c (build_vbase_path): Use BINFO_FOR_VBASE. + (prepare_fresh_vtable): Likewise. + (finish_vtbls): Likewise. + (get_class_offset_1): Likewise. + (modify_all_indirect_vtables): Likewise. + (build_vbase_pointer_fields): Likewise. + * decl.c (xref_basetypes): Don't set CLASSTYPE_VBASECLASSES here. + * init.c (sort_base_init): Use BINFO_FOR_VBASE. + (expand_member_init): Likewise. + * search.c (get_base_distance): Likewise. + (lookup_field_queue_p): Likewise. + (virtual_context): Likewise. + (get_vbase_types): Don't return a value. Set + CLASSTYPE_VBASECLASSES here. + * typeck.c (get_delta_difference): Use BINFO_FOR_VBASE. + +1999-12-30 Mark Mitchell + + * class.c (fixup_inline_methods): Clear CLASSTYPE_INLINE_FRIENDS. + +1999-12-29 Mark Mitchell + + * class.c (create_vtable_ptr): Put the vtable at the beginning of + the class, not the end, in the new ABI. + * tree.c (propagate_binfo_offsets): Do the right thing for the new + ABI. + +1999-12-29 Mark Mitchell + + * cp-tree.h (lang_type): Add nearly_empty_p. Adjust dummy. + (CLASSTYPE_NEARLY_EMPTY_P): New macro. + * class.c (check_bases): Update CLASSTYPE_NEARLY_EMPTY_P. + (check_field_decls): Likewise. + (check_bases_and_members): Likewise. + +1999-12-28 Mark Mitchell + + * cp-tree.h (do_inline_function_hair): Remove. + * class.c (layout_class_type): New function, split out from + finish_struct_1. + (fixup_pending_inline): Likewise. + (fixup_inline_methods): New function. + * method.c (fixup_pending_inline): Remove. + (do_inline_function_hair): Likewise. + + * decl.c (BOOL_TYPE_SIZE): Bools always have size `1' under the + new ABI. + + * cp-tree.h (lang_type): Replace abstract_virtuals with pure_virtuals. + (CLASSTYPE_ABSTRACT_VIRTUALS): Rename to ... + (CLASSTYPE_PURE_VIRTUALS): ... this. + (lang_decl_flags): Replace abstract_virtual with pure_virtual. + (DECL_ABSTRACT_VIRTUAL_P): Rename to ... + (DECL_PURE_VIRTUAL_P): ... this. + (get_abstract_virtuals): Rename to ... + (get_pure_virtuals): ... this. + * call.c (build_new_method_call): Replace DECL_PURE_VIRTUAL_P with + DECL_ABSTRACT_VIRTUAL_P. Replace CLASSTYPE_ABSTRACT_VIRTUALS with + CLASSTYPE_PURE_VIRTUALS. + * class.c (build_vtable_entry): Likewise. + (finish_struct_bits): Likewise. Call get_pure_virtuals, not + get_abstract_virtuals. + (build_vtbl_initializer): Likewise. + (override_one_vtable): Likewise. + (check_methods): Likewise. + * decl.c (duplicate_decls): Likewise. + (redeclaration_error_message): Likewise. + (lang_mark_tree): Likewise. + * decl2.c (grok_function_init): Likewise. + (import_export_vtable): Likewise. + (import_expor_class): Likewise. + * typeck2.c (abstract_virtuals_error): Likewise. + * xref.c (GNU_xref_member): Likewise. + * search.c (get_abstract_virtuals): Rename to get_pure_virtuals. + +1999-12-26 Zack Weinberg + + * cp-tree.h: Replace ENABLE_CHECKING with ENABLE_TREE_CHECKING + throughout. + +1999-12-26 Mark Mitchell + + * decl.c (store_return_init): Use mode of old RTL generated for + DECL_RESULT, not the mode of DECL_RESULT itself. + * semantics.c (finish_named_return_value): Set DECL_UNINLINABLE + for functions that used named return values. + +1999-12-24 Mark Mitchell + + * semantics.c (expand_body): Use + note_deferral_of_defined_inline_function. + +1999-12-22 Mark Mitchell + + * dump.c (dequeue_and_dump): Handle CTOR_STMTs. + +1999-12-22 Alexandre Oliva + + * error.c (dump_decl): Support named return values. + +1999-12-20 Mark Mitchell + + * cp-tree.h (CLASSTYPE_VFIELD_PARENT): Update comments. + (CLASSTYPE_HAS_PRIMARY_BASE_P): New macro. + (CLASSTYPE_PRIMARY_BINFO): Likewise. + * class.c (check_methods): Don't set TYPE_HAS_COMPLEX_INIT_REF, + TYPE_NEEDS_CONSTRUCTING, and CLASSTYPE_NON_AGGREGATE here. + (check_bases_and_members): Set them here instead. + (create_vtable_ptr): New function, split out from ... + (finish_struct_1): ... here. Use it. Tidy. Use + CLASSTYPE_HAS_PRIMARY_BASE_P and CLASSTYPE_PRIMARY_BINFO. + * search.c (dfs_init_vbase_pointers): Handle seeing TYPE_VFIELD as + the first field in the class. + * tree.c (layout_basetypes): Use CLASSTYPE_N_BASECLASSES. Handle + seeing TYPE_VFIELD as the first field in the class. + + * cp-tree.h (TYPE_VIRTUAL_P): Rename to ... + (TYPE_POLYMORPHIC_P): ... this. + (TYPE_USES_COMPLEX_INHERITANCE): Rename to ... + (TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P): ... this. + (TREE_CALLS_NEW): Remove. + (TREE_MANGLED): Likewise. + * call.c (build_vfield_ref): Use TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P, + and TYPE_POLYMORPHIC_P. + * class.c (check_bases): Likewise. + (finish_base_struct): Likewise. + (finish_struct_bits): Likewise. + (check_for_override): Likewise. + (finish_struct_1): Likewise. + (get_vfield_name): Likewise. + * decl.c (xref_basetypes): Likewise. + * decl2.c (import_export_class): Likewise. + (import_export_decl): Likewise. + * error.c (dump_function_decl): Likewise. + * pt.c (instantiate_class_template): Likewise. + * repo.c (repo_inline_used): Likewise. + * rtti.c (build_headof): Likewise. + (get_tinfo_fn_dynamic): Likewise. + (build_x_typeid): Likewise. + (get_tinfo_var): Likewise. + (build_dynamic_cast_1): Likewise. + (synthesize_tinfo_fn): Likewise. + * search.c (lookup_field_1): Likewise. + (dfs_debug_mark): Likewise. + (maybe_suppress_debug_info): Likewise. + * typeck.c (build_component_ref): Likewise. + (build_component_addr): Likewise. + * typeck2.c (process_init_constructor): Likewise. + +1999-12-20 Nathan Sidwell + + * typeck.c (strip_all_pointer_quals): New static function. + (build_static_cast): Use it. Don't use at_least_as_qualified_p. + +1999-12-16 Mark Mitchell + + * cp-tree.h (cp_tree_index): Add CPTI_DSO_HANDLE. + (dso_handle_node): New macro. + (flag_use_cxa_atexit): New variable. + (declare_global_var): New function. + (start_anon_func): Remove declaration. + (end_anon_func): Likewise. + * decl.c (get_atexit_node): New function, split out from + destroy_local_static. Handle flag_use_cxa_atexit. + (get_dso_handle_node): Likewise. + (start_cleanup_fn): Renamed from start_anon_func. Moved here from + except.c. Handle flag_use_cxa_atexit. + (end_cleanup_fn): Renamed from end_anon_func. Moved here from + except.c. + (declare_global_var): New variable. + (destroy_local_static): Handle flag_use_cxa_atexit. + * decl2.c (flag_use_cxa_atexit): New variable. + (lang_f_options): Likewise. + * except.c (start_anon_func): Remove. + (end_anon_func): Liekwise. + * lang-options.h: Add -fuse-cxa-atexit and -fno-use-cxa-atexit. + * rtti.c (get_tinfo_var): Use declare_global_var. + +1999-12-16 Mark Mitchell + + * class.c (check_field_decls): Don't return a value. + (avoid_overlap): Moved here from tree.c. + (build_base_fields): Likewise. + (check_bases): New function, split out from finish_base_struct. + (check_bases_and_members): New function, split out from + finish_struct_1. + (struct base_info): Remove cant_have_default_ctor, + cant_have_const_ctor, cant_have_asn_ref. + (finish_base_struct): Split semantic analysis into check_bases. + (finish_struct_methods): Fix bogus assertion. + (check_field_decls): Call finish_struct_anon here. + (build_vbase_pointer_fields): Use CLASSTYPE_N_BASECLASSES. + (finish_struct_1): Use check_bases_and_members. Reorganize. + * cp-tree.h (CLASSTYPE_VBASECLASSES): Improve documentation. + (build_base_fields): Don't declare. + * tree.c (avoid_overlap): Remove. + (build_base_fields): Likewise. + + * optimize.c (struct inline_data): Remove scope_stmt. + (remap_block): Don't use insert_block_after_note. Don't update + scope_stmt. + (expand_call_inline): Don't update scope_stmt. + (optimize_function): Don't initialize scope_stmt. + * semantics.c (expand_stmt): Set NOTE_BLOCK for newly emitted + NOTE_INSN_BLOCK_BEG/NOTE_INSN_BLOCK_END notes. + +1999-12-15 Mark Mitchell + + * class.c (handle_using_decl): Get TYPE_FIELDS and TYPE_METHODS + out of the class, rather than taking them as parameters. + (build_vbase_pointer_fields): Move here from tree.c. + (build_vtbl_or_vbase_field): New function. + (check_methods): Likewise. + (remove_zero_width_bitfields): Likewise. + (add_virtual_function): Use tree_cons instead of temp_tree_cons. + (delete_duplicate_fields_1): Tidy. Don't delete duplicate + USING_DECLs here. + (finish_struct_methods): Handle the case where there are no + methods here. + (get_basefndecls): Use tree_cons instead of temp_tree_cons. + (check_field_decls): Call delete_duplicate_fields here. + (finish_struct_1): Tidy. Use check_methods and + remove_zero_width_bitfields. + * cp-tree.h (build_vbase_pointer_fields): Remove. + * decl.c (grokdeclarator): Use tree_cons instead of + temp_tree_cons. + * decl2.c (qualified_lookup_using_namespace): Use tree_cons + instead of temp_tree_cons. + * lex.c (cons_up_default_function): Remove dead code. + * method.c (fixup_pending_inline): New function, split out from ... + (do_inline_function_hair): ... here. + * tree.c (build_vbase_pointer_fields): Remove. + +1999-12-15 Jason Merrill + + * tree.c (walk_tree): Walk operand subtrees in forward order. + * optimize.c (expand_call_inline): Likewise. + (optimize_function): Initialize id->scope_stmt to something useful. + (remap_block): Assume id->scope_stmt has a useful value. + +1999-12-15 Nathan Sidwell + + * typeck.c (build_c_cast): Expand warning message. Move pointer + alignment warning to after the cast. Don't warn about pointer + alignment when given a pointer to incomplete. + +1999-12-15 Richard Henderson + + * cp-tree.h (make_aggr_type): Declare. + * lex.c (cp_make_lang_type): Don't SET_IS_AGGR_TYPE. + (make_aggr_type): New. + + * decl.c (build_typename_type, init_decl_processing): Use it. + (build_ptrmemfunc_type, xref_tag): Likewise. + * except.c (call_eh_info): Likewise. + * init.c (init_init_processing): Likewise. + * pt.c (process_template_parm, lookup_template_class): Likewise. + * rtti.c (expand_class_desc): Likewise. + * semantics.c (begin_class_definition, finish_typeof): Likewise. + * tree.c (copy_template_template_parm): Likewise. + +1999-12-15 Jason Merrill + + * cp-tree.def (TEMPLATE_PARM_INDEX): Calculate size using + sizeof (struct tree_common). + +1999-12-14 Jason Merrill + + * optimize.c (expand_call_inline): Set BLOCK_ABSTRACT_ORIGIN on the + outermost block to point to the inlined function decl. + + * error.c (dump_decl): operator==, not operator ==. + (op_to_string): Likewise. + + * decl.c (compute_array_index_type): Handle null name. + + * decl2.c (ambiguous_decl): Fix to match comment. + (lookup_using_namespace): Adjust. + + * decl2.c (import_export_class): Don't ignore dllimport. + +1999-12-14 Mark Mitchell + + * class.c (check_field_decls): Split out from ... + (finish_struct_1): ... here. Use it. Tidy. + + * cp-tree.h (remap_save_expr): Add walk_subtrees parameter. + * optimize.c (copy_body_r): Pass it. + * tree.c (remap_save_expr): Clear walk_subtrees for an + already-handled SAVE_EXPR. + (cp_unsave_r): Pass walk_subtrees to remap_save_expr. + + * dump.c (dequeue_and_dump): Dump DECL_NAMESPACE_ALIAS. + * ir.texi (DECL_NAMESPACE_ALIAS): Document it. + + * error.c (dump_expr): Handle EXPR_WITH_FILE_LOCATION. + +1999-12-14 Mumit Khan + + * class.c (finish_base_struct): Allow multiple COM base classes + as well as non-COM bases as long as it's not the leftmost. + +1999-12-13 Mumit Khan + + * lex.c (saving_parse_to_obstack): New global. + (reinit_parse_for_block): Use. + (reinit_parse_for_expr): Use. + (check_newline): Use. + +1999-12-13 Mark Mitchell + + * optimize.c (initialize_inlined_parameters): Take FN to which the + parameters belong as an argument. + (expand_call_inline): Expand calls into the parameter + initializations before pushing the function onto the list of + functions we are presently expanding. + +1999-12-11 Kaveh R. Ghazi + + * class.c (get_vtable_name): Use a literal format string and + VTABLE_NAME_PREFIX macro instead of VTABLE_NAME_FORMAT. + (prepare_fresh_vtable): Likewise. + + * cp-tree.h (VTABLE_NAME_PREFIX): Define this instead of + VTABLE_NAME_FORMAT. + + * decl.c (make_rtl_for_local_static): Remove unused variable `type'. + + * init.c (build_vec_init): Initialize variable `try_body'. + + * lex.c (yyerror): Don't call a variadic function with a + non-literal format string. + + * optimize.c (optimize_function): Call memset, not bzero. + + * pt.c (for_each_template_parm_r): Add static prototype. + +1999-12-09 Andreas Jaeger + + * except.c (expand_throw): Add static attribute to match + prototype. + + * Makefile.in (semantics.o): Add dependency on output.h. + * semantics.c: Include output.h for declaration of + make_function_rtl. + +1999-12-09 Mark Mitchell + + * decl.c (init_decl_processing): Reenable inlining on trees. + (finish_function): Likewise. + * expr.c (cplus_expand_expr): Don't handle AGGR_INIT_EXPR here. + * semantics.c (simplify_aggr_init_exprs): New function. + (expand_body): Use it. + * tree.c (walk_tree): Special-case TARGET_EXPRs since they + sometimes present the same sub-tree twice. + + * dump.c (dequeue_and_dump): Abbreviate `class' as `cls', not + `csl'. + + * semantics.c (finish_switch_cond): Do conversions here, not ... + * typeck.c (c_expand_start_case): Here. + + * semantics.c (do_poplevel): Remove unused variable. + +1999-12-06 Mark Mitchell + + * tree.c (walk_tree): Don't recurse into DECL_INITIAL or DECL_SIZE + unless we're declaring the variable in question. + +1999-12-06 Mark Mitchell + + * decl.c (init_decl_processing): #if 0 last patch. + (finish_function): Likewise. + +1999-12-05 Mark Mitchell + + * decl.c (init_decl_processing): Set flag_inline_trees if + !flag_no_inline. + + * cp-tree.h (calls_setjmp_p): Declare. + * decl.c (finish_function): Mark functions that call setjmp as + uninlinable. + * optimize.c (calls_setjmp_r): New function. + (calls_setjmp_p): Likewise. + +1999-12-04 Mark Mitchell + + * optimize.c (expand_call_inline): Wrap the expanded call in an + EXPR_WITH_FILE_LOCATION node to get correct line numbers for + inlined functions. + + * optimize.c (inline_data): Remove fns_top. Add scope_stmt. Add + in_target_cleanup_p. + (remap_decl): New function. + (remap_block): Likewise. + (copy_scope_stmt): Likewise. + (copy_body_r): Use remap_decl and copy_scope_stmt. + (copy_body): Use VARRAY_TOP_TREE. + (initialize_inlined_parameters): Likewise. + (declare_return_variable): Likewise. + (inlinable_function_p): Check flag_inline_trees. + (expand_call_inline): Handle SCOPE_STMTs and TARGET_EXPRs + specially. Use VARRAY_PUSH_TREE. Create a BLOCK for the + parameters of the inlined function. + (optimize_function): Prevent recursion into partially complete + functions. + + * cp-tree.def (SCOPE_STMT): Take one operand. + * cp-tree.h (SCOPE_STMT_BLOCK): New macro. + (SCOPE_NULLIFIED_P): Redefine. + (SCOPE_NO_CLEANUPS_P): New macro. + (add_scope_stmt): Change prototype. + * decl.c (poplevel): Tidy. Warn about unused variables here. + Record SCOPE_STMT_BLOCKs. + (finish_function): Keep DECL_INITIAL for functions that might be + inlined. + * ir.texi: Document SCOPE_NO_CLEANUPS_P. + * semantics.c: Include rtl.h. + (add_scope_stmt): Return the new scope statement and, for an + end-of-scope statement, its matching begin statement. Don't set + SCOPE_NULLIFIED_P. + (do_pushlevel): Simplify, now that we are always + function-at-a-time. + (do_poplevel): Likewise. Record SCOPE_STMT_BLOCKs. + (expand_stmt): Don't call expand_start_bindings or + expand_end_bindings for a scope with SCOPE_NO_CLEANUPS_P set. + * tree.c (copy_tree_r): Clear SCOPE_STMT_BLOCK rather than setting + SCOPE_NULLIFIED_P. + * Makefile.in (semantics.o): Depend on RTL_H. + + * decl2.c (pending_statics_used): Make it a macro. + (saved_inlines_used): Likewise. + (finish_static_data_member_decl): Use VARRAY_PUSH_TREE. + (mark_inline_for_output): Likewise. + (ssdf_decls_used): Remove. + (start_static_storage_duration_function): Use VARRAY_PUSH_TREE. + (generate_ctor_or_dtor_function): Adjust accordingly. + +1999-11-24 Geoffrey Keating + Greg McGary + + * decl.c (duplicate_decls): Merge + DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT, + DECL_NO_CHECK_MEMORY_USAGE, DECL_NO_LIMIT_STACK. + +1999-12-02 Mike Stump + + * init.c (perform_member_init): Handle parse errors better. + +1999-12-01 Mark Mitchell + + * cp-tree.h (min_tree_cons): Remove. + (scratch_ovl_cons): Likewise. + * decl.c (saveable_obstack): Don't declare. + (duplicate_decls): Tweak error-message. + (initialize_local_var): Explicitly mark the definition as static. + (finish_function): Call permanent_allocation, just so + that the middle-end sees the obstacks it expects. + (mark_cp_function_context): Likewise. + * init.c (build_new): Don't use min_tree_cons. + * lex.c (permanent_obstack): Don't declare. + (current_obstack, saveable_obstack): Likewise. + * spew.c (current_obstack, saveable_obstack): Likewise. + * tree.c (current_obstack, saveable_obstack): Likewise. + (scratch_ovl_cons): Remove. + (build_min_nt): Don't mess with obstacks. + (build_min): Likewise. + (min_tree_cons): Remove + * typeck.c (build_component_ref): Don't use scratch_ovl_cons. + (build_x_function_call): Likewise. + (build_c_cast): Don't use min_tree_cons. + +1999-11-29 Mark Mitchell + + * pt.c (tsubst_decl): Robustify. + +1999-11-27 Mark Mitchell + + * decl2.c (finish_file): Call expand_body for inline functions + that will be written out but that do not yet have RTL. + * semantics.c (expand_body): Do not generate RTL For inline + functions that do not yet need to be written out. + +1999-11-25 Mark Mitchell + + * Make-lang.in (CXX_SRCS): Add optimize.c. + * Makefile.in (CXX_OBJS): Add optimize.o. + (CXX_TREE_H): Add splay-tree.h, system.h, and $(CONFIG_H). + (spew.o, lex.o, decl.o, decl2.o, typeck2.o, typeck.o): Adjust. + (class.o, call.o, friend.o, init.o, method.o, cvt.o): Likewise. + (search.o, tree.o, ptree.o, rtti.o, except.o, expr.o): Likewise. + (xref.o, pt.o, error.o, errfn.o, repo.o, semantics.o): Likewise. + (dump.o): Likewise. + (optimize.o): New target. + * class.c: Don't include splay-tree.h. + * cp-tree.def (CTOR_COMPLETE): Rename to CTOR_STMT. + * cp-tree.h: Include splay-tree.h. + (DECL_UNINLINABLE): New macro. + (CTOR_BEGIN_P, CTOR_END_P): New macros. + (flag_inline_trees): New variable. + (local_variable_p): New function. + (nonstatic_local_decl_p): Likewise. + (optimize_function): Likewise. + (cplus_unsave_expr_now): Remove. + (copy_tree_r): Declare. + (remap_save_expr): Likewise. + * decl.c (local_variable_p): Don't + make it static. + (local_variable_p_walkfn): New function. + (make_rtl_for_local_static): Remove code to try to avoid writing + out static constants. + (emit_local_var): Fix indentation. + (nonstatic_local_decl_p): New function. + (check_default_argument): Use local_variable_p_walkfn, not + local_variable_p, when walking the tree. + (start_function): Set the DECL_CONTEXT for automatically generated + labels. + (finish_constructor_body): Use CTOR_STMT to mark the end of a + constructor. + * decl2.c: Don't include splay-tree.h. + (flag_inline_trees): Define. + * dump.c: Don't include + splay-tree.h. + * except.c (expand_end_catch_block): Fix comment formatting. + (expand_end_eh_spec): Set DECL_CONTEXT on temporary variables. + (expand_throw): Tidy comment. + * init.c (build_vec_delete_1): Use create_temporary_var. + * lex.c (cplus_tree_code_type): Make it static. + (cplus_tree_code_length): Likewise. + (cplus_tree_code_name): Likewise. + * optimize.c: New file. + * semantics.c (finish_goto_stmt): Set DECL_UNLINABLE for functions + with computed gotos. + (setup_vtbl_ptr): Mark the beginnings of constructors with + CTOR_STMT. + (expand_stmt): Handle CTOR_STMT, not CTOR_COMPLETE. + (expand_body): Call optimize_function. Save bodies if we're doing + inlining on trees. + * tree.c: Don't include splay-tree.h. Include insn-config.h and + integrate.h. + (copy_tree_r): Make it public. + (statement_code_p): New function. + (mark_local_for_remap_r): Likewise. + (cp_usave_r): Likewise. + (cp_unsave): Likewise. + (build_cplus_new): Set DECL_CONTEXT for temporary variables. + (walk_tree): Walk into `s' class nodes. Walk statement chains. + (copy_tree_r): Handle 's' class nodes. Restore chains for + statements. Nullify scopes. Don't copy types. + (init_tree): Set lang_unsave to cp_unsave. + (remap_save_expr): Define. + * ir.texi: Document CTOR_STMT. + +1999-11-24 Jason Merrill + + * search.c (note_debug_info_needed): Do perform this optimization + for dwarf2. + (maybe_suppress_debug_info): Likewise. Start by clearing + TYPE_DECL_SUPPRESS_DEBUG. + +1999-11-24 Mark Mitchell + + * pt.c (tsubst_decl): Copy TREE_ASM_WRITTEN for VAR_DECLs. + + * decl2.c (finish_vtable_vardecl): Don't prune vtables here. + +1999-11-23 Kaveh R. Ghazi + + * decl.c (pushdecl, grokdeclarator): Don't call a variadic + function with a non-literal format string. + + * lex.c (do_identifier): Likewise. + + * typeck.c (build_unary_op): Likewise. + +1999-11-23 Mark Mitchell + + * cp-tree.h (DECL_NEEDED_P): Tweak to match documentation. + +1999-11-22 Mark Mitchell + + * cp-tree.def (CTOR_COMPLETE): New tree node. + * decl.c (finish_constructor_body): Add it, to mark the end of the + constructor. + (finish_function): Don't call end_protect_partials here. + * ir.texi (CTOR_COMPLETE): Document it. + * semantics.c (expand_stmt): Handle it. + + * cp-tree.def (FUNCTION_NAME): New tree node. + * cp-tree.h (current_function_name_declared): Tweak documentation. + (lang_decl_flags): Add pretty_function_p, adjust dummy. + (DECL_PRETTY_FUNCTION_P): New macro. + * decl.c (cp_finish_decl): Handle declarations of __FUNCTION__, + etc., in a template function. Use at_function_scope_p instead of + expanding it inline. + * pt.c (tsubst_decl): Handle DECL_PRETTY_FUNCTION_P declarations + specially. + (tsubst): Handle FUNCTION_NAME. + (tsubst_copy): Likewise. + (instantiate_decl): Prevent redeclarations of __PRETTY_FUNCTION__, + etc. in instantiation. + * semantics.c (begin_compound_stmt): Declare __FUNCTION__, etc., + even in template functions. + (setup_vtbl_ptr): Don't declare __PRETTY_FUNCTION in the + conditional scope at the top of a destructor. + + * error.c (dump_function_decl): Use `[ with ... ]' syntax for + specializations too. + +1999-11-22 Nathan Sidwell + + * semantics.c (finish_unary_op_expr): Only set TREE_NEGATED_INT + when actually negative. + + * typeck.c (convert_for_assignment): Expand comment about + strange NULL check, moved from ... + (convert_for_initialization): ... here. Remove unneeded + code. + +1999-11-21 Alexandre Oliva + + * cp-tree.h (build_vec_delete): Remove `auto_delete' argument. + * init.c (build_vec_delete, build_vec_delete_1): Likewise. + Always destruct virtual bases of array components, but never + delete them. + (build_vec_init): Adjust invocations. + (build_delete): Likewise. + * decl2.c (delete_sanity): Likewise. + +1999-11-19 Nathan Sidwell + + * cp-tree.h (grok_method_quals): Return this pointer qualifiers. + * decl.c (grokdeclarator): Adjust calls to grok_method_quals. + * decl2.c (grok_method_quals): Accept `restrict' as applying to + the object pointer. Return such qualifiers. + (grokclassfn): Apply this pointer qualifiers. Cleanup unused + variables. + +1999-11-18 Mark Mitchell + + * except.c (expand_end_catch_block): Fix typo. + (expand_exception_blocks): Simplify. Don't call + expand_leftover_cleanups. + +1999-11-15 Jason Merrill + + * cp-tree.h, decl.c (compute_array_index_type): Make nonstatic. + * pt.c (tsubst, case INTEGER_TYPE): Call it. + Check uses_template_parms. + + * class.c (finish_struct): If we're a local class in a template + function, add a TAG_DEFN. + * pt.c (lookup_template_class): If this is a local class in a + template function, call pushtag. + (tsubst_expr, case TAG_DEFN): Handle classes, too. + + Emit debug info with the vtable. + * search.c (maybe_suppress_debug_info): New function... + * class.c (finish_struct_1): ...split out from here. + * cp-tree.h: Declare it. + * decl2.c (finish_vtable_vardecl): Override TYPE_DECL_SUPPRESS_DEBUG + if we're writing out the vtable. + * decl.c, search.c (dfs_debug_mark, dfs_debug_unmarked_p, + note_debug_info_needed): #if 0 out. + +1999-11-14 Mark Mitchell + + * cp-tree.h (DECL_LOCAL_FUCNTION_P): New macro. + * call.c (equal_functions): Use DECL_LOCAL_FUCNTION_P, not + TREE_PERMANENT. + * decl.c (pushdecl): Set DECL_LOCAL_FUNCTION_P. + * decl2.c (lookup_arg_dependent): Use it. + + * cp-tree.h (cp_finish_decl): Change prototype. + (finish_static_data_member_decl): Likewise. + (push_permanent_obstack): Remove declaration. + (push_expression_obstack): Likewise. + (push_scratch_obstack): Likewise. + (DECL_TEMPLATE_PARM_P): Robustify. + (SET_DECL_TEMPLATE_PARM_P): New macro. + * class.c (add_method): Don't manipulate obstacks. + (finish_vtbls): Likewise. + * cvt.c (build_up_reference): Adjust calls to cp_finish_decl. + * decl.c (binding_for_name): Don't manipulate obstacks. + (maybe_push_to_top_level): Likewise. + (pop_from_top_level): Likewise. + (duplicate_decls): Likewise. + (pushdecl): Likewise. + (implicitly_declare): Likewise. + (build_typename_type): Likewise. + (start_decl): Likewise. + (cp_finish_decl): Likewise. + (finish_decl): Likewise. + (destroy_local_static): Likewise. + (expand_static_init): Likewise. + (complete_array_type): Likewise. + (grokvardecl): Likewise. + (build_ptrmemfnc_type): Likewise. + (grokdeclarator): Likewise. + (xref_tag): Likewise. + (xref_basetypes): Likewise. + (start_enum): Likewise. + (finish_enum): Likewise. + (start_function): Likewise. + (finish_function): Likewise. + (start_method): Adjust call to cp_finish_decl. + * decl2.c (finish_static_data_member_decl): Don't manipulate + obstacks. + (grokfield): Likewise. + (grokbitfield): Likewise. + (get_temp_name): Likewise. + (get_sentry): Likewise. + (fnish_file): Likewise. + (lookup_arg_dependent): Likewise. + * except.c (call_eh_info): Likewise. + (push_eh_info): Likewise. + (do_pop_exception): Likewise. + (initialize_handler_parm): Likewise. + (expand_end_eh_spec): Likewise. + (alloc_eh_object): Likewise. + (expand_throw): Likewise. + * expr.c (extract_scalar_init): Likewise. + * init.c (build_java_class_ref): Likewise. + * lex.c (get_time_identifier): Likewise. + (snarf_defarg): Likewise. + (add_defarg_fn): Likewise. + (is_global): Simplify. + (do_identifier): Don't check TREE_PERMANENT. + * method.c (emit_thunk): Don't manipulate obstacks. + * parse.y (condition): Adjust call to cp_finish_decl. + (primary): Likewise. + (initdcl): Likewise. + (initdcl0_innards): Likewise. + (nomods_initdcl0): Likewise. + * pt.c (push_inline_template_parms_recursive): Use + SET_DECL_TEMPLATE_PARM_P. + (process_template_parm): Likewise. + (lookup_template_class): Don't manipulate obstacks. + (instantiate_class_template): Adjust call to + finish_static_data_member_decl. + (tsubst_decl): Don't manipulate obstacks. + (tsubst_expr): Likewise. + (instantiate_template): Likewise. + (instantiate_decl): Adjust calls to cp_finish_decl. + * rtti.c (call_void_fn): Don't manipulate obstacks. + (get_tinfo_var): Likewise. + (get_tinfo_fn_unused): Likewise. + (build_dynamic_cast_1): Likewise. + (expand_si_desc): Likewise. + (expand_class_desc): Likewise. + (expand_ptr_desc): Likewise. + (expand_attr_desc): Likewise. + (expand_generic_desc): Likewise. + (synthesize_tinfo_fn): Likewise. + * search.c (expand_upcast_fixups): Likewise. + * semantics.c (finish_asm_stmt): Likewise. + (finish_named_return_value): Likewise. + (begin_class_definition): Likewise. + (finish_class_definition): Likewise. + (finish_typeof): Likewise. + * tree.c (build_cplus_method_type): Likewise. + (reverse_path): Likewise. + (copy_template_template_parm): Likewise. + (build_expr_ptr_wrapper): Likewise. + (push_expression_obstack): Remove. + (push_permanent_obstack): Likewise. + * typeck.c (mark_addressable): Likewise. + +1999-11-13 Mark Mitchell + + * call.c (build_conditional_expr): Use build_target_expr_with_type. + (convert_like): Likewise. + (build_over_call): Likewise. + * cp-tree.h (build_target_expr): Remove. + (build_target_expr_with_type): New function. + * cvt.c (build_up_reference): Use get_target_expr. + * decl.c (build_target_expr): Move to ... + * tree.c (build_target_expr): Here. Make it static. + (build_target_expr_with_type): New function. Set DECL_CONTEXT on + the temporary VAR_DECLs. + (get_target_expr): Use it. + +1999-11-13 Jason Merrill + + * decl.c (duplicate_decls): Propagate DECL_DEFER_OUTPUT. + * decl2.c (comdat_linkage): Set DECL_DEFER_OUTPUT. + * rtti.c (get_tinfo_fn_unused): Split out from get_tinfo_fn. + * class.c (set_rtti_entry): Use it. + +1999-11-12 Mark Mitchell + + * decl.c (cplus_expand_expr_stmt): Don't call break_out_cleanups + here. + * semantics.c (finish_expr_stmt): Call it here instead. Move + default_conversion logic to semantic-analysis time. + +1999-11-12 Jason Merrill + + * rtti.c (synthesize_tinfo_fn): Set DECL_DEFER_OUTPUT. + +Fri Nov 12 12:56:32 MST 1999 Diego Novillo + + * init.c (init_init_processing): Re-instated Nov 11 patch after + approval. + +Fri Nov 12 10:42:02 MST 1999 Diego Novillo + + * init.c (init_init_processing): Undo patch from Nov 11, 1999. + Patch had not been approved yet. + +1999-11-12 Mark Mitchell + + * decl.c (compute_array_index_type): New function, split out from + grokdeclarator. + (create_array_type_for_decl): Likewise. + (grokdeclarator): Use them. + + * semantics.c (expand_stmt): Don't suspend_momentary or + resume_momentary. + +Thu Nov 11 12:42:11 MST 1999 Diego Novillo + + * init.c (init_init_processing): Header information for + arrays allocated via `new' should have the same alignment used by + malloc. + +1999-11-10 Mark Mitchell + + * error.c (dump_function_name): Don't crash if given a friend + pseudo-instantiation. + + * cp-tree.h (build_enumerator): Change prototype. + * decl.c (enum_next_value): Remove. + (enum_overflow): Likewise. + (init_decl_processing): Don't register enum_next_value as a root. + (start_enum): Clear TYPE_VALUES for a redefined enum. + (finish_enum): Reset the type of enumeration constants. + (build_enumerator): Fix indentation. Don't copy CONST_DECLs when + we don't need to. Maintain the TYPE_VALUES list and look there + for the previously defined enumeration constant. Let enumeration + constants have the type of their values until the enumeration type + is complete. + * parse.y (enumlist_opt, enumlist, enumerator): Don't return a value. + (structsp): Adjust. + * parse.c: Regenerated. + * pt.c (tsubst_enum): Adjust according to build_enumerator changes. + +Wed Nov 10 12:43:21 1999 Philippe De Muyter + Kaveh R. Ghazi + + * cp-tree.h: Test `GCC_VERSION', not `HAVE_GCC_VERSION'. + +1999-11-09 Mark Mitchell + + * cp-tree.h (language_function): Remove x_last_dtor_insn and + x_last_parm_cleanup_insn. + * decl.c (last_dtor_insn): Remove. + (last_parm_cleanup_insn): Likewise. + (expand_start_early_try_stmts): Don't set them. + (store_parm_decls): Likewise. + (save_function_data): Or save them. + (mark_lang_function): Or mark them. + +1999-11-08 Mark Mitchell + + * decl.c (store_parm_decls): Generate cleanup code at + semantic-analysis time. Destroy objects in the correct order. + +1999-11-07 Mark Mitchell + + * cp-tree.h (begin_new_placement): Remove. + (finish_new_placement): Likewise. + * class.c (finish_struct_1): Don't suspend_momentary or + resume_momentary. + * decl.c (grokdeclarator): Likewise. + (maybe_build_cleanup_1): Likewise. + * except.c (push_eh_cleanup): Likewise. + (build_terminate_handler): Likewise. + * init.c (build_new_1): Likewise. + * parse.y (parse_decl): Change prototype. + (initdecls, notype_initdecls, initdcl): Don't return int. + (initdcl0, notype_initdcl0, initdcl0_innards): Likewise. + (.begin_new_placement): Remove. + (.finish_new_placement): Likewise. + (nonmomentary_expr): Likewise. + (suspend_mom): Likewise. + (condition): Don't suspend_momentary, resume_momentary, or keep + track of need to resume. + (unary_expr): Likewise. + (new_placement): Likewise. + (decl): Likewise. + (structsp): Likewise. + (new_type_id): Likewise. + (maybe_parmlist): Likewise. + (direct_after_type_declaration): Likewise. + (direct_new_declarator): Likewise. + (direct_abstract_declaration): Likewise. + * parse.c: Regenerated. + * pt.c (tsubst_expr): Don't suspend_momentary or resume_momentary. + * semantics.c (begin_new_placement): Remove. + (finish_new_placement): Likewise. + +1999-11-05 Martin v. Löwis + + * cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro. + (DECL_TEMPLATE_INFO): Use it. + * decl.c (warn_extern_redeclared_static): Do nothing for + TEMPLATE_DECLs. + * decl2.c (mark_used): Explicitly check for function or variable. + * semantics.c (finish_unary_op_expr): Check whether result is also + an INTEGER_CST. + +1999-11-05 Mark Mitchell + + * Makefile.in (typeck2.o): Depend on output.h. + * typeck2.c: Include output.h. + + * decl.c (flag_ansi): Remove declaration. + + * pt.c (tinst_level_tick): Make it static. + (last_template_error_tick): Likewise. + + * cp-tree.h (mapcar): Remove declaration. + (search_tree): Likewise. + (walk_tree_fn): New typedef. + (walk_tree): New function. + * tree.c (bot_manip): Change prototype. Adjust to be called via + walk_tree. + (bot_replace): Likewise. + (no_linkage_helper): Likewise. + (copy_tree_r): New function. + (search_tree): Rename, and adjust, to become ... + (walk_tree): New function. + (mapcar): Remove. + (target_remap): Remove. + (target_remap_count): Likewise. + (break_out_target_exprs): Use walk_tree. + * decl.c (local_variable_p): Change prototype. + (check_default_argument): Use walk_tree. + * pt.c (for_each_template_parm_r): New function, split out from ... + (for_each_template_parm): Here. Use it, via walk_tree. + +1999-11-03 Mark Mitchell + + * class.c (check_bitfield_decl): New function, split out from + finish_stuct_1. + (check_field_decl): Likewise. Recursively examine members of + anonymous structs. + (finish_struct_1): Use them. + * cp-tree.h (ANON_UNION_TYPE_P): New macro. + +1999-11-02 Mark Mitchell + + * decl.c (grokfndecl): Remove dead code. + + * dump.c (dequeue_and_dump): Fix thinko for catch-clauses. + +1999-11-02 Scott Snyder + + * decl2.c (build_expr_from_tree): Handle REALPART_EXPR and + IMAGPART_EXPR. + * pt.c (tsubst_copy): Likewise. + +1999-11-01 Jason Merrill + + * decl2.c (maybe_make_one_only): Always make things comdat on + ELF targets, too. + +1999-10-31 Mark Mitchell + + * decl.c (finish_function): Call free_after_parsing for functions + we are not immediately turning into RTL. + +1999-10-31 Brendan Kehoe + + * cp-tree.h (flag_dump_translation_unit): Add decl. + +Sat Oct 30 22:42:50 1999 Stephen L Moshier + + * lex.c (yylex): Accept 'f' in mantissa of hex float constant. + +1999-10-30 Mark Mitchell + + * decl.c (pop_cp_function_context): Don't call free on a NULL + pointer. + * semantics.c: Include ggc.h. + (expand_body): Do garbage-collection after processing a template + function. Clear DECL_SAVED_TREE after generating RTL for a + function. + * Makefile.in (semantics.o): Depend on ggc.h. + +1999-10-29 Mark Mitchell + + * cp-tree.h (make_typename_type): Change prototype. + * decl.c (make_typename_type): Only complain if so requested. + * parse.y (nested_name_specifier): Adjust calls. + (typename_sub0): Likewise. + (typename_sub1): Likewise. + * parse.c: Regenerated. + * pt.c (convert_template_argument): Pass complain to + make_typename_type. + (tsubst): Likewise. + +1999-10-28 Mark Mitchell + + * semantics.c (finish_handler): End the scope of the handler + before attaching it to the statement-tree. + +1999-10-28 Ian Lance Taylor + + * rtti.c (build_dynamic_cast_1): Give a better error message for + an attempt to dynamic_cast from a non-polymorphic type. + +1999-10-27 Mark Mitchell + + * cp-tree.h (make_temp_vec): Remove. + (make_scratch_vec): Likewise. + * call.c (add_function_candidate): Use make_tree_vec. + (add_conv_candidate): Likewise. + (build_builtin_candidate): Likewise. + (add_template_candidate_real): Likewise. + * class.c (resolve_address_of_overloaded_function): Likewise. + * decl.c (start_function): Don't fool with the momentary obstack. + (finish_function): Likewise. + * init.c (expand_direct_vtbls_init): Likewise. + (begin_init_stmts): Likewise. + (finish_init_stmts): Likewise. + * pt.c (add_to_template_args): Use make_tree_vec. + (check_explicit_specialization): Likewise. + (coerce_template_parms): Likewise. + (lookup_template_class): Don't fool with the momentary obstack. + (instantiate_class_template): Likewise. + (tsubst_template_arg_vector): Use make_tree_vec. + (tsubst_aggr_type): Don't fool with the momentary obstack. + (tsubst_decl): Likewise. Use make_tree_vec. + (try_one_overload): Likewise. + (try_class_unification): Don't fool with the momentary obstack. + (get_bindings_real): Use make_tree_vec. + (set_mangled_name_for_template_decl): Likewise. + * rtti.c (synthesize_tinfo_fn): Don't fool with the momentary obstack. + * semantics.c (finish_expr_stmt): Likewise. + (finish_do_stmt): Likewise. + (finish_for_expr): Likewise. + (finish_switch_cond): Likewise. + (do_pushlevel): Likewise. + (do_poplevel): Likewise. + * tree.c (make_temp_vec): Remove. + + * dump.c (dequeue_and_dump): Dump HANDLERs and SAVE_EXPRs. Dump + CLEANUP_P for a TRY_BLOCK. + * ir.texi: Document SAVE_EXPR. + +Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com) + + * call.c (build_over_call): Check that the built-in function is + of class BUILT_IN_NORMAL before trying to recongize it as BUILT_IN_ABS. + * typeck.c (build_function_call_real): Similarly. + +1999-10-26 Mark Mitchell + + * decl.c (poplevel): Don't set BLOCK_TYPE_TAGS. Don't call + remember_end_note. + +1999-10-24 Mark Mitchell + + * decl.c (push_overloaded_decl_1): Use pushdecl. + + * decl.c (auto_function): Replace #ifdef'd __inline with just + plain inline. + * lex.c (my_get_run_time): Likeise. + (yyprint): Likewise. + (identifier_type): Likewise. + * method.c (start_squangling): Likewise. + (end_squangling): Likewise. + (icat): Likewise. + (old_backref_index): Likewise. + (flush_repeats): Likewise. + (issue_ktype): Likewise. + * parse.y (empty_parms): Likewise. + * parse.c: Regenerated. + +1999-10-21 Mark Mitchell + + * dump.c (dequeue_and_dump): Replace several uses of + queue_and_dump_index with dump_child. + +1999-10-21 Kaveh R. Ghazi + + * expr.c: Include tm_p.h. + +1999-10-21 Mark Mitchell + + * cp-tree.h (SCOPE_PARTIAL_P): New macro. + (pushlevel_temporary): Remove. + (add_scope_stmt): New function. + * decl.c (pushlevel_temporary): Remove. + (poplevel): Use add_scope_stmt. + (start_decl_1): Likewise. + * semantics.c (add_scope_stmt): New function. + (do_pushlevel): Use it. + (do_poplevel): Use it. + (expand_stmt): Check SCOPE_PARTIAL_P. + + * cp-tree.def (EMPTY_CLASS_EXPR): New tree node. + * call.c (build_call): Use EMPTY_CLASS_EXPR instead of RTL_EXPR. + * expr.c (cplus_expand_expr): Expand it. + * ir.texi: Document EMPTY_CLASS_EXPR. + +1999-10-20 Mark Mitchell + + * cp-tree.h (DECL_NAMESPACE_SCOPE_P): Don't treat template + parameters as having namespace scope. + +1999-10-19 Mark Mitchell + + * method.c (PARM_CAN_BE_ARRAY_TYPE): Remove. + (mangling_flags): New type. + (build_overload_int): Change prototype. + (build_overload_value): Likewise. + (numeric_output_need_bar): Improve comment. + (mangle_expression): New function, broken out from ... + (build_overload_int): Here. + (build_overload_value): Adjust for use of mangling flags. Don't + warn about real-valued template parameters here. Do handle + complex expressions involving real-valued template parameters. + (build_template_parm_names): Encase non-type template parameters + in underscores, if necessary. + (process_overload_item): Remove conditional on + PARM_CAN_BE_ARRAY_TYPE. + +1999-10-17 Mark Mitchell + + * dump.c (dequeue_and_dump): Handle CLEANUP_POINT_EXPR. + + * ir.texi: Clean up documentation of RETURN_INIT. + +1999-10-15 Greg McGary + + * lex.c (lang_init_options): Set flag_bounds_check as "unspecified". + (lang_init): Set default for flag_bounds_check if still "unspecified". + +1999-10-13 Andrew Haley + + * class.c (finish_struct_1): Force alignment of non-bitfields to + BITS_PER_UNIT. + +Wed Oct 13 22:01:35 1999 J"orn Rennecke + + * typeck2.c (process_init_constructor): Handle empty constructors. + +1999-10-13 Jason Merrill + + * decl.c (lang_mark_tree): Mark NAMESPACE_LEVEL. + + * pt.c (tsubst, case INTEGER_TYPE): Be more explicit in zero-size + array error. + +1999-10-13 Mark Mitchell + + * decl.c (make_rtl_for_local_static): Don't create register RTL + for addressable constants. + +1999-10-13 Nathan Sidwell + + * cp-tree.h (build_x_va_arg): Prototype new function. + * call.c (build_x_va_arg): Define it. + * parse.y (unary_expr): Call build_x_va_arg. + + * cp-tree.h (convert_type_from_ellipsis): Prototype new function. + * call.c (convert_type_from_ellipsis): Define it. + * decl.c (init_decl_processing): Set lang_type_promotes_to. + + * tree.c (lvalue_p_1): Accept VA_ARG_EXPR with aggregates. + +1999-10-11 Jason Merrill + + * class.c (fixed_type_or_null): Always set *nonnull. + +1999-10-10 Kaveh R. Ghazi + + * cp-tree.h: Use HAVE_GCC_VERSION instead of explicitly testing + __GNUC__ and __GNUC_MINOR__. + +1999-10-09 Mark Mitchell + + * cp-tree.h (make_rtl_for_local_static): New function. + * decl.c (make_rtl_for_nonlocal_decl): Move code to create RTL for + local statics ... + (make_rtl_for_local_static): Here. + * semantics.c (expand_stmt): Use make_rtl_for_local_static. + +1999-10-08 Kaveh R. Ghazi + + * method.c: Include tm_p.h. + +1999-10-7 Franz Sirl + + * cp-tree.h (cp_make_lake_type): Renamed from make_lang_type. + * lex.c (cp_make_lake_type): Likewise. + * tree.c (init_tree): Init make_lang_type_fn. + +1999-10-07 Mark Mitchell + + * pt.c (tsubst_expr): Set DECL_TEMPLATE_INSTANTIATED for a catch + parameter. + + * semantics.c (expand_stmt): Don't pretend to have asmspecs for + local statics if we don't really have them. + + * ir.texi: Improve documentation for STMT_EXPR. Describe + CLEANUP_POINT_EXPR. + +1999-10-07 Jason Merrill + + * class.c (build_vtable_entry_ref): Use finish_asm_stmt. + +1999-10-07 Greg McGary + + * class.c (finish_struct_1): Use simpler method of + removing elements of a singly-linked list which doesn't + lose for classes without data members. + +1999-10-07 Mark Mitchell + + * friend.c (make_friend_class): Robustify. + + * semantics.c (finish_object_call_expr): Reject calls to template + types. + +1999-10-06 Mark Mitchell + + * dump.c (dequeue_and_dump): Dump all three operands to a COND_EXPR. + + * cp-tree.h (CLASSTYPE_VFIELD): Remove. + * call.c (build_vfield_ref): Use TYPE_VFIELD, not + CLASSTYPE_VFIELD. + * class.c (get_vfield_offset): Likewise. + (finish_base_struct): Likewise. + (modify_one_vtable): Likewise. + (fixup_vtable_deltas): Likewise. + (finish_struct_1): Likewise. + * init.c (expand_virtual_init): Likewise. + * search.c (lookup_field_1): Likewise. + (expand_upcast_fixups): Likewise. + * typeck.c (build_component_ref): Likewise. + (build_binary_op_nodefault): Likewise. + + * dump.c (dqueue_and_dump): Dump TYPE_VFIELD. + * ir.texi: Document TYPE_VFIELD. + +1999-10-06 Brendan Kehoe + + * decl.c (grokdeclarator): Only warn about nonzero arrays if + !in_system_header (linux socketbits.h can give this for + __cmsg_data, which is using a GNU extension). + +1999-10-05 Mark Mitchell + + * decl2.c (start_static_storage_duration_function): Push the + function declaration so it ends up in namespace scope. + + * dump.c (DUMP_CHILDREN): Remove. + (DUMP_BINFO): Adjust. + (struct dump_node_info): Remove dump_children_p. + (queue_and_dump_type): Remove dump_children_p parameter. + (queue): Don't set dump_children_p. + (dump_child): Pass DUMP_NONE, instead of DUMP_CHILDREN, to + queue_and_dump_index. + (dequeue_and_dump): Unconditionally print children. Adjust calls + to functions mentioned above. + (dump_node): Pass DUMP_NONE, instead of DUMP_CHILDREN to queue. + + * ir.texi: Document BIND_EXPR, LOOP_EXPR, and EXIT_EXPR. + * dump.c (dequeue_and_dump): Dump them. + + * method.c (synthesize_method): Call setup_vtbl_ptr for destructors. + + * decl.c (start_function): Set current_in_charge_parm for + constructors, too, where appropriate. + * search.c (fixup_all_virtual_upcast_offsets): New function. + (expand_indirect_vtbls_init): Use it. + +1999-10-04 Nathan Sidwell + + * decl2.c (grok_alignof): Don't decay lvalues. + + * init.c (build_new): Remove unused variable. + +1999-10-04 Mark Mitchell + + * cp-tree.h (struct language_function): Remove static_labelno. + (static_labelno): Remove macro. + * method.c (build_overload_nested_name): Make static_labelno + static here. + + * pt.c (instantiate_decl): Use DECL_SAVED_TREE, not DECL_INITIAL, + to decide whether or not a function is defined. + + * call.c (build_over_call): Don't set TREE_SIDE_EFFECTS for + situations where make_node will do it automatically. + * decl.c (grok_reference_init): Likewise. + (expand_static_init): Likewise. + (do_static_initialization): Likewise. + * init.c (perform_member_init): Likewise. + (expand_aggr_init_1): Likewise. + (build_new_1): Likewise. + * method.c (do_build_copy_constructor): Likewise. + (do_build_assign_ref): Likewise. + * search.c (expand_upcast_fixups): Likewise. + * semantics.c (finish_stmt_expr): Likewise. + * typeck.c (build_unary_op): Likewise. + (check_return_expr): Likewise. + +1999-10-04 Jason Merrill + + * init.c (build_vec_delete_1): Fold COND_EXPRs. + +1999-10-03 Mark Mitchell + + * cp-tree.def (VEC_INIT_EXPR): Remove. + * cp-tree.h (struct stmt_tree): New type. + (struct saved_scope): Remove firstobj. Add x_saved_tree, + x_stmt_tree. + (class_cache_firstobj): Remove. + (struct language_function): Remove stmts_are_full_exprs_p, + x_last_tree, and x_last_expr_type. Add x_stmt_tree. + (current_stmt_tree): New macro. + (last_tree): Adjust. + (last_expr_type): Likewise. + (doing_semantic_analysis_p): Simplify. + (stmts_are_full_exprs_p): Adjust. + (begin_tree): Remove prototype. + (end_tree): Likewise. + (begin_stmt_tree): Change prototype. + (finish_stmt_tree): Likewise. + (building_stmt_tree): Simplify. + * decl.c (mark_stmt_tree): New function. + (mark_saved_scope): Use it. + (start_function): Rearrange slightly to call begin_stmt_tree + earlier. + (save_function_data): Tweak. + (finish_function): Adjust call to finish_stmt_tree. + (mark_lang_function): Use mark_stmt_tree. + * expr.c (cplus_expand_expr): Don't handle VEC_INIT_EXPR. + * init.c (build_new_1): Remove creation of VEC_INIT_EXPR. + (build_vec_init): Remove creation of stand-in initializer. + * pt.c (begin_tree): Remove. + (end_tree): Likewise. + * semantics.c (SET_LAST_STMT): New macro. Use it throughout. + (begin_compound_stmt): Handle a compound-statement outside of a + function. + (begin_stmt_expr): Handle a statement-expression outsidef of a + function. + (finish_stmt_expr): Likewise. + (begin_class_definition): Don't call begin_tree. + (finish_inline_definitions): Don't call end_tree. + (begin_stmt_tree): Take a pointer to tree, not a function as input. + (finish_stmt_tree): Likewise. + * tree.c (search_tree): Don't handle VEC_INIT_EXPR. + (mapcar): Likewise. + + * parse.y (simple_stmt): Don't call finish_stmt unnecessarily. + * parse.c: Regenerated. + + * dump.c (dqueue_and_dump): Dump bitfieldness. + + * tree.c (lvalue_p_1): Use DECL_C_BIT_FIELD to check for + bitfields, rather than DECL_BIT_FIELD. + * ir.texi: Document how to tell whether or not a field is a + bitfield. + + * lex.c (make_lang_type): Fix typo in comment. + +1999-10-01 Jason Merrill + + * typeck.c (decay_conversion): Strip cv-quals from non-class rvalues. + +1999-10-01 Mark Mitchell + + * pt.c (tsubst_decl): If the type of a template instantiation is + bogus, so is the whole instantiation. + +1999-09-30 Mark Mitchell + + * decl.c (initialize_local_var): Handle static variables here. + (cp_finish_decl): Tweak handling of function-scope static + variables. + * semantics.c (expand_stmt): Handle DECL_STMTs for static + variables. + + * method.c (emit_thunk): Don't crash when -fsyntax-only. + + * cp-tree.h (lang_decl_flags): Add global_ctor_p and + global_dtor_p. Add init_priority. + (DECL_ACCESS): Adjust accordingly. + (DECL_GLOBAL_CTOR_P, DECL_GLOBAL_DTOR_P): New macros. + (GLOBAL_INIT_PRIORITY): Likewise. + * decl.c (lang_mark_tree): Adjust accordingly. + (start_objects): Set DECL_GLOBAL_CTOR_P, DECL_GLOBAL_DTOR_P, + and GLOBAL_INIT_PRIORITY. + * dump.c (dequeue_and_dump): Print them. + * ir.texi: Document them. + + * decl2.c (struct priority_info_s): Remove initialization_sequence + and destruction_sequence. + (start_static_storage_duration_function): Return the body of the + function. Convert for function-at-a-time mode. + (generate_inits_for_priority): Remove. + (finish_static_storage_duration_function): Change prototype. + Adjust for function-at-a-time mode. + (do_static_initialization): Likewise. + (do_static_destruction): Likewise. + (do_static_initialization_and_destruction): Remove. + (start_static_initialization_or_destruction): New function. + (finish_static_initialization_or_destruction): Likewise. + (get_priority_info): Don't manipulation initialization_sequence or + destruction_sequence. + (prune_vars_needing_no_initialization): New function. + (write_out_vars): Likewise. + (finish_file): Use the various new functions instead of the old. + +Thu Sep 30 00:13:27 1999 Dirk Zoller + + * cp-tree.h (warn_float_equal): Declare. + * decl2.c (warn_float_equal): Define. + (lang_decode_option): Recognize -W[no-]float-equal. + * typeck.c (build_binary_op_nodefault): Conditionally warn + about equality tests of floating point types. + +1999-09-29 Jason Merrill + + Support normal type_info-based EH mechanisms with -fno-rtti. + * except.c (build_eh_type_type): Remove special -fno-rtti handling. + (build_eh_type_type_ref): Likewise. + (build_eh_type): Remove. + (expand_throw): Call build_eh_type_type, not build_eh_type. + * decl2.c (import_export_decl): Don't associate the tinfo fn with + the vtable if -fno-rtti. + * decl.c (init_decl_processing): Always init_rtti_processing. + + * rtti.c (get_typeid): Don't complain about -fno-rtti. + + * class.c (class_cache_obstack, class_obstack): Remove. + (init_class_processing): Don't initialize class_obstack. + (push_cache_obstack): Remove. + (pushclass): Don't call it. + * cp-tree.h: Remove prototype for push_cache_obstack. + * decl.c (decl_obstack, decl_stack, push_decl_level): Remove. + (pushlevel_class): Don't push_decl_level. + (poplevel_class): Don't pop_stack_level. + (push_class_level_binding): Don't push_cache_obstack. + (init_decl_processing): Don't initialize decl_obstack. + * search.c (push_class_decls): Don't push_cache_obstack. + * tree.c (list_hash_add): Put hash node on permanent_obstack. + (hash_tree_cons): Don't mess with obstacks. + (print_lang_statistics): Don't print stats for class_obstack and + decl_obstack. + +1999-09-29 Mark Mitchell + + * dump.c (dequeue_and_dump): Dump DECL_EXTERNAL. + * ir.texi: Document DECL_EXTERNAL. + + * dump.c (dequeue_and_dump): Improve support for dumping THUNK_DECLs. + * ir.texi: Document THUNK_DECLs. + + * cp-tree.h (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): Move here from pt.c. + (TMPL_ARGS_DEPTH, TMPL_ARGS_LEVEL, SET_TMPL_ARGS_LEVEL): Likewise. + (TMPL_ARG, SET_TMPL_ARG, NUM_TMPL_ARGS, TMPL_PARMS_DEPTH): Likewise. + * error.c (dump_template_bindings): Remove unused parameter. + Handle multiple levels of template parameters. + (dump_template_decl): Use `parms', not `args', for template + parameters. Fix thinko. + (dump_function_decl): Use DECL_TEMPLATE_INSTANTIATION. Don't pass + flags to dump_template_bindings. + * pt.c (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): Move to cp-tree.h. + (TMPL_ARGS_DEPTH, TMPL_ARGS_LEVEL, SET_TMPL_ARGS_LEVEL): Likewise. + (TMPL_ARG, SET_TMPL_ARG, NUM_TMPL_ARGS, TMPL_PARMS_DEPTH): Likewise. + (tsubst_copy): Clarify variable name. + (most_general_template): Robustify. + +1999-09-29 Nathan Sidwell + + * error.c (dump_template_parms): Don't use TS_PEDANTIC_NAME + to change primary template rendering. + +1999-09-29 Mark Mitchell + + * cp-tree.h (UPT_TEMPLATE): Remove. + (UPT_PARMS): Likewise. + (DECL_NEEDED_P): New macro. + * decl2.c (finish_vtable_vardecl): Use it. + (finish_objects): Don't crash with -fsyntax-only. + (finish_file): Use DECL_NEEDED_P. Don't prune vtables when + -fsyntax-only. + * pt.c (tsubst_friend_function): Remove FIXME that talks about + obstacks. + (tsubst_expr): Correct handling of function try-blocks. + * semantics.c: Include flags.h. + (expand_body): Don't do RTL generation if -fsyntax-only. + * Makefile.in (semantics.o): Depends on flags.h. + +1999-09-28 Gabriel Dos Reis + + * pt.c (most_general_template): Adjust declaration. + + * cp-tree.h: (most_general_template): Declare. + + * error.c (dump_template_value): Rename to ... + (dump_template_argument): This. + (dump_template_argument_list): New function. + (dump_type): Use it. + (dump_template_parameter): New function. + (dump_template_decl): Use it. + (dump_template_bindings): New function. + (dump_function_decl): Use it. Pretty print function template + instantiations. + +1999-09-28 Nathan Sidwell + + * decl.c (grokdeclarator): Distinguish parameter context for + diagnostics. Tidy up missing type diagnostic. + Diagnose `explicit' in one place. Diagnose `mutable' in one place. + +1999-09-28 Mark Mitchell + + * ir.texi: Improve documentation for TARGET_EXPR. + +1999-09-27 Nathan Sidwell + + Augment stringification of trees. + * cp-tree.h (tree_string_flags): New error stringifying enumeration. + (fndecl_as_string, type_as_string_real, args_as_string, + code_as_string, language_as_string, parm_as_string, + op_as_string, assop_as_string, cv_as_string): Remove. + (type_as_string, decl_as_string, expr_as_string): Adjust prototype. + (context_as_string): Declare new function. + * error.c (cp_printers): Move definition. + (OB_UNPUT): Remove. + (OB_END_TEMPLATE_ID): Adjust. + (interesting_scope_p): Remove. + (dump_scope): New static function. + (dump_qualifiers): Adjust prototype, reimplement. + (dump_template_value): Use tree_string_flags. + (dump_type_real): Move back to dump_type. + (dump_type): Adjust prototype. Use tree_string_flags. + (dump_aggr_type): Likewise. Use dump_template_parms. + (dump_type_prefix): Adjust prototype. Use tree_string_flags. + Return pad flag. + (dump_type_suffix): Adjust prototype. Use tree_string_flags. + (dump_simple_decl): Likewise. + (dump_decl): Likewise. Use dump_template_decl. + (dump_template_decl): New static function broken out of dump_decl. + (dump_function_decl): Adjust prototype. Use tree_string_flags. + (dump_parameters): Likewise. Prefix space. + (dump_exception_spec): Adjust prototype. Use tree_string_flags. + (dump_function_name): Likewise. Use dump_template_parms. + (dump_template_parms): New static function broken out of + dump_function_name. + (dump_expr_list): Adjust prototype. Use tree_string_flags. + (dump_expr): Likewise. + (fndecl_as_string): Removed + (type_as_string_real): Removed + (dump_binary_op): Adjust prototype. Use tree_string_flags. + (dump_unary_op): Likewise. + (type_as_string): Likewise. + (expr_as_string): Likewise. + (decl_as_string): Likewise. + (context_as_string): New function. + (lang_decl_name): Adjust. + (decl_to_string): New static print callback. + (expr_to_string): Likewise. + (fndecl_to_string): Likewise. + (code_as_string): Renamed to ... + (code_to_string): ... here. Adjust. + (language_as_string): Renamed to ... + (language_to_string): ... here. Adjust. + (parm_as_string): Renamed to ... + (parm_to_string): ... here. + (op_as_string): Renamed to ... + (op_to_string): ... here. + (assop_as_string): Renamed to ... + (assop_to_string): ... here. + (type_to_string): New static print callback. + (args_as_string): Renamed to ... + (args_to_string): ... here. Adjust. + (cv_as_string): Renamed to ... + (cv_to_string): ... here. Adjust. + * pt.c (mangle_class_name_for_template): Use tree_string_flags. + (print_template_context): Likewise. + +1999-09-26 Mark Mitchell + + * cp-tree.h (expand_throw): Remove prototype. + * except.c (expand_throw): Make it static. Use tree-generation + functions, rather than RTL-generation functions. + (build_throw): Use it. + * expr.c: Include except.h. + (cplus_expand_expr): Don't call expand_throw here. + * Makefile.in (expr.o): Depend on except.h. + * ir.texi: Update documentation for THROW_EXPR. + + * decl.c (start_function): Set x_dont_save_pending_sizes rather + than calling get_pending_sizes. + * init.c (build_new): Don't save and restore + immediate_size_expand; instead, assert that it has the expected + value already. + +1999-09-26 Kaveh R. Ghazi + + * lex.c (compiler_error): Add missing call to va_end(). + +1999-09-25 Mark Mitchell + + * dump.c (dequeue_and_dump): Handle RESULT_DECL. + * ir.texi: Document RESULT_DECL and DECL_RESULT. + + * cp-tree.h (check_return_expr): New function. + * decl.c (finish_constructor_body): New function. + (pushdecl): Put global friend functions in namespace binding + level, not the class binding level. + (finish_destructor_body): Make sure the dtor_label is always + defined. Fix typo in comment. + (finish_function): Move generation of constructor-termination code + to semantic-analysis time. Move generation of implicit `main' + return value to semantic-analysis time. + * semantics.c (finish_return_stmt): Generate goto's to + ctor_label/dtor_label here. Use check_return_expr to do semantic + analysis on the returned expression. + * typeck.c (maybe_warn_about_returning_address_of_local): New + function split out from c_expand_return. + (check_return_expr): Likewise. + (c_expand_return): Just generate the RTL for the return. + +1999-09-24 Mark Mitchell + + * cp-tree.h (CPTI_CLEANUP_TYPE): New macro. + (cleanup_type): Likewise. + (search_tree): Change prototype. + * decl.c (local_variable_p): Adjust for new interface to + search_tree. + (check_default_argument): Likewise. + * error.c (dump_expr): Handle INIT_EXPR. + * except.c (expand_throw): Don't make cleanup_type a local static. + * expr.c (cplus_expand_expr): Don't handle NEW_EXPR. + * init.c (build_new): Call build_new_1 directly, rather than + building a NEW_EXPR. + (build_new_1): Tidy. Don't build a VEC_INIT_EXPR except when + processing file-scope initializers. + * lex.c (init_parse): Add an opname_tab entry for INIT_EXPR. + * tree.c: Include splay-tree.h + (no_linkage_helper): Adjust for new interface to search_tree. + (search_tree): Pass around pointers to tree nodes, rather than the + nodes themselves. Handle VEC_INIT_EXPR. + (no_linkage_check): Adjust for new interface to search_tree. + (mapcar): Handle VEC_INIT_EXPR. + (target_remap): New variable. + (bot_manip): Use it. + (bot_replace): New function. + (break_out_target_exprs): Use it to remap all variables used in a + default argument expression. + * typeck.c (build_modify_expr): Don't crash when outside a + function and presented with an INIT_EXPR assignment + * Makefile.in (tree.o): Depend on splay-tree.h. + +Fri Sep 24 10:48:10 1999 Bernd Schmidt + + * decl.c (duplicate_decls): Use DECL_BUILT_IN_CLASS rather than + DECL_BUILT_IN. + (builtin_function): New arg CLASS. Arg CODE now of type int. All + callers changed. + Set the builtin's DECL_BUILT_IN_CLASS. + +1999-09-24 Mark Mitchell + + * decl.c (pushdecl): Don't make local declarations of extern + variables give the variable a DECL_CONTEXT for the function. + (make_rtl_for_nonlocal_decl): Don't fuss with obstacks. Simplify. + Don't accidentally make RTL for local declarations. + (emit_local_var): Handle declarations with asm-specifiers here. + +1999-09-23 Mark Mitchell + + * ir.texi: Improve documentation for TARGET_EXPRs. Discuss + STMT_IS_FULL_EXPR_P. + + * cp-tree.h (language_function): Add cannot_inline. + * decl.c (start_function): Restore current_function_cannot_inline + from the saved value. + (save_function_data): Save current_function_cannot_inline. + * decl2.c (start_objects): Change prototype. Build the function + in function-at-a-time mode. + (finish_objects): Likewise. + (generate_ctor_or_dtor_function): Adjust accordingly. + + * cp-tree.h (DECL_ANON_UNION_ELEMS): New macro. + * decl2.c (finish_anon_union): Set DECL_ANON_UNION_ELEMS. + Don't call expand_anon_union_decl here + * semantics.c (exapnd_stmt): Call it here, instead. + * typeck.c (mark_addressable): Addressed variables are implicitly + used. + +1999-09-23 Martin v. Löwis + + * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK): New macro. + (RECORD_OR_UNION_TYPE_CHECK, LANG_IDENTIFIER_CAST): Likewise. + (DEFARG_NODE_CHECK): Remove; replace with DEFAULT_ARG_CHECK. + * cp-tree.h: Add tree checking macros to various tree access + macros. + * ptree.c (print_lang_decl): Test for function or variable + before accessing template info. + +1999-09-23 Jason Merrill + + * lex.c: Get WCHAR_TYPE_SIZE from wchar_type_node. + * lang-specs.h: If -fshort-wchar, override __WCHAR_TYPE__. + * decl2.c (lang_f_options): Add -fshort-wchar. + * cp-tree.h: Declare flag_short_wchar. + * decl.c (init_decl_processing): If -fshort-wchar, use 'short unsigned + int' for wchar_t. + +1999-09-23 Martin v. Löwis + + * ir.texi: Fix formatting errors and typos. + +1999-09-22 Mark Mitchell + + * ir.texi: Document CLEANUP_STMT, SCOPE_STMT, and START_CATCH_STMT. + + * decl.c (pushdecl): Do create a binding for extern "C" functions, + but not for their DECL_ASSEMBLER_NAMEs. + (lookup_name_current_level): Fix formatting. + (xref_tag): Likewise. + * decl2.c (start_objects): Mark static constructors and + destructors as used. + +1999-09-22 Jason Merrill + + * decl.c (define_case_label): Don't crash if we're not in a switch. + + * decl2.c (lang_decode_option): Don't bother explicitly ignoring flags. + * lang-options.h: Restore -fthis-is-variable. Remove help strings + for unsupported flags. + +1999-09-21 Jason Merrill + + * decl2.c (lang_decode_option): Accept and ignore -finit-priority. + Accept and warn about -fthis-is-variable. + +1999-09-21 Mark Mitchell + + * dump.c (dequeue_and_dump): Handle START_CATCH_STMT, + CLEANUP_STMT, and SCOPE_STMT. + + * decl2.c (lang_decode_option): Adjust, in the wake of recent + changes to option processing. + +1999-09-21 Martin v. Löwis + + * typeck.c (get_member_function_from_ptrfunc): Allow extraction of + function pointer from pmfs with no object given. + (convert_for_assignment): Do not return error when converting + pmfs. + +1999-09-21 Alex Samuel + + * lex.c (internal_filename): New variable. + (INTERNAL_FILENAME): New macro. + (init_parse): Allocate internal_filename and mark as root. Use it + instead of a string constant. + +1999-09-21 Nathan Sidwell + + Reimplement dynamic cast and catch matching. + * cp-tree.h (get_dynamic_cast_base_type): Prototype new function + * search.c (dynamic_cast_base_recurse): New function. + (get_dynamic_cast_base_type): New function for dynamic cast. + * rtti.c (build_dynamic_cast_1): Determine source and target + class relationship. Call __dynamic_cast_2. + * tinfo.h (__user_type_info::upcast): New catch dispatcher. + (__user_type_info::dyncast): New dynamic cast dispatcher. + (__user_type_info::sub_kind): New nested enumeration. + (__user_type_info::contained_p): sub_kind predicate. + (__user_type_info::contained_public_p): Likewise. + (__user_type_info::contained_nonpublic_p): Likewise. + (__user_type_info::contained_nonvirtual_p: Likewise. + (__user_type_info::upcast_result): New nested struct. + (__user_type_info::dyncast_result): New nested struct. + (*::do_upcast): New catch function. + (*::do_dyncast): New dynamic cast function. + (__user_type_info::find_public_subobj): New dynamic cast + helper dispatcher. + (*::do_find_public_subobj): New dynamic cast helper function. + * tinfo.cc (__user_type_info::upcast): Define catch dispatcher. + (__user_type_info::dyncast): Define dynamic cast dispatcher. + (*::do_upcast): Define catch function. + (*::do_dyncast): Define dynamic cast function. + (*::do_find_public_subobj): Define dynamic cast helper function. + * tinfo2.cc (__throw_type_match_rtti_2): Use upcast. + (__dynamic_cast): Backwards compatibility wrapper. Use dyncast. + (__dynamic_cast_2): New dynamic cast runtime. + +1999-09-20 Mark Mitchell + + * cp-tree.h (finish_stmt_expr): Change prototype. + * expr.c (cplus_expand_expr): Adjust call accordingly. + * init.c (finish_init_stmts): Likewise. + * parse.y (primary): Likewise. + * pt.c (tsubst_copy): Likewise. + * semantics.c (finish_stmt_expr): Don't take two parameters. + Don't remove generated BLOCKs from the block-tree. + + Remove support for assigning to `this'. + * NEWS: Note that fact. + * class.c (build_vbase_path): Don't check flag_this_is_variable. + * cp-tree.h (EXPR_STMT_ASSIGNS_THIS): Remove. + (language_function): Remove assigns_this, just_assigned_this, and + x_base_init_expr. Add x_vcalls_possible_p. Add vtbls_set_up_p. + (base_init_expr): Remove. + (current_vcalls_possible_p): New macro. + (vtbls_set_up_p): Likewise. + (emit_base_init): Change prototype. + * decl.c (finish_destructor_body): New function, split out from + finish_function. + (current_function_assigns_this): Remove. + (current_function_just_assigned_this): Likewise. + (start_function): Don't set them. + (finish_function): Don't check them. Don't emit + base-initialization code here. Generate code for destructors when + doing semantic analysis. + (finish_stmt): Don't check current_function_just_assigned_this. + * decl2.c (lang_f_options): Remove this-is-variable. + (lang_decode_option): Likewise. + (grokclassfn): Don't check flag_this_is_variable. + * init.c (emit_base_init): Return the expression generated. + (construct_virtual_bases): Don't push/pop obstacks. Fix + typo. + (build_new_1): Don't check flag_this_is_variable. + (get_temp_regvar): Don't set DECL_REGISTER. + (build_vec_init): Don't call use_variable. + * lang-options.h: Remove "-fthis-is-variable" and + "-fno-this-is-variable". + * pt.c (tsubst_expr): Don't check EXPR_STMT_ASSIGNS_THIS. + * search.c (expand_upcast_fixups): Use finish_expr_stmt, not + expand_expr_stmt. + * semantics.c (finish_expr_stmt_real): Rename to ... + (finish_expr_stmt): This. Remove assigned_this parameter. + (begin_if_stmt): Call do_pushlevel before starting the statement. + (begin_compound_stmt): Don't declare __FUNCTION__ in scope-less + blocks. + (setup_vtbl_ptr): Emit initialization code for bases and members + at semantic-analysis time. Emit code to initialize vtables in + destructors here. + (expand_stmt): Use finish_expr_stmt, not finish_expr_stmt_real. + Don't handle CTOR_INITIALIZER any more. + * typeck.c (build_modify_expr): Don't check for assignments to + this. + (c_expand_return): Don't suggest assigning to `this'. + + * Makefile.in (decl.o): Depend on RTL_H. + (decl2.o): Likewise. + (class.o): Likewise. + (call.o): Likewise. + (method.o): Likewise. + (search.o): Likewise. + (tree.o): Likewise. + (pt.o): Likewise. + + * decl.c (duplicate_decls): When a builtin function is redeclared + as static, make sure it is mangled correctly. + + * ir.texi (CTOR_INITIALIZER): Remove mention. Fix typo. Add + detail about the statement-tree. + +1999-09-20 Nathan Sidwell + + * parse.y (primary): Use build_functional_cast for CV_QUALIFIER. + +1999-09-20 Nick Clifton + + * decl2.c (lang_decode_option): Extend comment. + +Mon Sep 20 10:49:05 1999 Bernd Schmidt + + * typeck.c: Include "tm_p.h". + +1999-09-19 Mark Mitchell + + * ir.texi: New file. + +1999-09-19 Paul Burchard + + * semantics.c (expand_stmt): Initialize return value. + +1999-09-18 Paul Burchard + + * gxxint.texi: G++ now implements namespaces. + +1999-09-18 Mark Mitchell + + * decl.c (pop_label): Don't warn about unused labels more than + once. + * semantics.c (finish_goto_stmt): Always marked used labels as + used. + + * decl.c (layout_var_decl): Change prototype. Call layout_decl + even when the declaration is external. + (cp_finish_decl): Adjust call to layout_var_decl. + * pt.c (tsubst_expr): Make sure to initialize stmt before using it. + +1999-09-18 Martin von Löwis + + * typeck.c (get_member_function_from_ptrfunc): Always consider + virtuality inside member pointer. + +1999-09-17 Mark Mitchell + + Turn on function-at-a-time processing. + * cp-tree.h (doing_semantic_analysis_p): New macro. + (SF_DEFAULT): Define to zero, not SF_EXPAND. + (start_handler_parms): Change prototype. + (expand_start_catch_block): Likewise. + (expand_end_catch_block): Likewise. + (expand_start_eh_spec): Likewise. + (expand_end_eh_spec): Declare. + (finish_handler_parms): Change prototype. + (begin_catch_block): Declare. + (finish_handler): Change prototype. + (do_pushlevel): Declare. + (do_poplevel): Likewise. + * decl.c (pushlevel): Don't create + binding levels when not doing semantic analysis. + (poplevel): Don't pop them. + (pushdecl): Assert that we are never called when not doing + semantic analysis. + (pushdecl_top_level): Use push_to_top_level. + (make_label_decl): Don't fiddle with obstacks. Make RTL For the + label when expanding. + (cp_finish_decl): Only inject for-scope variables when doing + semantic analysis. Add comments. + (start_handler_parms): Return the handler parm. + (start_function): Reorganize. Don't clear DECL_INITIAL if it is + already set. Reinitialize from saved function data if available. + Don't pushlevel when not doing semantic analysis. + (store_parm_decls): Only generate RTL when expanding. Only + pushdecl when doing semantic analysis. Set + current_eh_spec_try_block if appropriate. + (finish_function): Simplify. Use do_pushlevel and do_poplevel. + Combine common code. Don't poplevel when not doing semantic + analysis. + (push_cp_function_context): Don't expand functions without an + explicit call to expand_body. + (mark_lang_function): Make eh_spec_try_block and + x_scope_stmt_stack. + * except.c (expand_end_eh_spec): Don't + declare. + (process_start_catch_block): Likewise. + (push_eh_cleanup): Use finish_decl_cleanup. + (initialize_handler_parm): New function. + (expand_start_catch_block): Use it. + (expand_end_catch_block): Use tree-generation functions, not + RTL-generation functions. + (expand_start_eh_spec): Likewise. + (expand_end_eh_spec): Likewise. + (expand_exception_blocks): Simplify. + (start_anon_func): Use do_pushlevel. + (end_anon_func): Use do_poplvel. Call expand_body for the + function. + * expr.c (do_case): Don't call define_case_label. + * init.c (create_temporary_var): Set DECL_CONTEXT for local + variables. + * method.c (emit_thunk): Call expand_body for the + thunk. + (sythesize_method): Likewise. + * parse.y (handler_args): Give it ttype. + (eat_saved_input): Call expand_body. + (base_init): Use do_pushlevel. + (pending_inline): Call expand_body. + (handler): Adjust calls to finish_handler_parms and + finish_handler. + (handler_args): Don't call expand_start_catch_block. Return the + catch parameter. * pt.c (tsubst_expr): Adjust HANDLER handling. + * parse.c: Regenerated. + * rtti.c (synthesize_tinfo_fn): Call finish_function. + * semantics.c (do_pushlevel): Give it external linkage. Build + SCOPE_STMTs. + (do_poplevel): Likewise. + (finish_case_label): Call define_case_label when doing semantic + analysis. + (finish_goto_stmt): Create RTL for labels. + (finish_function_try_block): Set in_function_try_handler + unconditionally. + (finish_function_handler_sequence): Unset it. + (finish_handler_parms): Use expand_start_catch_block even when + building a statement-tree. + (begin_catch_block): New function. + (finish_handler): Move a little RTL-generation logic here. + (finish_decl_cleanup): Allow cleanups for empty declarations. + (finish_named_return_value): Don't pushdecl when not doing + semantic analysis. + (expand_stmt): Don't do semantic analysis for variable + declarations. Handle START_CATCH_STMT. Call expand_label + directly for a LABEL_STMT. Tweak handling of GOTO_STMT. Adjust + HANDLERs. Handle SCOPE_STMT, CTOR_INITIALIZER, and RETURN_INIT. + (expand_body): Let expand_stmt handle CTOR_INITIALIZER, + RETURN_INIT and function try blocks. + + * cp-tree.h (language_function): Add x_eh_spec_try_block. Add + x_scope_stmt_stack. Add x_in_charge_parm. + (current_eh_spec_try_block): New macro. + (current_scope_stmt_stack): Likewise. + (current_in_charge_parm): Likewise. + * decl.c (start_function): Initialize current_in_charge_parm. + (finish_function): Use current_in_charge_parm rather than looking + up __in_chrg. + * search.c (expand_indirect_vtbls_init): Likewise. + + * cp-tree.def (CLEANUP_STMT): Fix spelling in dumps. + (TRY_BLOCK): Likewise. + (HANDLER): Likewise. + (START_CATCH_STMT): New tree node. + (SCOPE_STMT): Likewise. + * cp-tree.h (SCOPE_BEGIN_P): New macro. + (SCOPE_NULLIFIED_P): Likewise. + (struct lang_decl_flags): Add pending_inline_p. Adjust dummy. + (struct lang_decl): Add saved_language_function. + (DECL_PENDING_INLINE_INFO): Adjust documentation. + (DECL_PENDING_INLINE_P): New macro. + (TYPE_TI_ARGS): Fix typo in comment. + (DECL_SAVED_TREE): Add to documentation. + (DECL_SAVED_FUNCTION_DATA): New macro. + (START_CATCH_TYPE): Likewise. + (SCOPE_END_P): New macro. + (declare_parm_level): Don't declare. + * decl.c (mark_lang_function): New function, split out from + mark_cp_function_context. + (save_function_data): New function. + (declare_parm_level): Remove. + (finish_function): Use save_function_data to squirrel away + important stuff for later use. + (mark_cp_function_context): Use mark_function_data. + (lang_mark_tree): Likewise. + * lex.c (begin_definition_of_inclass_inline): Set + DECL_PENDING_INLINE_P. + (store_pending_inline): Clear it. + * pt.c (tsubst_decl): Likewise. + +1999-09-17 Nathan Sidwell + + * call.c (perform_implicit_conversion): Deal with error_mark_node. + +1999-09-17 Mark Mitchell + + * decl.c (warn_extern_redeclared_static): Don't get confused by + static member functions. + (duplicate_decls): Merge DECL_THIS_STATIC. + + * decl.c (expand_static_init): Make sure assignments to local + statics actually occur. + +1999-09-17 Mark Mitchell + + * cp-tree.h (poplevel_class): Declare. + * class.c (popclass): Use poplevel_class, not poplevel. + * decl.c (poplevel_class): Don't make it static. Don't return a + value. + (poplevel): Don't call poplevel_class; abort in a class + binding level is seen. + * semantics.c (finish_translation_unit): Use pop_everything. + * parse.y (member_init): Allow errors. + (pending_inline): Call finish_function. + * parse.c: Regenerated. + * Makefile.in (CONFLICTS): Adjust. + +1999-09-17 Gabriel Dos Reis + + * error.c: Reduce code duplication. + (dump_template_value): New function. + (dump_type_real): Use it. + (dump_decl): Likewise. + (dump_function_name): Likewise. + (dump_function_decl): Don't be too talkative about function return + type variety. + +1999-09-16 Kaveh R. Ghazi + + * lex.c (init_cpp_parse): Call xcalloc, not malloc/bzero. + + * xref.c (SALLOC): Call xstrdup, not xmalloc/strcpy. + +1999-09-16 Jason Merrill + + * decl2.c (finish_file): Also call check_global_declarations for + the pending_statics list. + +1999-09-15 Jason Merrill + + * lex.c (cp_pragma_implementation): Allow #pragma implementation + in header files. + +1999-09-15 Richard Henderson + + * lex.c (mark_impl_file_chain): Follow the next chain. + +1999-09-15 Mark Mitchell + + * decl.c (warn_extern_redeclared_static): Simplify. Catch + problems with extern "C" functions redeclared as static. + (duplicate_decls): When a builtin is redeclared static, make the + new function have internal linkage. + +1999-09-15 Mark Mitchell + + * decl2.c (build_expr_from_tree): Handle VA_ARG_EXPR. + * pt.c (tsubst_copy): Likewise. + * tree.c (search_tree): Likewise. + (mapcar): Likewise. + +1999-09-15 Kaveh R. Ghazi + + * typeck2.c (ack): Don't declare progname. + +1999-09-14 Alexandre Oliva + + * lex.c (cp_pragma_interface, cp_pragma_implementation): Copy + filenames with ggc_alloc_string. + +1999-09-14 Mark Mitchell + + * decl.c (build_target_expr): Set TREE_SIDE_EFFECTS on the + TARGET_EXPR. + * call.c (build_over_call): Don't set TREE_SIDE_EFFECTS on + the TARGET_EXPR. + * cvt.c (build_up_reference): Likewise. + * tree.c (build_cplus_new): Likewise. + (get_target_expr): Likewise. + +Tue Sep 14 01:45:10 1999 Marc Espie + + * Makefile.in: Prepend $(SHELL) to move-if-change calls. + +1999-09-13 Mark Mitchell + + * cp-tree.h (build_target_expr): New function. + * call.c (build_conditional_expr): Use build_target_expr. + (convert_like): Likewise. + (build_over_call): Likewise. + * cvt.c (build_up_reference): Likewise. + * decl.c (build_cleanup_on_safe_obstack): Fold into ... + (destroy_local_var): Here. + (build_target_expr): New function. + * tree.c (build_cplus_new): Use it. + (get_target_expr): Likewise. + +1999-09-13 Nathan Sidwell + + * typeck.c (expr_sizeof): Don't decay arrays and functions. + Remove misleading comment. + (build_compound_expr): Don't decay arrays. + +1999-09-13 Jason Merrill + + * call.c (build_conditional_expr): Always use a TARGET_EXPR for + class rvalues again. + +Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi + + * Make-lang.in (g++spec.o): Depend on system.h and gcc.h. + + * g++spec.c: Include gcc.h. + (lang_specific_driver): Constify a char*. Call xcalloc, not + xmalloc/bzero. All calls to the function pointer parameter now + explicitly call `fatal'. + +1999-09-12 Mark Mitchell + + * call.c (implicit_conversion): Robustify. Handle OFFSET_REFs. + * cvt.c (ocp_convert): Complete the from and destination types. + Adjust warning about functions always being `true' in conditionals. + * decl.c (duplicate_decls): Don't play funny games with abort. + * error.c (dump_expr): Handle OVERLOADs. + * spew.c (probe_obstack): Remove. + * typeck.c (condition_conversion): Use perform_implicit_conversion. + +1999-09-12 Bernd Schmidt + + * cp-tree.h (auto_function, define_function): Adjust prototypes. + * decl.c (define_function): Lose FUNCTION_CODE arg. All callers + changed. + (auto_function): Likewise, for CODE arg. + Move code to set DECL_BUILT_IN and DECL_FUNCTION_CODE to... + (builtin_function): ... here. + +1999-09-11 Mark Mitchell + + * decl.c (add_decl_to_level): Remove TREE_PERMANENT assertion. + (init_decl_processing): Don't set TREE_PERMANENT for the + error_mark_node. + (start_decl): Don't rebuild non-permanent ARRAY_TYPEs. + (grokdeclarator): Likewise. + (grokparms): Don't check TREE_PERMANENT when building up lists. + * decl2.c (grokfield): Don't assert TREE_PERMANENT. + (mark_inline_for_output): Likewise. + * expr.c (cplus_expand_expr): Don't check TREE_PERMANENT. + * init.c (build_offset_ref): Don't check TREE_PERMANENT. + * lex.c (check_newline): Don't check ggc_p; it is always one. + * pt.c (process_template_parm): Don't check TREE_PERMANENT. + * spew.c (yylex): Don't copy_node or probe_obstacks for + non-permanent CONSTANTs and STRINGs. + * tree.c (build_cplus_array_type_1): Don't fuss with + TREE_PERMANENT on ARRAY_TYPEs. + + * cp-tree.def (CLEANUP_STMT): New node. + * cp-tree.h (language_function): Add name_declared. + (current_function_name_declared): New macro. + (CLEANUP_DECL): New macro. + (CLEANUP_EXPR): Likewise. + (emit_local_var): Likewise. + (finish_decl_cleanup): New function. + * cvt.c (build_up_reference): Simplify. + (ocp_convert): Remove dead code. + * decl.c (start_decl): Remove call to add_decl_stmt. + (grok_reference_init): Adjust, to handle bindings temporaries to + references. Remove dead code. + (initialize_local_var): Don't generate RTL for + declarations here, or build cleanups here. Don't fuss with + obstacks. Replace expand_start_target_temps calls with explicit + setting of stms_are_full_exprs_p. + (destroy_local_var): New function. + (emit_local_var): Likewise. + (cp_finish_decl): Use them, as appropriate. + (start_function): Announce template functions. + (store_parm_decls): Don't call declare_function_name here. + (finish_stmt): Don't start emit base-initialization code when just + building the statement-tree. + * init.c (create_temporary_var): Move add_decl_stmt call ... + (get_temp_regvar): Here. + * pt.c (tsubst_expr): Make DECL_INITIAL look like what + cp_finish_decl would expect. Don't call add_decl_stmt. + * semantics.c (begin_compound_stmt): Call declare_function_name, + if appropriate. + (finish_decl_cleanup): New function. + (expand_stmt): Use emit_local_var to output variables. + (expand_body): Set current_function_name_declared. + +1999-09-10 Mark Mitchell + + * cp-tree.h (finish_cleanup_try_block): New function. + * semantics.c (finish_cleanup_try_block): Add comment. + +Fri Sep 10 10:32:32 1999 Bernd Schmidt + + * cp-tree.h: Delete declarations for all tree nodes now moved to + global_trees. + * decl.c: Delete their definitions. + (SHORT_TYPE_SIZE, INT_TYPE_SIZE, LONG_TYPE_SIZE, LONG_LONG_TYPE_SIZE, + FLOAT_TYPE_SIZE, DOUBLE_TYPE_SIZE, LONG_DOUBLE_TYPE_SIZE): Don't + provide defaults. + (init_decl_processing): Call build_common_tree_nodes and + build_common_tree_nodes_2 instead of building their nodes here. + Don't add gc roots for them. + +1999-09-10 Mark Mitchell + + * cp-tree.h (language_function): Rename expanding_p to + x_expanding_p. Rename named_label_uses to x_named_label_uses. + (expanding_p): Adjust accordingly. + (TREE_VIA_PRIVATE): Fix typo in comment. + (DECL_REFERENCE_SLOT): Remove. + (SET_DECL_REFERENCE_SLOT): Likewise. + * decl.c (named_label_uses): Adjust. Remove chicken comment. + (push_overloaded_decl): Don't truncate the chain of bindings when + adding an overloaded function. + (grok_reference_init): Don't use DECL_REFERENCE_SLOT. + (initialize_local_var): Fix typo in comment. + (store_parm_decls): Don't set DECL_REFERENCE_SLOT. Tidy up. + * decl2.c (start_objects): Make the fact that we are expanding + the generated function right away explicit. + (start_static_storage_duration_function): Likewise. + (finish_file): Fix typo in comment. + * init.c (build_vec_init): Correct bugs in handling cleanups. + * semantics.c (maybe_convert_cond): New function. + (FINISH_COND): Always store the condition, even if there's + a declaration. + (finish_if_stmt_cond): Use maybe_convert_cond. + (finish_while_stmt_cond): Likewise. + (finish_do_stmt): Likewise. + (finish_for_cond): Likewise. + (expand_cond): Adjust. + + * cp-tree.h (FN_TRY_BLOCK_P): New macro. + * init.c (perform_member_init): Remove obstack machinations. + (expand_cleanup_for_base): Likewise. + (finish_init_stmts): Mark the statement-expression as used. + * method.c (emit_thunk): Use tree-generating functions, not + RTL. + (do_build_copy_constructor): Likewise. + (do_build_assign_ref): Likewise. + (synthesize_method): Likewise. Keep track of line numbers. + * pt.c (tsubst_expr): Handle various kinds of try blocks. + * semantics.c (expand_stmts): Remove. + (begin_function_try_block): Set FN_TRY_BLOCK_P. + (finish_function_try_block): Be careful rechaining + function try blocks. + (expand_stmt): Loop through all the statements at a given level. + (exapnd_body): Be careful with line-numbers here too. Prepare for + being called directly from the parser. + + * cp-tree.h (finish_function): Adjust prototype. + * decl.c (finish_function): Return the function compiled. + * pt.c (instantiate_decl): Don't play games with obstacks. + * tree.c (mapcar): Handle OFFSET_REF and BIT_FIELD_REF. + (search_tree): Likewise. + * typeck.c: Fix typo in comment. + * typeck2.c (store_init_value): Add comment. + + * cp-tree.h (CPTI_ATEXIT): New macro. + (atexit_node): Likewise. + * decl.c (destroy_local_static): New function, broken out from ... + (expand_static_init): Here. + + * rtti.c (get_tinfo_var): These should always be global + (expand_si_desc): Use tree, not RTL, functions to generate code. + (expand_class_desc): Likewise. + (expand_ptr_desc): Likewise. + (expand_attr_desc): Likewise. + (expand_generic_desc): Likewise. + (synthesize_tinfo_fn): Likewise. + +1999-09-09 Mark Mitchell + + * semantics.c (RECHAIN_STMTS): Remove `last' parameter. + (RECHAIN_STMTS_FROM_LAST): Remove. Replace all uses with + RECHAIN_STMTS. + (RECHAIN_STMST_FROM_CHAIN): Likewise. + + * parse.y (simple_stmt): Fix typo in last change. + + * cp-tree.h (EXPR_STMT_ASSIGNS_THIS): New macro. + (STMT_IS_FULL_EXPR_P): Likewise. + (STMT_LINENO_FOR_FN_P): Likewise. + (prep_stmt): New function. + (building_stmt_tree): Tweak for safety. + * pt.c (tsubst_expr): Use prep_stmt throughout. + (add_tree): Move it to semantics.c + * semantics.c (add_tree): Move it here. + (finish_expr_stmt_real): New function. + (finish_expr_stmt): Use it. + (finish_if_stmt_cond): Use FINISH_COND. + (finish_while_stmt_cond): Likewise. + (finish_for_cond): Likewise. + (finish_stmt_tree): Tweak line-number handling. + (prep_stmt): New function. + (expand_stmt): Use it. + + * cp-tree.h (begin_switch_stmt): Adjust prototype. + (finish_switch_cond): Likewise. + * parse.y (simple_stmt): Adjust accordingly. + * parse.c: Regenerated. + * pt.c (tsubst_expr): Adjust accordingly. + * semantics.c (expand_cond): New function. + (FINISH_COND): New macro. + (begin_switch_stmt): Build the SWITCH_STMT here. + (finish_switch_stmt_cond): Not here. + (expand_stmt): Adjust calls to begin_switch_stmt and + finish_switch_cond. Use expand_cond throughout. + + * dump.c (dequeue_and_dump): Dump types for constants. + Describe DECL_ARG_TYPE more intuitively. + Handle ARRAY_REF. + + * decl.c (lang_mark_tree): Mark TYPE_LANG_SPECIFIC. + (lang_cleanup_tree): Remove. + * lex.c (make_lang_type): Use ggc_alloc to allocate + TYPE_LANG_SPECIFIC. + + Reorganize per-function data. + * cp-tree.h (saved_scope): Add function_decl, bindings. + (language_function): Rename binding_level to bindings. + (cp_function_chain): Use the current_function, not the + outer_function_chain. + (current_class_ptr): Make it work, even when there's no + current function. + (current_class_ref): Likewise. + (SF_DEFAULT, SF_PRE_PARSED, SF_INCLASS_INLINE, SF_EXPAND): New + macros. + (clear_temp_name): Remove. + * decl.c (check_function_type): New function, broken out from + start_function. + (current_binding_level): Adjust definition. + (pushlevel): Simplify. + (poplevel): Don't use named_label_uses when we're outside + a function scope. + (mark_saved_scope): Mark function_decl and bindings. + (maybe_push_to_top_level): Don't unconditionally push a new + function context. Save bindings and the current_function_decl. + Don't clear named_labels. + (pop_from_top_level): Pop function context if appropriate. + (init_decl_processing): Set init_lang_status and free_lang_status, + rather than save_lang_status and restore_lang_status. + (start_function): Take SF_* flags. Don't clear per-function data. + Reorder and simplify to use new per-function data code. Add + asserts. + (store_parm_decls): Don't call init_function_start here. + (finish_function): Adjust for new handling of per-function data. + (push_cp_function_context): Simplify. + (mark_cp_function_context): Change binding_level to bindings. + * decl2.c (clear_temp_name): Remove. + (start_objects): Use SF flags to start_function. + (start_static_storage_duration_function): Likewise. + * except.c (start_anon_func): Remove redundant calls to + push_function_context_to. Use SF flags to start function. + (end_anon_func): Remove redundant call to pop_function_context + from. + * lex.c (reinit_parse_for_function): Don't initialize per-function + data. + * method.c (emit_thunk): Clear current_function after calling + assemble_end_function. Use SF flags for start_function. + (synthesize_method): Use SF flags for start_function. + * parse.c: Regenerated. + * parse.y (fn.defpen): Likewise. + (pending_inline): Clear current_function, even if something goes + wrong. + * pt.c (instantiate_decl): Use SF flags to start_function. + Don't save and restore expanding_p. + (add_tree): Handle the case where we are outside any function. + (end_tree): Likewise. + * rtti.c (sythesize_tinfo_fn): Use SF flags to start_function. + * semantics.c (begin_function_definition): Likewise. + (expand_body): Likewise. + +1999-09-09 Nathan Sidwell + + * cp-tree.h (convert_to_void): Prototype new function. + (require_complete_type_in_void): Remove prototype. + * cvt.c (convert_to_void): New function. + (ocp_convert): Use convert_to_void. + * decl.c (cplus_expand_expr_stmt): Likewise, for complete + expressions. + * typeck.c (require_complete_type_in_void): Remove function. + (build_compound_expr): Use convert_to_void. + (build_static_cast): Likewise. + (build_c_cast): Likewise. + * semantics.c (finish_expr_stmt): Do not decay full expressions. + + * typeck.c (build_x_compound_expr): Add FIXME. + +1999-09-08 Mark Mitchell + + * cp-tree.h (scratch_tree_cons): Remove. + * call.c: Replace all uses of expr_tree_cons, saveable_tree_cons, + and perm_tree_cons with plain tree_cons. + * class.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * except.c: Likewise. + * expr.c: Likewise. + * init.c: Likewise. + * lex.c: Likewise. + * method.c: Likewise. + * parse.y: Likewise. + * pt.c: Likewise. + * repo.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * typeck.c: Likewise. + * parse.c: Regenerated. + * tree.c (build_srcloc): Simplify. + +1999-09-08 Bruce Korb autogen@linuxbox.com + + * Makefile.in: Give the gperf user a hint about why "gperf -F" fails. + +1999-09-08 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Remove permanent_attr. + Remove next. + (LANG_DECL_PERMANENT): Remove. + * decl.c (duplicate_decls): Don't mess about with obstacks trying + to free memory. + (lang_mark_tree): Mark DECL_LANG_SPECIFIC. + * lex.c (free_lang_decl_chain): Remove. + (build_lang_decl): Don't use obstacks. + (retrofit_lang_decl): Likewise. + (copy_lang_decl): Likewise. + + * cp-tree.h (saved_scope): Remove old_binding_level and + function_decl. Tidy up. + * decl.c (mark_saved_scope): Don't set them. + (maybe_push_to_top_level): Clear memory. + + * decl.c (layout_var_decl): Change prototype. Don't complete + types for external objects. + (check_initializer): Likewise. Tidy. + (initialize_local_var): Complete types here. + (cp_finish_decl): Not here. Reorganize a little. + (grokvardecl): Don't complete types here. + + * decl.c (start_function): Clear last_dtor_insn and + last_parm_cleanup_insn. + (push_cp_function_context): Just copy over a little of + the old context, not all of it. + + * cp-tree.h (copy_to_permanent): Remove. + (permanent_p): Likewise. + * decl.c (building_typename_type): Don't use copy_to_permanent. + (start_decl): Likewise. + (grok_reference_init): Likewise. + (cp_finish_decl): Likewise. + * init.c (build_new_1): Don't use mapcar. + (build_vec_delete_1): Don't use copy_to_permanent. + (build_vec_init): Likewise. + * parse.y (primary): Likewise. + * parse.c: Regenerated. + * pt.c (push_template_decl_real): Don't use copy_to_permanent. + (lookup_template_class): Likewise. + (tsubst_friend_function): Likewise. + (instantiate_class_template): Likewise. + (tsubst_decl): Likewise. + (tsubst): Likewise. + (instantiate_template): Likewise. + (unify): Likewise. + * rtti.c (get_tinfo_fn): Likewise. + (build_dynamic_cast): Likewise. + * semantics.c (finish_if_stmt_cond): Likewise. + (finish_while_stmt_cond): Likewise. + (finish_do_stmt): Likewise. + (finish_for_cond): Likewise. + (finish_for_expr): Likewise. + (finish_cleanup): Likewise. + (add_decl_stmt): Likewise. + (finish_named_return_value): Likewise. + (finish_qualified_call_expr): Likewise. + * tree.c (perm_manip): Remove. + (build_exception_variant): Don't use copy_to_permanent. + (permanent_p): Remove. + (copy_to_permament): Remove. + (build_min_nt): Don't use copy_to_permanent. + (build_min): Likewise. + (min_tree_cons): Likewise. + * typeckc.c (build_static_cast): Likewise. + (build_reinterpret_cast): Likewise. + (build_const_cast): Likewise. + +1999-09-07 Mark Mitchell + + * decl.c (ggc_p): Set it to 1. + (mark_saved_scope): Add prototype. + +1999-09-07 Richard Henderson + + * cp-tree.h (C_PROMOTING_INTEGER_TYPE_P): Delete. + * typeck.c (self_promoting_args_p): Delete. + +1999-09-07 Jason Merrill + + * search.c (binfo_for_vtable): Use CLASSTYPE_VFIELD_PARENT. + (dfs_bfv_queue_p, dfs_bfv_helper, struct bfv_info): Remove. + +1999-09-07 Mark Mitchell + + * Makefile.in (tree.o): Depend on ggc.h. + * class.c (make_method_vec): Remove. + (free_method_vec): Likewise. + (free_method_vecs): Remove. + (add_method): Don't use them. + * cp-tree.def (PTRMEM_CST): Make it longer. + (TEMPLATE_PARM_INDEX): Make it shorter. + * cp-tree.h (BINDING_HAS_LEVEL_P): New macro. + (template_parm_index): Remove RTL field. + (ptrmem_cst): Add RTL field. + (finish_function): Removed parameter. + (process_next_inline): Change prototype. + (init_cplus_unsave): Rename to init_tree. + (binding_init): Remove. + * decl.c (free_binding_nodes): Remove. + (push_binding): Don't use them. Set BINDING_HAS_LEVEL_P. + (pop_binding): Don't use free_binding_nodes. + (free_binding_vecs): Remove. + (store_bindings): Don't use them. + (pop_from_top_level): Likewise. + (lookup_namespace_name): Simplify. + (build_typename_type): Don't use obstack_free. + (unqualified_namespace_lookup): Simplify. + (lookup_name_real): Simplify. + (start_function): Remove comment about leaks. + (finish_function): Removed nested parameter. Call + expand_end_bindings even when building_stmt_tree. + Call ggc_push_context and ggc_pop_context around + rest_of_compilation, if necessary. + (mark_cp_function_context): Handle a NULL language-context. + (lang_mark_false_label_stack): Fix typo. + (lang_mark_tree): Handle CPLUS_BINDING, OVERLOAD, + TEMPLATE_PARM_INDEX. Handle the funny TYPE_LANG_SPECIFIC on + pointer to method types. + (lang_cleanup_tree): Use free to free TYPE_LANG_SPECIFIC. + * decl2.c (finish_objects): Adjust call to finish_function. + (finish_static_store_duration_function): Likewise. + (do_nonmember_using_decl): Remove call to binding_init. + * except.c (end_anon_func): Adjust call to finish_function. + * lex.c (mark_impl_file_chain): New function. + (init_parse): Call init_tree, not init_cplus_unsave. + Add GC roots. + (cp_pramga_interface): Use xmalloc, not permalloc. + (cp_pragma_implementation): Likewise. + (begin_definition_of_inclass_inline): Simplify. + (process_next_inline): Adjust prototype. + (do_scoped_id): Don't call binding_init. + (make_lang_type): Allocate TYPE_LANG_SPECIFIC with xmalloc. + * method.c (emit_thunk): Adjust call to finish_function. + (synthesize_method): Likewise. + * parse.y (%union): Add a new `pi' variant. + (PRE_PARSED_FUNCTION_DECL): Use it. + (fn.defpen): Likewise. + (fndef): Adjust call to finish_function. + * pt.c (instantiate_decl): Likewise. + * rtti.c (syntheisze_tinfo_fn): Likewise. + * semantics.c (expand_body): Likewise. + * tree.c: Include ggc.h. + (mark_list_hash): New function. + (binding_init): Remove. + (init_cplus_unsave): Rename to ... + (init_tree): This. Add GC roots. + +1999-09-05 Mark Mitchell + + Get ready for garbage collection. + * Makefile.in (CXX_TREE_H): Add varray.h + (lex.o): Depend on ggc.h. + (decl.o): Likewise. + (decl2.o): Likewise. + (method.o): Likewise. + (search.o): Likewise. + (pt.o): Likewise. + (repo.o): Likewise. + * class.c: Include ggc.h. + (current_class_name): Remove. + (current_class_type): Likewise. + (current_access_specifier): Likewise. + (previous_class_type): Likewise. + (previous_class_values): Likewise. + (class_cache_firstobj): Likewise. + (current_lang_base): Likewise. + (current_lang_stack): Likewise. + (current_lang_stacksize): Likewise. + (lang_name_c): Likewise. + (lang_name_cplusplus): Likewise. + (lang_name_java): Likewise. + (current_lang_name): Likewise. + (base_layout_decl): Likewise. + (access_default_node): Likewise. + (access_public_node): Likewise. + (access_protected_node): Likewise. + (access_private_node): Likewise. + (access_default_virtual_node): Likewise. + (access_public_virtual_node): Likewise. + (access_protected_virtual_node): Likewise. + (access_private_virtual_node): Likewise. + (signed_zero_node): Likewise. + (init_class_processing): Don't build base_layout_decl. + (push_lang_context): Adjust now that current_lang_base is a varray. + (pop_lang_context): Likewise. + * cp-tree.h: Include varray.h. + (cp_global_trees): Add access_default, access_public, + access_protected, access_private, access_default_virtual, + access_public_virtual, access_protected_virtual, + access_private_virtual, ctor_identifier, delta2_identifier, + delta_identifier, dtor_identifier, in_charge_identifier, + index_identifier, nelts_identifier, this_identifier, + pfn_identifier, pfn_or_delta2_identifier, vptr_identifier, + lang_name_c, lang_name_cplusplus, lang_name_java, + empty_except_spec, null, jclass, minus_one, terminate. + (saved_scope): Move here from decl.c. Define globals in terms of + saved_scope: current_namespace, current_class_name, + current_class_type, current_access_specifier, current_lang_stack, + current_lang_base, current_lang_name, current_function_parms, + current_template_parms, processing_template_decl, + processing_specialization, processing_explicit_instantiation, + previous_class_type, previous_class_values, class_cache_firstobj. + (scope_chain): New variable. + (init_pt): New function. + * decl.c (current_namespace): Remove. + (this_identifier, in_charge_identifier, ctor_identifier): Likewise. + (dtor_identifier, pfn_identifier, index_identifier): Likewise. + (delta_identifier, delta2_identifier): Likewise. + (pfn_or_delta2_identifier, tag_identifier): Likewise + (vt_off_identifier, empty_except_spec, null_node): Likewise. + (current_function_parms, current_lang_base): Remove. + (current_lang_stack, previous_class_values): Remove. + (class_binding_level): Macroize. + (saved_scope): Remove. + (current_saved_scope): Rename to scope_chain. + (mark_saved_scope): Adjust for new scope structure. + (maybe_push_to_top_level): Likewise. + (pop_from_top_level): Likewise. + (duplicate_decls): Adjust now that current_lang_base is a varray. + (build_typename_type): Call ggc_add_tree_hash_table_root. + (init_decl_processing): Call init_pt. Call push_to_top_level to + set up globals. Add GC roots. + (xref_basetypes): Adjust now that current_lang_base is a varray. + * decl.h (this_identifier): Remove. + (in_charge_identifier): Likewise. + * decl2.c: Don't include varray.h. + (current_namespace): Remove. + (init_decl2): Add GC roots. + * except.c (Terminate): Remove. + (init_exception_processing): Use terminate_node instead. + (build_terminate_handler): Likewise. + * init.c (nc_nelts_field_id): Remove. + (minus_one): Likewise. + (init_init_processing): Use minus_one_node and nelts_identifier + instead. Add GC roots. + (jclass_node): Remove. + (build_new_1): Use nelts_identifier. + (build_vec_init): Likewise. + (build_vec_delete): Likewise. + * lex.c: Include ggc.h. + (defarg_fn): Move declaration early. + (defarg_parms): Likewise. + (init_parse): Add GC roots. + (handle_cp_pragma): Remove redundant declaration of + pending_vtables. + * method.c: Include ggc.h. + (btypelist): Make it a varray. All uses changed. + (ktypelist): Likewise. + (init_method): Add GC roots. + * pt.c: Don't include varray.h. Include ggc.h. + (current_template_parms): Remove. + (processing_template_decl): Likewise. + (processing_specialization): Likewise. + (processing_explicit_instantiation): Likewise. + (init_pt): New function. + * repo.c: Include ggc.h. + (init_repo): Add GC roots. + * search.c: Don't include varray.h. + (_vptr_name): Remove. + (lookup_field_1): Use vtpr_identifier instead. + (expand_indirect_vtbls_init): Remove redundant declaration of + in_charge_identifier. + (init_search_processing): Use vptr_identifier. + +1999-09-05 Richard Henderson + Bernd Schmidt + Mark Mitchell + + * Makefile.in (parse.o): Depend on ggc.h. + (decl2.o): Depend on ggc.h. + (init.o): Depend on ggc.h. + * cp-tree.h (init_decl2): Declare. + (cp_parse_init): Likewise. + * decl.c (ggc_p): Define to zero. + (mark_saved_scope): New function. + (init_decl_processing): Call cp_parse_init, and cp_decl2. + Register GC roots. + (expand_static_init): Add GC roots. + * decl2.c: Include ggc.h. + (init_decl2): New function. + * init.c: Include ggc.h. + (init_init_processing): Add GC roots. + * parse.y: Include ggc.h. + (cp_parse_init): New function. + +1999-09-04 Mark Mitchell + + * decl.c (init_decl_processing): Set mark_lang_status. + (lang_mark_false_label_stack): Adjust prototype. + * decl2.c (grok_function_init): Remove extraneous declaration of + abort_fndecl. + + * Make-lang.in (cc1plus): Remove dependency on GGC. + * Makefile.in (OBJS): Don't mention ggc-simple.o. + (OBJDEPS): Don't mention ggc-simple.o. + + * Make-lang.in (cc1plus): Depend on $(GGC). + * Makefile.in (OBJS): Add ggc-simple.o. + (OBJDEPS): Likewise. + * cp-tree.h (language_function): Rename members to `x_' versions; + we now have x_named_labels, x_ctor_label, x_dtor_label, + x_base_init_list, x_member_init_list, x_base_init_expr, + x_current_class_ptr, x_current_class_ref, x_last_tree, + x_last_expr_type, x_last_dtor_insn, x_last_parm_cleanup_insn, and + x_result_rtx. + (dtor_label, ctor_label, current_base_init_list, + current_member_init_list, base_init_expr, current_class_ptr, + current_class_ref, last_tree, last_expr_type): Adjust accordingly. + * decl.c: Include ggc.h. + (last_dtor_insn): Adjust to use x_ names. + (last_parm_cleanup_insn): Likewise. + (original_result_rtx): Likewise. + (named_labels): Likewise. + (mark_binding_level): New function. + (mark_cp_function_context): Likewise. + (mark_false_label_stack): Likewise. + (lang_mark_tree): Likewise. + (lang_cleanup_tree): Likewise. + +1999-09-03 Mark Mitchell + + * Makefile.in (CXX_TREE_H): Include function.h. + (decl.o): Don't depend on function.h. + (decl2.o): Likewise. + (typeck.o): Likewise. + (init.o): Likewise. + (method.o): Likewise. + * cp-tree.h: Include function.h. + (cp_function): Rename to language_function. Remove next. + (cp_function_chain): Make it a macro, not a variable. + (push_cp_function_context): Don't declare. + (pop_cp_function_context): Likewise. + * decl.c: Don't include function.h. + (push_cp_function_context): Make it static. Make it suitable for + a save_lang_status callback. + (pop_cp_function_context): Likewise. + (maybe_push_to_top_level): Call push_function_context_to, not + push_cp_function_context. + (pop_from_top_level): Call pop_function_context_from, not + pop_cp_function_context. + (init_decl_processing): Set save_lang_status and + restore_lang_status. Call push_function_context_to, not + push_cp_function_context. + (cp_function_chain): Remove. + * decl2.c: Don't include function.h. + * except.c: Don't include function.h. + (start_anon_func): Call push_function_context_to, not + push_cp_function_context. + (end_anon_func): Call pop_function_context_from, not + pop_cp_function_context. + * init.c: Don't include function.h. + * lex.c (begin_definition_of_inclass_inline): Call + push_function_context_to, not push_cp_function_context. + (process_next_inline): Call pop_function_context_from, not + pop_cp_function_context. + * method.c: Don't include function.h. + (synthesize_method): Call push_function_context_to, not + push_cp_function_context. Call pop_function_context_from, not + pop_cp_function_context. + * typeck.c: Don't include function.h. + + * decl.c (expand_static_init): Tweak handling of static + initializations for objects without constructors. + +1999-09-03 Nathan Sidwell + + * typeck.c (build_indirect_ref): Reject dereference of pointer to + void. + +1999-09-02 Mark Mitchell + + * cp-tree.h (cp_function): Move here, from decl.c. + (cp_function_chain): Declare. + (dtor_label): New macro, instead of variable. + (ctor_label): Likewise. + (current_base_init_list): Likewise. + (current_member_init_list): Likewise. + (base_init_expr): Likewise. + (current_class_ptr): Likewise. + (current_class_ref): Likewise. + (last_tree): Likewise. + (last_expr_type): Likewise. + (current_function_returns_value): Likewise. + (current_function_returns_null): Likewise. + (current_function_just_assigned_this): Likewise. + (current_function_parms_stored): Likewise. + (temp_name_counter): Likewise. + (static_labelno): Likewise. + (expanding_p): Likewise. + (stmts_are_full_exprs_p): Likewise. + (in_function_try_handler): Likewise. + (lang_type): Remove nested type_flags. All uses changed. + * call.c (ctor_label): Remove. + (dtor_label): Likewise. + * class.c (current_class_ptr): Remove. + (current_class_ref): Likewise. + * decl.c (static_labelno): Remove. + (dtor_label): Likewise. + (last_dtor_insn): New macro, instead of variable. + (last_parm_cleanup_insn): Likewise. + (original_result_rtx): Likewise. + (in_function_try_handler): Remove. + (named_label_uses): New macro, instead of variable. + (named_labels): Likewise. + (current_function_returns_value): Remove. + (current_function_returns_null): Likewise. + (current_function_assigns_this): New macro, instead of variable. + (current_function_just_assigned_this): Likewise. + (current_binding_level): Likewise. + (init_decl_processing): Call push_cp_function_context. + (cp_function): Move to cp-tree.h + (cp_function_chain): Make it global. + (temp_name_counter): Remove. + (push_cp_function_context): Simplify. + (pop_cp_function_context): Likewise. + * decl2.c (temp_name_counter): Remove. + * init_c (current_base_init_list): Likewise. + (current_member_init_list): Likewise. + (base_init_expr): Likewise. + * method.c (static_labelno): Likewise. + * pt.c (last_tree): Likewise. + * semantics.c (expanding_p): Likewise. + (stmts_are_full_exprs_p): Likewise. + (last_expr_type): Likewise. + * typeck.c (dtor_label): Likewise. + (ctor_label): Likewise. + +1999-09-01 Alex Samuel + + * decl2.c (arg_assoc_template_arg): New prototype. New function. + (arg_assoc_class): Use arg_assoc_template_arg for template + arguments. + (arg_assoc): Likewise. + * pt.c (mangle_class_name_for_template): Allow member template + template arguments. + +1999-09-02 Nathan Sidwell + + * call.c (build_conditional_expr): Warn on enum mismatches. + (convert_arg_to_ellipsis): Move non-pod check to after + conversion. + +1999-09-01 Kaveh R. Ghazi + + * gxx.gperf (hash, is_reserved_word): Add prototypes. + + * init.c (build_vec_init): Initialize variable `try_block'. + + * lex.c (init_parse): Call memcpy, not bcopy, to avoid casts. + Likewise for bzero/memset. + (token_getch, token_put_back): Add static prototypes. Remove + `inline' from the definitions. + (retrofit_lang_decl): Call memset, not bzero, to avoid casts. + +1999-09-01 Mark Mitchell + + * cp-tree.h (lang_type): Move align into type_flags. + (CLASSTYPE_ALIGN): Adjust accordingly. + * call.c (direct_reference_binding): Remove misleading comment. + +1999-08-30 Kaveh R. Ghazi + + * parse.y (language_string): Constify. + +1999-08-30 Kaveh R. Ghazi + + * repo.c (getpwd): Don't prototype. + * xref.c (getpwd): Likewise + +1999-08-30 Kaveh R. Ghazi + + * Makefile.in (LIBS, LIBDEPS): Link with & depend on libiberty.a. + Remove hacks for stuff which now comes from libiberty. + +1999-08-30 Jason Merrill + + * cp-tree.h (IS_AGGR_TYPE_2): Fix typo. + +1999-08-30 Mark Mitchell + + * cp-tree.h (begin_init_stmts): Declare. + (finish_init_stmts): Likewise. + * cvt.c (build_up_reference): Wrap the declaration of a temporary + in a statement-expression so that we will see it when expanding + tree structure later. + * init.c (begin_init_stmts): Don't make it static. + (finish_init_stmts): Likewise. + + * cp-tree.h (start_handler_parms): New function. + (expand_start_catch_block): Take only one parameter. + (start_handler_parms): New function. + * decl.c (start_handler_parms): Define it. + * except.c (process_start_catch_block): Take only one parameter. + Don't call grokdeclarator here. + (expand_start_catch_block): Don't call grokdeclarator here, + either. + * parse.y (handler_args): Adjust call to + expand_start_catch_block. Use start_handler_parms. + * pt.c (push_template_decl_real): Make permanent lists have + permanent elements. + (tsubst_expr): Adjust calls to expand_start_catch_block + appropriately. + * semantics.c (expand_stmt): Likewise. + +1999-08-29 Alex Samuel + + * pt.c (push_template_decl_real): Use template declaration from + class type if it exists. + +1999-08-29 Mark Mitchell + + * cp-tree.h (TYPE_NEEDS_CONSTRUCTING): Remove #if 0'd definition. + (maybe_inject_for_scope_var): Declare it. + (initialize_local_var): Likewise. + * decl.c (maybe_inject_for_scope_var): Make it global. + (initialize_local_var): Likewise. Move cleanup handling here, + from cp_finish_decl. + (make_rtl_for_nonlocal_decl): Use + push_obstacks_nochange/pop_obstacks, rather than + end_temporary_allocation/resume_temporary_allocation. + (cp_finish_decl): Try to complete the type of a variable when it + is declared. Move cleanup-handling to initialize_local_var. + (expand_static_init): Use tree-building code, rather than + RTL-building code. + * decl2.c (get_temp_name): Assert non-initializedness of + temporaries. + * init.c (create_temporary_var): Move RTL-assigning code to ... + (get_temp_regvar): Here. + * pt.c (tsbust_expr): Fix indentation. Call cp_finish_decl here. + * semantics.c (expand_stmt): Don't call cp_finish_decl here. Just + call initialize_local_var to generate initialization code. + +1999-08-29 Kaveh R. Ghazi + + * cp-tree.h (fndecl_as_string, type_as_string, + type_as_string_real, args_as_string, decl_as_string, + expr_as_string, code_as_string, language_as_string, + parm_as_string, op_as_string, assop_as_string, cv_as_string, + lang_decl_name, cp_file_of, lang_printable_name): Constify a char*. + + * errfn.c (cp_printer): Likewise. + + * error.c (cp_printer, fndecl_as_string, type_as_string_real, + type_as_string, expr_as_string, decl_as_string, lang_decl_name, + cp_file_of, code_as_string, language_as_string, parm_as_string, + op_as_string, assop_as_string, args_as_string, cv_as_string): + Likewise. + + * tree.c (lang_printable_name): Likewise. + +1999-08-28 Richard Henderson + + * decl2.c (arg_assoc_class): Bail if the class is a builtin type. + +1999-08-28 Mark Mitchell + + * cp-tree.h (strip_array_types): New function. + * decl.c (maybe_deduce_size_from_array_init): New function, split + out from cp_finish_decl. + (layout_var_decl): Likewise. + (maybe_commonize_var): Likewise. + (maybe_inject_for_scope_var): Likewise. + (initialize_local_var): Likewise. + (build_cleanup_on_safe_obstack): Likewise. + (check_initializer): Likewise. + (make_rtl_for_nonlocal_decl): Likewise. + (cp_finish_decl): Use them. + * typeck.c (strip_array_types): New function. + + * cp-tree.def (LABEL_STMT): New tree node. + * cp-tree.h (LABEL_STMT_LABEL): New macro. + (shadow_label): Remove. + (declare_local_label): New function. + (finish_label_decl): Likewise. + * decl.c (make_label_decl): New function, split out from + lookup_label. + (shadowed_labels): Remove. + (binding_level): Add shadowed_labels. + (clear_binding_level): Remove. + (push_binding_level): Just bzero the new binding level. + (pushlevel): Fix indentation. + (pop_label): New function. + (pop_labels): Likewise, split out from poplevel. + (poplevel): Pop local labels. Use pop_labels. + (maybe_push_to_top_level): Don't clear shadowed_labels. + (lookup_label): Use make_label_decl. + (shadow_label): Remove. + (declare_local_label): New function. + (define_label): Simplify. + (start_function): Don't clear shadowed_labels. + (cp_function): Remove shadowed_labels. + (push_cp_function_context): Don't save shadowed_labels. + (pop_cp_function_context): Don't restore it. + * dump.c (dequeue_and_dump): Handle LABEL_STMT. + * parse.y (label_decl): Use finish_label_decl. + * pt.c (tsubst_expr): Handle LABEL_STMTs, and local label + declarations. + * semantics.c (finish_label_stmt): Add a LABEL_STMT when + building_stmt_tree. + (finish_label_decl): New function. + (expand_stmt): Handle LABEL_STMTs and local label declarations. + +1999-08-26 Mark Mitchell + + * decl.c (lookup_label): Build labels on the permanent obstack + when building statement trees. Don't build RTL for labels when + building statement trees. + * semantics.c (finish_goto_stmt): Use LABEL_DECLs even when + building statement trees. + (finish_label_stmt): Likewise. + (expand_stmt): Adjust accordingly. + * pt.c (tsubst_expr); Likewise. + (do_decl_instantiation): Robustify. + + * cp-tree.h (AGGR_INIT_VIA_CTOR_P): New macro. + * tree.c (build_cplus_new): Set it. + * expr.c (cplus_expand_expr): Use it. + * dump.c (deque_and_dump): Handle AGGR_INIT_EXPR. + + * decl.c (store_parm_decls): Reset immediate_size_expand. + (finish_function): Likewise. + + * tree.c (cplus_unsave_expr_now): Don't return a value. + + * semantics.c (do_poplevel): Always initialize the return value. + +1999-08-26 Gavin Romig-Koch + + * cp-tree.h (cplus_unsave_expr_now) : Correct return type. + * tree.h (cplus_unsave_expr_now) : Same. + +1999-08-25 Mark Mitchell + + * decl.c (grokdeclarator): Amend comment. + * except.c (expand_start_catch_block): Call push_template_decl for + catch-block parameters. + * method.c (synthesize_method): Build an empty compound statement + for the body of a constructor. + +1999-08-25 Jason Merrill + + * tree.c (cp_build_qualified_type_real): If we're asking for the + same quals we already have, just return. + +1999-08-25 Mark Mitchell + + * cp-tree.def (SUBOBJECT): New tree node. + * cp-tree.h (CLEANUP_P): New macro. + (SUBOBJECT_CLEANUP): Likewise. + (keep_next_level): Add parameter. + (get_temp_regvar): Don't declare. + (emit_base_init): Remove parameter. + (expand_aggr_init): Rename to build_aggr_init. + (expand_vec_init): Rename to build_vec_init. + (do_pushlevel): Remove. + (do_poplevel): Likewise. + (finish_cleanup): New function. + (finish_subobject): Likewise. + (stmts_are_full_exprs_p): New variable. + * decl.c (keep_next_level): Add parameter. + (cp_finish_decl): Use build_aggr_init, not + expand_aggr_init. Use finish_expr_stmt to expand the code. + (expand_static_init): Use tree-generating, not RTL-generating, + functions to handle the initialization. + (start_function): Remove dead code. Always have a momentary + obstack inside the function, even before hitting the first curly + brace. + (cplus_expand_expr_stmt): Move calls to + expand_{start,end}_target_temps into semantics.c. + (cp_function): Add stmts_are_full_exprs_p. + (push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + * decl2.c (get_temp_regvar): Move to init.c. + (do_static_initialization): Use build_{aggr,vec}_init. + (do_static_destruction): Fix typo in comment. + * dump.c (dequeue_and_dump): Handle INIT_EXPR. + * except.c (expand_throw): Use create_temporary_var. + * expr.c (cplus_expand_expr): Use build_{aggr,vec}_init. + * init.c (expand_vec_init_try_block): Remove. + (expand_vec_init_catch_clause): Likewise. + (get_temp_regvar): New function. + (begin_init_stmts): Likewise. + (finish_init_stmts): Likewise. + (perform_member_init): Use build_{aggr,vec}_init. Build up tree + structure here. + (emit_base_init): Likewise. Remove unused parameter. + (expand_virtual_init): Likewise. + (expand_cleanup_for_base): Use finish_subobject. + (expand_aggr_vbase_init_1): Simplify. + (construct_virtual_bases): Use tree-generating functions to build + up initialization. + (expand_aggr_init): Likewise. Rename to build_aggr_init. + (expand_default_init): Likewise. + (expand_aggr_init_1): Likewise. + (expand_vec_init): Rename to build_vec_init. + * method.c (do_build_copy_constructor): Use tree-generating + functions. Don't call clear_last_expr. + (do_build_assign_ref): Likewise. + (synthesize_method): Call clear_last_expr here. + * parse.y (base_init): Don't call clear_last_expr here. + (nodecls): Likewise. + * pt.c (tsubst_expr): Handle a TRY_BLOCK with CLEANUP_P set. + * semantics.c (do_pushlevel): Move to here. + (do_poplevel): Likewise. + (stmts_are_full_exprs_p): New variable. + (finish_expr_stmt): Handle logic for temoprary cleanup here. + (finish_for_stmt): Use finish_expr_stmt. + (finish_cleanup): New function. + (finish_function_try_block): Fix indentation. + (finish_subobject): New function. + (setup_vtbl_ptr): Call keep_next_level here. + (finish_stmt_expr): Handle a block with no scope inside the + statement-expression. + (expand_stmt): Handle a TRY_BLOCK with CLEANUP_P set. Handle + SUBOBJECT. + * tree.c (search_tree): Handle INIT_EXPR. + (mapcar): Likewise. + * typeck.c (build_modify_expr): Don't build an RTL_EXPR. + * typeck2.c (store_init_value): Change expand_aggr_init to + build_aggr_init in comment. + +1999-08-25 Mark Mitchell + + * dump.c (dequeue_and_dump): Dump TARGET_EXPRs. + +1999-08-25 Nathan Sidwell + + * decl2.c (handle_class_head): Be graceful about additional + scope qualifiers. Adjust comments to reflect reality. + +1999-08-24 Jason Merrill + + * call.c (build_conditional_expr): Fix typo. + * typeck.c (build_modify_expr, COND_EXPR): Make sure we've got an + lvalue before trying to mess with the sides. + + * error.c (dump_expr, CONVERT_EXPR): Handle (void) properly. + +Mon Aug 23 22:17:20 1999 Mumit Khan + + * g++spec.c (lang_specific_driver): Add room for NULL in arglist. + +1999-08-23 Jason Merrill + + * exception.cc (__cplus_type_matcher): Call __throw_type_match_rtti_2. + Return arbitrary pointer or NULL. + (check_eh_spec): Call __throw_type_match_rtti_2. + * tinfo.h (*::dcast): Return int. Add valp parm. + * tinfo.cc (*::dcast): Likewise. Adjust to allow for null pointers. + * tinfo2.cc (__throw_type_match_rtti_2): Likewise. + (__throw_type_match_rtti): Now just a wrapper. + + * except.c: Lose CatchMatch, FirstExceptionMatch, and Unwind. + (init_exception_processing): Don't initialize them. + +1999-08-23 Paul Burchard + + * decl.c (check_default_argument): Fix typo. + +1999-08-22 Mark Mitchell + + * cp-tree.def (STMT_EXPR): Fix typo in node name. + + * dump.c (dump_next_stmt): New function. + (dequeue_and_dump): Use it. + + * pt.c (tsubst_copy): Make sure to initialize return value for a + STMT_EXPR, even when processing_template_decl. + * semantics.c (finish_stmt_expr): A statement-expression whose + last statement is not an expression-statement has type `void'. + +1999-08-20 Mark Mitchell + + * semantics.c (finish_stmt_expr): Fix typo in comment. + * tree.c (search_tree): Handle EXIT_EXPR, LOOP_EXPR. + (mapcar): Likewise. + * init.c (build_vec_delete_1): Make the children of a permanent + BIND_EXPR permanent. + * pt.c (register_specialization): Don't register a specialization + more than once. + +1999-08-18 Andrew Haley + + * method.c (process_overload_item): Call build_mangled_C9x_name () + for all integer parameter types larger than long long. + +1999-08-19 Mark Mitchell + + * pt.c (redeclare_class_template): Merge default template + arguments in both directions. + + * typeck.c (common_type): Undo 1999-08-18 change. Remove + compiler_error message. + +1999-08-19 Jason Merrill + + * cp-tree.h: Declare flag_use_repository. + * pt.c (do_decl_instantiation): Don't complain about duplicate + instantiation with -frepo. + (do_type_instantiation): Likewise. + + * pt.c (push_template_decl_real): Complain about everything + that isn't a valid template. + + * decl2.c (import_export_decl): If -fnew-abi, class linkage doesn't + affect inlines. + +1999-08-19 Mark Mitchell + + * cp-tree.def (PSEUDO_DTOR_EXPR): New tree code. + * decl2.c (build_expr_from_tree): Handle it. + * error.c (dump_expr): Likewise. + * pt.c (for_each_template_parm): Likewise. + (tsubst_copy): Likewise. + * tree.c (search_tree): Likewise. + * semantics.c (finish_pseudo_destructor_call): Create it. + +1999-08-18 Mark Mitchell + + * search.c (setup_class_bindings): Robustify. + * typeck.c (common_type): Use same_type_p, not pointer equality, + to compare types. + + * cp-tree.h (build_lang_field_decl): Remove. + * class.c (build_vtable): Replace calls to build_lang_field_decl + with build_lang_decl. + (prepare_fresh_vtable): Likewise. + (finish_struct_1): Likewise. + (init_class_processing): Likewise. + * decl.c (push_using_decl): Likewise. + (init_decl_processing): Likewise. + (grokvardecl): Likewise. + (build_ptrmemfunc_type): Likewise. + (grokdeclarator): Likewise. + (build_enumerator): Likewise. + * decl2.c (grok_x_components): Likewise. + (do_class_using_decl): Likewise. + * except.c (call_eh_info): Likewise. + * init.c (init_init_processing): Likewise. + * rtti.c (expand_class_decl): Likewise. + * tree.c (build_base_fields): Likewise. + (build_vbase_pointer_fields): Likewise. + * lex.c (build_lang_decl): Build declarations on the permanent + obstack if we're building statmeent trees. + (retrofit_lang_decl): Handle both the full lang_decl and also the + smaller lang_decl_flags here. + (build_lang_field_decl): Remove. + * pt.c (push_template_decl_real): Issue errors for variable + declarations that are not static members. + +1999-08-18 Richard Henderson + + * tree.c (search_tree): Handle TRUTH_{AND,OR,XOR}_EXPR too. + (mapcar): Likewise. + +1999-08-17 Mark Mitchell + + * cp-tree.h (back_end_hook): New variable. + * decl2.c (back_end_hook): Define it. + (finish_file): If it's non-NULL, call it. + + * decl.c (add_decl_to_level): New function. + (push_local_binding): Use it. + (find_binding): Fix typo in comment. + (pushdecl): Use add_decl_to_level. Put templates on the + corresponding namespace-scope binding levels. + * dump.c (dequeue_and_dump): Print the specializations of a + template. + * pt.c (push_template_decl_real): Don't push a template multiple + times. + +1999-08-17 Mark Mitchell + + * cp-tree.h (CALL_DECLARATOR_PARMS): New macro. + (CALL_DECLARATOR_QUALS): Likewise. + (CALL_DECARATOR_EXCEPTION_SPEC): Likewise. + * decl.c (grokdeclarator): Adjust to use them. + * decl2.c (grokfield): Likewise. + (reparse_absdcl_as_casts): Likewise. + * lex.c (make_call_declarator): Likewise. + (set_quals_and_spec): Likewise. + * pt.c (tsubst): Likewise. + * tree.c (mapcar): Remove special hack to handle third operand of + a CALL_EXPR. + +1999-08-16 Mark Mitchell + + * cp-tree.h (CAN_HAVE_FULL_LANG_DECL_P): New macro. + * class.c (build_vtable): Use build_lang_field_decl to build the + VAR_DECLs for vtables. + (prepare_fresh_vtable): Likewise. + * decl.c (duplicate_decls): Only copy DECL_SAVED_TREE if + CAN_HAVE_FULL_LANG_DECL_P. + (push_using_decl): Use build_lang_decl to build USING_DECLs. + (grokdeclarator): Use build_lang_decl to build TYPE_DECLs. + * lex.c (retrofit_lang_decl): Check CAN_HAVE_FULL_LANG_DECL_P. + (build_lang_field_decl): Likewise. + (copy_lang_decl): Use CAN_HAVE_FULLLANG_DECL_P to decide how much + to copy. + + * cp-tree.def (STMT_EXPR): New tree node. + * cp-tree.h (STMT_EXPR_STMT): New macro. + (store_return_init): Change prototype. + (finish_named_return_value): New function. + (expand_stmt): Likewise. + (expand_body): Likewise. + (begin_stmt_tree): Likewise. + (finish_stmt_tree): Likewise. + (expanding_p): New variable. + (last_expr_type): Likewise. + (building_stmt_tree): New macro. + * decl.c (start_function): Use building_stmt_tree, not + processing_template_decl, where appropriate. + (store_parm_decls): Likewise. + (store_return_init): Move most of the body to semantics.c. + (finish_function): Use building_stmt_tree. + (finish_stmt): Clear last_expr_type here. + (cp_function): Add expanding_p, last_tree, last_expr_type. + (push_cp_function_context): Save them. + (pop_cp_function_context): Restore them. + * decl2.c (setup_vtbl_ptr): Move to semantics.c. + * error.c (dump_expr): Handle STMT_EXPR. + * except.c (expand_start_catch_block): Use building_stmt_tree. + Use add_decl_stmt. + * expr.c (cplus_expand_expr): Handle STMT_EXPR. + (do_case): Move add_tree call to semantics.c. + * parse.y (return_init): Use finish_named_return_value. + (for.init.statement): Use finish_expr_stmt. + * parse.c: Regenerated. + * pt.c (do_pushlevel): Move to semantics.c. + (do_poplevel): Likewise. + (tsubst_copy): Handle STMT_EXPR instead of BIND_EXPR. + (tsubst_expr): Don't expand all the way to RTL here. Handle + RETURN_INIT and CTOR_INITIALIZER. + (instantiate_decl): Call expand_body after tsubst'ing into + DECL_SAVED_TREE. + * semantics.c (expand_stmts): New function. + (expanding_p): New variable. + (last_expr_type): Likewise. + (finish_expr_stmt): Use building_stmt_tree. + (begin_if_stmt): Likewise. + (finish_if_stmt_cond): Likewise. + (finish_then_clause): Likewise. + (begin_else_clause): Likewise. + (finish_else_clause): Likewise. + (begin_while_stmt): Likewise. + (finish_while_stmt_cond): Likewise. + (finish_while_stmt): Likewise. + (finish_do_body): Likewise. + (finish_do_stmt): Likewise. + (finish_return_stmt): Likewise. + (begin_for_stmt): Likewise. + (fnish_for_init_stmt): Likewise. + (finish_for_cond): Likewise. + (finish_for_expr): Likewise. + (finish_for_stmt): Likewise. + (finish_break_stmt): Likewise. + (finish_continue_stmt): Likewise. + (finish_switch_cond): Likewise. + (finish_switch_stmt): Likewise. + (finish_case_label): Call add_tree here if necessary. + (finish_goto_statement): Use building_stmt_tree. + (begin_try_block): Likewise. + (begin_function_try_block): Likewise. + (finish_try_block): Likewise. + (finish_function_try_block): Likewise. + (finish_handler_sequence): Likewise. + (finish_function_handler_sequence): Likewise. + (begin_handler): Likewise. + (finish_handler_parms): Likewise. + (finish_handler): Likewise. + (begin_compound_stmt): Likewise. + (finish_compound_stmt): Likewise. + (finish_asm_stmt): Likewise. + (finish_label_stmt): Likewise. + (finish_named_return_value): New function. + (setup_vtbl_ptr): Moved here from decl2.c. + (do_pushlevel): Moved here from pt.c. + (do_poplevel): Likewise. + (begin_stmt_expr): Use building_stmt_tree. + (finish_stmt_expr): Likewise. Build a STMT_EXPR, not a BIND_EXPR, + when building_stmt_tree. + (begin_stmt_tree): New function. + (finish_stmt_tree): Likewise. + (expand_stmt): Likewise. + (expand_body): Likewise. + * tree.c (build_cplus_method_type): Make sure the argument types + end up on the same obstack as the METHOD_TYPE. + (search_tree): Handle COMPOUND_EXPR, MODIFY_EXPR, + THROW_EXPR, STMT_EXPR. + (mapcar): Break out common cases. Handle COMPOUND_EXPR, + MODIFY_EXPR, THROW_EXPR, STMT_EXPR, RTL_EXPR. Abort, rather than + sorry, if an unsupported node is encountered. + * typeck.c (require_complete_type_in_void): Handle BIND_EXPR. + (c_expand_return): Don't call add_tree here. + +1999-08-15 Mark Mitchell + + * pt.c (check_default_tmpl_args): Don't check in local scopes. + (tsubst_decl): Make sure the declaration is on a saveable + obstack. Clear DECL_DEAD_FOR_LOCAL when making a copy of a local + variable. + (tsubst_expr): Adjust now that DECL_STMTs really contain DECLs. + +1999-08-14 Jason Merrill + + Speed up Koenig lookup. + * decl.c (unqualified_namespace_lookup): Nonstatic. Add spacep parm + to return namespaces we've looked at. + * decl2.c (lookup_using_namespace): Likewise. + (add_function): Don't call ovl_member. + (lookup_arg_dependent): Initialize k.namespaces to the list of + namespaces seen in unqualified lookup. + * call.c (equal_functions): Move here from tree.c. + (joust): Use it to handle duplicate candidates. + * tree.c (ovl_member): Use ==. + +1999-08-13 Mark Mitchell + + * cp-tree.def (DECL_STMT): Make it smaller. + * cp-tree.h (lang_decl_flags): Move saved_tree to ... + (lang_decl): ... here. Add next. + (DECL_SAVED_TREE): Adjust accordingly. + (DECL_IMPLICIT_TYPEDEF_P): New macro. + (SET_DECL_IMPLICIT_TYPEDEF_P): Likewise. + (DECL_STMT_DECL): Likewise. + (create_implicit_typedef): New function. + (maybe_push_decl): Likewise. + (tsubst_default_argument): New function. + (at_function_scope_p): Likewise. + (add_decl_stmt): Likewise. + (push_permanent_obstack): Likewise. + * call.c (convert_default_arg): Use tsubst_default_argument. + * class.c (add_method): Use push_permanent_obstack. + (build_self_reference): Create a TEMPLATE_DECL for the + self-reference, if necessary. + * decl.c (pseudo_global_level_p): Only look at the current binding + level. + (push_binding): Use push_permanent_obstack. + (create_implicit_typedef): New function. + (pushtag): Use it. + (duplicate_decls): Use push_permanent_obstack. + (maybe_push_decl): New function. + (start_decl): Use it. Remove dead code. Use add_decl_stmt. + (start_decl_1): Remove dead code. + (cp_finish_decl): Remove DECL_STMT handling here. Don't use + pseudo_global_level_p. + (grokvardecl): Create DECL_LANG_SPECIFIC for a VAR_DECL in a + template. + (grokdeclarator): Likewise, for TYPE_DECLs. Don't use + pseudo_global_level_p. + * decl2.c (grokfield): Call push_template_decl for a TYPE_DECL in + a template. + (get_sentry): Use push_permanent_obstack. + * dump.c (dequeue_and_dump): Enable DECL_STMT. + * except.c (call_eh_info): Use push_permanent_obstack. + (build_eh_type_ref): Likewise. + (do_pop_exception): Likewise. + (expand_eh_spec): Likewise. + (alloc_eh_object): Likewise. + (expand_throw): Likewise. + * init.c (build_java_class_ref): Likewise. + * lex.c (get_time_identifier): Likewise. + (free_lang_decl_chain): Correct type. + (retrofit_lang_decl): Adjust accordingly. + (build_lang_field_decl): Likewise. + * lex.h (free_lang_decl_chain): Likewise. + * parse.y (lang_extdef): Don't use pseudo_global_level_p. + * parse.c: Regenerated. + * pt.c (tsubst_default_arguments): New function. + (retrieve_local_specialization): Likewise. + (register_local_specialization): Likewise. + (push_template_decl_real): Use DECL_IMPLICIT_TYPEDEF_P. Just use + pseudo_global_level_p to determine whether or not a template is + primary. + (lookup_template_class): Likewise. Use create_implicit_typedef. + (instantiate_class_template): Call tsubst_default_arguments for + member functions, if appropriate. + (tsubst_default_argument): New function. + (tsubst_decl): Use it. Change TYPE_DECL handling to match VAR_DECLs. + * search.c (at_function_scope_p): New function. + * semantics.c (finish_asm_stmt): Use push_permanent_obstack. + (finish_label_stmt): Likewise. + (add_decl_stmt): New function. + (begin_class_definition): Likewise. + (finish_typeof): Likewise. + * tree.c (copy_template_template_parm): Likewise. + (copy_to_permanent): Likewise. + (push_permanent_obstack): Define. + (mark_addressable): Use it. + * typeck.c (mark_addressable): Likewise. + +1999-08-13 Gavin Romig-Koch + + * cp-tree.h (init_cplus_unsave): New. + (cplus_unsave_expr_now): New. + * lex.c (init_parse): Call init_cplus_unsave. + * tree.c (init_cplus_unsave): New. + (cplus_unsave_expr_now): New. + +1999-08-13 Mark Mitchell + + * pt.c (tsubst): Back out 1999-08-06 patch. Use fold and + decl_constant_value to simplify array bounds. + +1999-08-11 Jason Merrill + + * lang-options.h: Add -fms-extensions. + * cp-tree.h: Declare flag_ms_extensions. + * decl2.c: Define it. + * class.c (instantiate_type): Don't complain about taking the address + of a bound member function if -fms-extensions. + * typeck.c (build_unary_op): Likewise. + * decl.c (grokdeclarator): Or about implicit int. + * init.c (resolve_offset_ref): Or about implicit '&'. + +1999-08-11 Mark Mitchell + + * cp-tree.h (minimal_parse_mode): Remove. + (finish_label_stmt): New function. + * decl.c (saved_scope): Remove minimal parse mode. + (maybe_push_to_top_level): Don't save it. + (pop_from_top_level): Don't restore it. + (define_label): Split out template-handling code to semantics.c. + (start_decl): Don't use minimal_parse_mode. + (cp_finish_decl): Likewise. + (start_function): Don't increment it. + (store_return_init): Don't use it. + (finish_function): Don't decrement it. + * parse.y (label_colon): Use finish_label_stmt throughout. + * parse.c: Regenerated. + * pt.c (minimal_parse_mode): Don't define it. + (tsubst_expr): Use finish_label_stmt. + * semantics.c (finish_label_stmt): New function. + + * dump.c (queue): Be careful when computing bitmasks. + (dequeue_and_dump): Describe binfos as binfos, not as + vectors. + + * parse.y (pedantic): Give it itype. Adjust usage accordingly + throughout. + * parse.c: Regenerated. + + * Make-lang.in (CXX_SRCS): Remove sig.c. + * Makefile.in (CXX_OBJS): Remove sig.o. + (sig.o): Remove. + * cp-tree.h (CPTI_OPAQUE_TYPE): Remove. + (CPTI_SIGNATURE_TYPE): Likewise. + (CPTI_SIGTABLE_ENTRY_TYPE): Likewise. + (opaque_type_node): Likewise. + (signature_type_node): Likewise. + (sigtable_entry_type): Likewise. + (flag_handle_signatures): Likewise. + (lang_type): Remove is_signature, is_signature_pointer, + is_signature_reference, has_opaque_typedecls, + sigtables_has_been_generated. Adjust dummy. Remove signature, + signature_pointer_to, signature_reference_to. + (IS_SIGNATURE): Remove. + (SET_SIGNATURE): Remove. + (CLEAR_SIGNATURE): Remove. + (IS_SIGNATURE_POINTER): Remove. + (IS_SIGNATURE_REFERENCE): Remove. + (SIGNATURE_HAS_OPAQUE_TYPEDECLS): Remove. + (SIGTABLE_HAS_BEEN_GENERATED): Remove. + (CLASSTYPE_SIGNATURE): Remove. + (SIGNATURE_TYPE): Remove. + (SIGNATURE_METHOD_VEC): Remove. + (SIGNATURE_POINTER_TO): Remove. + (SIGNATURE_REFERENCE_TO): Remove. + (lang_decl_flags): Remove is_default_implementation. Rename + memfunc_pointer_to to saved_tree. + (IS_DEFAULT_IMPLEMENTATION): Remove. + (DECL_MEMFUNC_POINTER_TO): Remove. + (DECL_MEMFUNC_POINTING_TO): Remove. + (DECL_SAVED_TREE): Adjust definition. + (tag_types): Remove signature_type_node. + (SIGNATURE_FIELD_NAME): Remove. + (SIGNATURE_FIELD_NAME_FORMAT): Likewise. + (SIGNATURE_OPTR_NAME): Likewise. + (SIGNATURE_SPTR_NAME): Likewise. + (SIGNATURE_POINTER_NAME): Likewise. + (SIGNATURE_POINTER_NAME_FORMAT): Likewise. + (SIGNATURE_REFERENCE_NAME): Likewise. + (SIGNATURE_REFERNECE_NAME_FORMAT): Likewise. + (SIGTABLE_PTR_TYPE): Likewise. + (SIGTABLE_NAME_FORMAT): Likewise. + (SIGTABLE_NAME_FORMAT_LONG): Likewise. + (SIGTABLE_TAG_NAME): Likewise. + (SIGTABLE_VB_OFF_NAME): Likewise. + (SIGTABLE_VT_OFF_NAME): Likewise. + (finish_base_specifiers): Change prototype. + (build_signature_pointer_type): Remove. + (build_signature_reference_type): Remove. + (build_signature_pointer_constructor): Remove. + (build_signature_method_call): Remove. + (build_optr_ref): Likewise. + (append_signature_fields): Likewise. + (signature_error): Likewise. + * call.c (build_this): Remove signature support. + (build_over_call): Likewise. + (build_new_method_call): Likewise. + * class.c (add_implicitly_declared_members): Likewise. + (finish_struct_1): Likewise. + (finish_struct): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_pointer_force): Likewise. + (ocp_convert): Likewise. + * decl.c (sigtable_decl_p): Remove. + (init_decl_processing): Remove support for signatures. + (cp_finish_decl): Likewise. + (grokdeclarator): Likewise. + (grokparms): Likewise. + (xref_tag): Likewise. + (start_function): Likewise. + (start_method): Likewise. + * decl2.c (finish_sigtable_vardecl): Remove. + (flag_handle_signatures): Remove. + (lang_f_options): Remove handle-signatures. + (grokfield): Remove support for signatures. + (grokbitfield): Likewise. + (finish_file): Likewise. + (reparse_absdcl_as_casts): Likewise. + * error.c (dump_type_real): Likewise. + (dump_function_decl): Likewise. + * friend.c (make_friend_class): Likewise. + * gxx.gperf: Remove __signature__, signature, __sigof__, sigof. + * hash.h: Regenerated. + * init.c (build_new_1): Remove support for signatures. + * lang-options.h: Remove -fhandle-signatures, + -fno-handle-signatures. + * lex.c (init_parse): Remove support for signatures. + (yyprint): Likewise. + * lex.h (rid): Remove RID_SIGNATURE. + * method.c (build_decl_overload_real): Remove support for + signatures. + (hack_identifier): Likewise. + * parse.y (base_class): Likewise. + (base_class.1): Likewise. + (access_specifier): Likewise. + * search.c (lookup_member): Likewise. + * semantics.c (finish_qualified_object_call_expr): Likewise. + (finish_template_type_parm): Likewise. + (begin_class_definition): Likewise. + (finish_base_specifier): Likewise. + * sig.c: Remove. + * tree.c (build_cplus_method_type): Remove support for signatures. + * typeck.c (require_complete_type): Likewise. + (c_sizeof): Likewise. + (c_alignof): Likewise. + (build_object_ref): Likewise. + (build_component_ref): Likewise. + (build_indirect_ref): Likewise. + (build_c_cast): Likewise. + (build_modify_expr): Likewise. + (convert_for_initialization): Likewise. + * typeck2.c (signature_error): Remove. + (store_init_value): Remove support for signatures. + (digest_init): Likewise. + (build_x_arrow): Likewise. + (build_functional_cast): Likewise. + * xref.c (GNU_xref_decl): Likewise. + +1999-08-10 Martin v. Löwis + + * lex.c (do_identifier): Remove unnecessary lookup of class field. + +1999-08-09 Martin v. Löwis + + * decl2.c (set_decl_namespace): Do not complain about non-matching + decls if processing a template. + +1999-08-09 Mark Mitchell + + * decl.c (build_ptrmemfunc_type): Handle qualified + pointer-to-member types here. + * tree.c (cp_build_qualified_type_real): Simplify handling here. + +1999-08-09 Kaveh R. Ghazi + + * lex.c (lang_identify): Likewise. + +1999-08-09 Bernd Schmidt + + * Makefile.in: Update dependencies. + * class.c (finish_struct_1): Don't initialize DECL_SAVED_INSNS with + NULL_RTX. + * decl.c: Include "function.h" + (cleanup_label, return_label): Delete declarations. + (store_parm_decls): Don't initialize DECL_SAVED_INSNS with NULL_RTX. + (finish_function): Rename last_parm_insn variable to + fn_last_parm_insn. Don't compare DECL_SAVED_INSNS to NULL_RTX. + * decl2.c: Include "function.h". + (rtl_expr_chain): Delete declaration. + * method.c: Include "function.h" + * tree.c (build_vbase_pointer_fields): Don't initialize + DECL_SAVED_INSNS with NULL_RTX. + * typeck.c: Include "function.h" + +1999-08-09 Jason Merrill + + * semantics.c (begin_function_try_block, finish_function_try_block, + finish_function_handler_sequence): New fns. + * parse.y (function_try_block): Use them. + * pt.c (instantiate_decl): Likewise. + + * cp-tree.h: Declare in_function_try_handler. + * decl.c: Define it. + (start_function): Clear it. + (struct cp_function, push_cp_function_context): Save it. + (pop_cp_function_context): Restore it. + * parse.y (function_try_block): Set and clear it. + * except.c (expand_end_catch_block): Rethrow if we reach the end + of a function-try-block handler in a ctor or dtor. + * typeck.c (c_expand_return): Complain about returning from a + function-try-block handler of a ctor. + + * parse.y (function_try_block): Call end_protect_partials + before expand_start_all_catch. + +1999-08-08 Jason Merrill + + * decl.c (struct binding_level): Add eh_region field. + (push_binding_level): Set it. + (define_label): Complain about jumping into an EH block. + + * ptree.c (print_lang_type): Print the real type of a PMF. + Print what exceptions a fn type throws. + +1999-08-07 Kaveh R. Ghazi + + * class.c (count_fields, add_fields_to_vec): Add static prototype. + + * cp-tree.h (opname_tab, assignop_tab, operator_name_string, + get_id_2, composite_pointer_type, dump_node_to_file): Constify a + char*. + + * decl.c (named_label_list, cp_finish_decl, grokdeclarator): + Constify a char*. + + * decl2.c (finish_static_data_member_decl, grokfield): Constify a + char*. + + * dump.c (queue_and_dump_index, dump_int, dump_string, + dump_string_field, dequeue_and_dump, dump_node_to_file): Constify + a char*. + (dump_stmt): Add static prototype. + + * errfn.c (cp_thing): Constify a char*. + + * error.c (dump_unary_op, dump_binary_op, aggr_variety, + dump_aggr_type, dump_global_iord, dump_decl, dump_function_name, + dump_expr): Constify a char*. + + * lex.c (extend_token_buffer_to, pragma_getc, pragma_ungetc, + read_line_number): Add static prototype. + (opname_tab, assignop_tab, operator_name_string): Constify a char*. + (real_yylex): Move label `letter' into the scope where it is used. + + * method.c (build_mangled_template_parm_index, build_overload_int, + build_decl_overload_real, get_id_2): Constify a char*. + + * search.c (check_final_overrider): Make static. + + * typeck.c (composite_pointer_type): Constify a char*. + +1999-08-06 Jason Merrill + + * pt.c (maybe_get_template_decl_from_type_decl): Make sure that + we're looking at a class. + + * decl.c (lookup_name_real): Set the complain flag if we're + looking for a namespace member. + + * lex.c (real_yylex): We can have a number with no digits. + + * cvt.c (cp_convert_to_pointer): Don't force pmf conversions. + + * search.c (binfo_from_vbase): New fn. + * cp-tree.h: Declare it. + * cvt.c (cp_convert_to_pointer): Use it to diagnose conversion + from pointer to member of virtual base. + * typeck.c (get_delta_difference): Likewise. + +1999-08-06 Alexandre Oliva + + * pt.c (tsubst): Use build_index_type to build in-template array + index type. Fixes g++.oliva/dwarf1.C. + * decl.c (grokdeclarator): Likewise, just for consistency, as it + doesn't seem to trigger the bug without it. + +1999-08-06 Jason Merrill + + * typeck2.c (add_exception_specifier): Use complete_type. + +1999-08-06 Mark Mitchell + + * error.c (dump_expr): Handle EXACT_DIV_EXPR. + (dump_binary_op): Bulletproof. + * lex.c (init_parse): Set opname_tab[EXACT_DIV_EXPR]. + * tree.c (search_tree): Don't enumerate all the nodes of classes + `1', `2', and `<'; handle them generically. Don't be sorry about + "unrecognized tree codes"; just abort. + (no_linkage_check): Don't do linkage checks for templates. + + * tree.c (cp_build_qualified_type_real): Handle + pointer-to-member-function types correctly. + +1999-08-05 Jason Merrill + + * decl.c (pushdecl): Only give an error for shadowing a parm + from *this* function. + +Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com) + + * typeck2.c: Update URLs and mail addresses. + +1999-08-04 Nathan Sidwell + + * cp-tree.h (empty_except_spec): New global var. + (compexcepttypes): Remove prototype. + (comp_except_specs): Prototype new global function. + (add_exception_specifier): Prototype new global function. + * decl.c (empty_except_spec): Define new global var. + (duplicate_decls): Use comp_except_specs, reword error message. + (init_decl_processing): Initialize empty_except_spec. + Adjust build_exception_variant calls. + * parse.y (exception_specification_opt): Use empty_except_spec. + (ansi_raise_identifier): Call check_for_new_type. + (ansi_raise_identifiers): Use add_exception_specifier. + * pt.c (tsubst): Use add_exception_specifier to build exception + specifier. + * search.c (check_final_overrider): New static function, broken + out of get_matching_virtual. Check throw specifiers, reword + diagnostics. + (get_matching_virtual): Use check_final_overrider. + * tree.c (build_exception_variant): Use comp_except_specs. + * typeck.c (compexcepttypes): Remove. + (comp_except_types): New static function, helper for + comp_except_specs. Compare two types as exception specifiers. + (comp_except_specs): New global function, compare two exception + specifiers. + (comptypes): Adjust for comp_except_specs. + * typeck2.c (add_exception_specifier): New global function. + + * class.c (check_for_override): Reword error message. + +1999-08-03 Nathan Sidwell + + * call.c (convert_arg_to_ellipsis): Use pod_type_p. + * cp-tree.h (struct lang_type): Added non_pod_class flag. + (CLASSTYPE_NON_POD_P): New macro to access it. + * class.c (finish_struct_1): Determine non-PODness. + Check for arrays of pointers (-Weffc++). + Remove array inspection duplicated code. + * tree.c (pod_type_p): Detect non-pod non-aggregate types. + Use CLASSTYPE_NON_POD_P. + +1999-08-03 Nathan Sidwell + + * class.c (duplicate_tag_error): Preserve template information. + +1999-08-03 Nathan Sidwell + + * decl.c (start_enum): Show location of previous definition. + * parse.y (enumlist_opt): New reduction. + (structsp): Simplify enum rules to use enumlist_opt. + +1999-08-03 Jason Merrill + + * lex.c (yyprint): Handle PFUNCNAME. + + * decl2.c (build_expr_from_tree, case METHOD_CALL_EXPR): Only + build_expr_from_tree on the args of a TEMPLATE_ID_EXPR. + +1999-08-03 Mumit Khan + + * decl.c (start_decl): Set attributes before duplicate_decls call. + +1999-08-02 Mark Mitchell + + * Make-lang.in (CXX_SRCS): Add dump.c. + * Makefile.in (CXX_OBJS): Add dump.o. + (dump.o): New target. + * cp-tree.h (DECL_CONV_FN_P): Document. + (DECL_OVERLOADED_OPERATOR_P): New function. + (TYPE_PTRMEM_CLASS_TYPE): New macro. + (TYPE_PTRMEM_POINTED_TO_TYPE): Likewise. + (PTRMEM_CST_CLASS): Use TYPE_PTRMEM_CLASS_TYPE. + (ASM_VOLATILE_P): New macro. + (STMT_LINENO): Likewise. + (cp_namespace_decls): New function. + (dump_node_to_file): New function. + * decl.c (cp_namespace_decls): New function. + (walk_namespaces_r): Use it. + (wrapup_globals_for_namespace): Likewise. + * decl2.c (flag_dump_translation_unit): New variable. + (lang_decode_option): Handle -fdump-translation-unit. + (finish_file): If flag_dump_translation_unit is set, dump the + translation unit. + * dump.c: New file. + * lang-options.h: Add -fdump-translation-unit. + * pt.c (tsubst_template_parms): Robustify. + (tsubst_decl): Use DECL_OVERLOADED_OPERATOR_P. + (tsubst_expr): Use STMT_LINENO. + * semantics.c (finish_asm_stmt): Eliminate duplicate code. Check + for invalid cv-qualifiers even while building templates. + +1999-08-02 Richard Henderson + + * call.c: Include defaults.h instead of expr.h. + * decl.c: Likewise. + * pt.c: Likewise. + * typeck.c: Include defaults.h. + +1999-08-02 Mark Mitchell + + * lex.c (errorcount, sorrycount): Don't declare. + * repo.c (errorcount, sorrycount): Likewise. + * typeck2.c (errorcount, sorrycount): Likewise. + +1999-08-02 Jakub Jelinek + + * call.c (convert_default_arg, build_over_call): Change all uses of + PROMOTE_PROTOTYPES, so that it tests it as a C expression. + Ensure expr.h is included. + * decl.c (grokparams): Ditto. + * pt.c (tsubst_decl): Ditto. + * typeck.c (convert_arguments): Ditto. + +1999-08-02 Jason Merrill + + * class.c (mark_overriders): Fix order of args to overrides. + (warn_hidden): Likewise. Fix for having virtual and non-virtual + functions with the same name. + +1999-08-02 Richard Henderson + + * cp-tree.h (TYPE_PTRMEMFUNC_P): Check TYPE_LANG_SPECIFIC non-null. + +1999-08-01 Mark Mitchell + + * call.c (build_conditional_expr): Fix typo in comment. + +1999-08-01 Bernd Schmidt + + * decl.c (finish_stmt): Don't declare and test cond_stack, loop_stack, + case_stack; use in_control_zone_p. + * typeck.c (c_expand_return): Likewise. + +1999-07-31 Bernd Schmidt + + * except.c (catch_clauses): Delete declaration. + +1999-07-30 Mark Mitchell + + * call.c (build_conditional_expr): Call convert_from_reference to + avoid reference/non-reference type confusion. Fix typo. + +1999-07-30 Richard Henderson + + * typeck2.c (initializer_constant_valid_p): Moved to c-common.c. + * cp-tree.h (initializer_constant_valid_p): Remove. + +1999-07-28 Mark Mitchell + + * call.c (conditional_conversion): Don't build BASE_CONVs for + conversions between things that have the same type. + (build_conditional_expr): Tweak. + (convert_like): Some BASE_CONVs really do require the generation + of code. + + * init.c (perform_member_init): Don't go through build_modify_expr + for simple initializations. + +1999-07-27 Jason Merrill + + * cp-tree.h (DECL_VIRTUAL_CONTEXT): New macro. + * typeck.c (expand_ptrmemfunc_cst): Calculate delta correctly for + virtual functions and MI. Simplify. + + * method.c: Remove prototype for largest_union_member. + * pt.c (determine_specialization): Fix uninitialized warning. + * lex.c (real_yylex): Likewise. + +1999-07-27 Mark Mitchell + + * class.c (override_one_vtable): Adjust the use of BINFO_VIRTUALS + here too. + + * cp-tree.h (BINFO_VIRTUALS): Document new format. + * class.c (modify_one_vtable): Change prototype accordingly. + (modify_all_vtables): Likewise. + (modify_all_direct_vtables): Likewise. + (modify_all_indirect_vtables): Likewise. + (build_vtable_entry_for_fn): New function. + (set_rtti_entry): Simplify for new BINFO_VIRTUALS format. + (modify_vtable_entry): Likewise. + (add_virtual_function): Likewise. + (build_vtbl_initializer): New function. + (finish_vtbls): Simplify for new BINFO_VIRTUALS format. + (fixup_vtable_deltas1): Likewise. + (fixup_vtable_deltas): Likewise. + (override_one_vtable): Likewise. + (finish_struct_1): Likewise. + + * error.c (dump_expr): Likewise. + * search.c (get_abstract_virtuals_1): Likewise. + (get_abstract_virtuals): Likewise. + (expand_upcast_fixups): Likewise. + * tree.c (debug_binfo): Likewise. + * decl2.c (mark_vtable_entries): Don't bash abstract virtuals to + __pure_virtual here. + +1999-07-26 Mark Mitchell + + * tree.c (build_cplus_new): Adjust call to abstract_virtuals_error + as per 1999-07-26 change. + + * typeck.c (c_sizeof): Don't allow non-static data members. + (expr_sizeof): Likewise. + +1999-07-26 Jason Merrill + + * input.c (feed_input): Only touch lineno and input_filename + if !USE_CPPLIB. Save the old values before setting the new ones. + + * input.c (feed_input): Add file, line parms. + * lex.c (begin_definition_of_inclass_inline, feed_defarg): Adjust. + (real_yylex): Check linemode before input_redirected(). + + * typeck.c (c_expand_return): Downgrade pedwarn about returning NULL + from op new to warning. + +1999-07-26 Mark Mitchell + + * cp-tree.h (ncp_convert): Rename to perform_implicit_conversion. + * call.c: All uses changed. + * typeck.c: Likewise. + +1999-07-26 Nathan Sidwell + + * exception.cc (__cplus_type_matcher): Match __eh_matcher + prototype. + +1999-07-26 Mark Mitchell + + * cp-tree.h (CP_INTEGRAL_TYPE_P): New macro. + (ARITHMETIC_TYPE_P): Adjust definition for standard conformance. + (strip_top_quals): Declare. + (ncp_convert): Likewise. + (type_after_usual_arithmetic_conversions): Likewise. + (composite_pointer_type): Likewise. + * call.c (strip_top_quals): Don't make it static. + (promoted_arithmetic_type_p): New function. + (conditional_conversion): Likewise. + (null_ptr_cst_p): Allow `false' as a NULL pointer constant. + (standard_conversion): Use same_type_p. Don't build BASE_CONVs + for converting a type to itself. + (reference_binding): Honor LOOKUP_NO_TEMP_BIND. + (implicit_conversion): Make sure the from and to types are + complete. + (add_builtin_candidate): Correct handling of ?: operator. + (add_builtin_candidates): Improve documentation. + (build_conditional_expr): New function. + (can_convert): Implement in terms of can_convert_arg. + (ncp_convert): New function. + * typeck.c (type_after_usual_arithmetic_conversions): New + function, split out from common_type. + (composite_pointer_type): New function, split out from + build_conditional_expr. + (common_type): Use type_after_usual_arithmetic_conversions. + Remove redundant attribute merging. + (comptypes): Tidy. Handle COMPLEX_TYPE. + (build_binary_op_nodefault): Use null_ptr_cst_p. + (build_conditional_expr): Remove. + (convert_for_assignment): Use new conversion functions. + + * cp-tree.h (abstract_virtuals_error): Change declaration. + * typeck2.c (abstract_virtuals_error): Check to see if an error + occurred, and return a boolean value accordingly. + (build_functional_cast): Adjust accordingly. + * class.c (finish_struct_1): Likewise. + * cvt.c (ocp_convert): Likewise. + * decl.c (cp_finish_decl): Likewise. + (grokparams): Likewise. + (grok_op_properties): Likewise. + (start_function): Likewise. + * init.c (build_new_1): Likewise. + + * pt.c (unify): Don't get confused by pointers-to-member functions. + + * search.c (build_cplus_new): Robustify. + +1999-07-24 Richard Henderson + + * gxx.gperf (__builtin_va_arg): New. + * parse.y (VA_ARG): New token. + (unary_expr): Recognize it. + +Sun Jul 25 15:24:21 1999 Jeffrey A Law (law@cygnus.com) + + * g++FAQ.texi: Deleted per Joe Buck's request. + * Makefile.in: Corresponding changes. + +1999-07-23 Jason Merrill + + * lex.c: Sync with C frontend. + (whitespace_cr): New fn. + (skip_white_space): Use it. + (init_parse): Reorder. + (yyprint): Support CONSTANT. + (pragma_getc, pragma_ungetc): Bring back. + (read_line_number): Change in_system_header directly. + (handle_generic_pragma, handle_cp_pragma, yyerror): Move up in file. + (parse_float): Update to C version. + (yylex): Handle '$' under the letter case. + Remove looking_for_typename handling. + Support hex floating point constants. + Follow C's lead for choosing type of integer constants. + Rearrange stuff to match C frontend. + (yyungetc, reinit_parse_for_block, yylex): Support indent_level. + * spew.c (yylex): Clear looking_for_typename if we see a TYPESPEC. + +1999-07-23 Mark Mitchell + + * call.c (reference_binding): Tweak. + (mayble_handle_implicit_object): Use direct_reference_binding to + create the right implicit conversion sequence. + +1999-07-22 Mark Mitchell + + * pt.c (convert_nontype_argument): Don't call decl_constant_value + if we're converting to a reference type. + + * call.c (NEED_TEMPORARY_P): New macro. + (standard_conversion): Set it, for derived-to-base conversions. + (reference_related_p): New function. + (reference_compatible_p): Likewise. + (convert_class_to_reference): Likewise. + (direct_reference_binding): Likewise. + (reference_binding): Rework for standards-compliance. + (convert_like): Adjust accordingly. + (maybe_handle_ref_bind): Simplify; the right conversion sequences + are now built up in reference_binding. + (initialize_reference): New function. + * cp-tree.h (ICS_USER_FLAG): Document. + (ICS_THIS_FLAG): Likewise. + (ICS_BAD_FLAG): Likewise. + (NEED_TEMPORARY_P): Likewise. + (cp_lvalue_kind): New type. + (real_lvalue_p): Return it. + * error.c (dump_expr): Provide more accurate representation for + AGGR_INIT_EXPRs. + * init.c (expand_default_init): Do not try to perform implicit + conversions for a brace-enclosed initializer. + * search.c (lookup_conversions): Document. + * tree.c (lvalue_p_1): Return a cp_lvalue_kind. Calculate + appropriately. + (real_lvalue_p): Adjust accordingly. + (lvalue_p): Likewise. + (build_cplus_new): Don't allow the creation of an abstract class. + * typeck.c (convert_for_initialization): Use initialize_reference. + +1999-07-21 Gavin Romig-Koch + + * lex.c (real_yylex) : Correct the test for overflow when lexing + integer literals. + +1999-07-20 Jason Merrill + + * decl.c (warn_extern_redeclared_static): Check DECL_ARTIFICIAL, + not DECL_BUILT_IN, to determine if a function is internally declared. + (duplicate_decls): Likewise. Improve handling of builtins. + (push_overloaded_decl): Remove special handling of builtins. + + * cp-tree.h (ANON_AGGR_TYPE_P): Use CLASS_TYPE_P. + + * decl.c (grokdeclarator): Pull out decl_constant_value in + templates, too. + + * class.c (finish_struct, finish_struct_1): Remove 'warn_anon' parm. + * cp-tree.h, pt.c, semantics.c: Adjust. + * method.c (largest_union_member): Remove. + + * lang-specs.h (c++-cpp-output): Pass -fpreprocessed. + + * lex.c (token_getch, token_put_back): New fns. + (real_yylex): Use them. + + * lex.c (lang_init): Generalize. + (lang_init_options): Tell cpplib this is C++. + (nextchar): Remove. Replace uses with put_back. + (skip_white_space): Handle linemode here. Optimize for cpplib. + (extend_token_buffer_to): New fn. + (extend_token_buffer): Use it. + (read_line_number, check_newline): Just deal with tokens. + (real_yylex): More cpplib optimizations. Simplify. Don't produce + EXTERN_LANG_STRING, LEFT_RIGHT or PAREN_STAR_PAREN here. + * spew.c (yylex): Produce LEFT_RIGHT and EXTERN_LANG_STRING. + * parse.y (PAREN_STAR_PAREN): Remove. + * input.c: Don't use the putback machinery with cpplib. + (sub_getch): Fold back into getch. + (getch): Don't handle linemode here. + (feed_input): Unget any text in the token buffer. + + * lex.c (set_typedecl_interface_info, set_vardecl_interface_info, + nextyychar, nextyylval): Remove. + +1999-07-20 Michael Tiemann + Jason Merrill + + * lex.c (indent_level): New variable. + (init_parse): Set cpp_token to CPP_DIRECTIVE. + (consume_string): Make this smart about USE_CPPLIB. + (yyungetc): Use put_back function. + (pragma_getc, pragma_ungetc): Functions deleted. + (check_newline): Rewrite to be intelligent about USE_CPPLIB. + Also, call HANDLE_PRAGMA with getch, yyungetc, not pragma_getc and + pragma_ungetc. + (real_yylex): Rewrite to be intelligent about USE_CPPLIB. + Also, clean up cases where we redundantly set token_buffer[0]. + (read_line_number): New fn. + * input.c (feed_input): Use integrated cpplib if USE_CPPLIB. + (end_input): Call cpp_pop_buffer if USE_CPPLIB. + (sub_getch): Conditionalize out code that's not appropriate if + USE_CPPLIB. + (put_back): Rewrite in case USE_CPPLIB is defined. + (input_redirected): Ditto. + +Tue Jul 20 11:24:19 1999 Bernd Schmidt + + * cp-tree.h: Delete lots of declarations of tree nodes; replaced by + c_global_trees and accessor macros defined in c-common.h. + (cp_tree_index): New enumeration. + (cp_global_trees): Declare new array. Add accessor macros for it, and + delete declarations of tree nodes replaced by it. + (builtin_function): Delete macro, add declaration for new function. + Include c-common.h. + * decl.c: Delete definitions for tree nodes that were replaced by + cp_global_trees and c_global_trees. + (init_decl_processing): Call c_common_nodes_and_builtins; delete code + to generate the common builtins here. + (builtin_function): New function. + * decl2.c (abort_fndecl): Delete declaration. + * except.c (expand_builtin_return_address): Delete declaration. + (builtin_return_address_fndecl): Delete variable. + (const_ptr_type_node): Delete declaration. + * lex.c (cons_up_default_function): Delete declaration of + void_list_node. + * parse.y (void_list_node): Delete declaration. + * rtti.c (type_info_type_node, tinfo_fn_id, tinfo_fn_type): + Delete variables. + (const_string_type_node): Delete declaration. + * search.c (abort_fndecl): Delete declaration. + * Makefile.in: Update dependencies. + +1999-07-19 Mark Mitchell + + * pt.c (check_default_tmpl_args): Move test for missing default + arguments here, from ... + (end_template_parm_list): Here. + +1999-07-18 Mark Mitchell + + * decl.c (lookup_nested_type): Remove. + (pushtag): Don't call it. + +Sat Jul 17 23:51:30 1999 Jeffrey A Law (law@cygnus.com) + + * Makefile.in (INTERFACE): Bump to 2. + +1999-07-17 Alexandre Oliva + + * typeck2.c (my_friendly_abort): Updated URL with bug reporting + instructions to gcc.gnu.org. Removed e-mail address. + +1999-07-17 Mark Mitchell + + * pt.c (determine_specialization): Tighten error-checking. + (end_template_parm_list): Likewise. + +1999-07-14 Mark Mitchell + + * pt.c (check_default_tmpl_args): Handle friends defined in the + class just like member functions defined in the class. + +1999-07-09 Michael Tiemann + Jason Merrill + + * cp-tree.h (struct lang_decl): Added field for storing sorted + FIELD_DECLs (used in TYPE_DECLs). + (DECL_PENDING_INLINE_INFO): Adjusted to use 'u' union. + (DECL_SORTED_FIELDS): New macro. + * class.c (method_name_cmp): New function. + (finish_struct_methods): Modified to support sorting and searching + methods. + (finish_struct_anon): Changed code in inner loop to use ELT rather + than UELT (which required an extra indirection for every reference). + (field_decl_cmp): New function to support sorting FIELD_DECLs. + (finish_struct_1): Sort fields. + * search.c (lookup_field_1): Use DECL_SORTED_FIELDS if we have them. + (lookup_fnfields_1): Search sorted methods in METHOD_VEC. + Also, switch to using array indexing rather than a changing pointer. + * ptree.c (print_lang_decl): Handle TYPE_DECLs that have + DECL_SORTED_FIELDS. + +1999-07-09 Jason Merrill + + * decl2.c (reparse_absdcl_as_casts): Don't warn about old-style + casts in system headers or extern "C" blocks. + + * pt.c (do_decl_instantiation): Downgrade duplicate instantiation + errors to pedwarn. + +1999-07-09 Michael Tiemann + + * decl2.c (write_virtuals): Deleted declaration. + * cp-tree.h (write_virtuals): Deleted extern declaration. + * class.c (finish_struct_1): Removed #if 0'd code that mentions + write_virtuals. + * semantics.c (begin_class_definition): Rewrite code to not depend + on write_virtuals. + + * lex.c (cp_pragma_interface): New function. + (cp_pragma_implementation): Likewise. + (handle_cp_pragma): Call them. + + * typeck.c (comptypes): Simplify C code in look_hard. + + * xref.c (PALLOC): Use xcalloc, not calloc. + (SALLOC): Use xmalloc, not malloc. + + * rtti.c (synthesize_tinfo_fn): Add missing call to pop_momentary. + + * search.c (note_debug_info_needed): Don't search if WRITE_SYMBOLS + is NO_DEBUG. + + * decl.c (duplicate_decls): If a redeclaration doesn't match the + initial declaration, then don't save the inline info and by all + means don't mark the function as a builtin function. + + * decl.c (lookup_name_real): Set NONCLASS to 1 if + CURRENT_CLASS_TYPE is 0. + + * class.c (duplicate_tag_error): Set TYPE_NONCOPIED_PARTS to + NULL_TREE. + + * ptree.c (print_lang_type): Added vtable-needs-writing. + +Wed Jul 7 01:26:47 1999 Alexandre Oliva + + * decl2.c (mark_vtable_entries): Fix check for rtti offset. + +1999-07-06 Gavin Romig-Koch + + * typeck.c (unsigned_type,signed_type,signed_or_unsigned_type) : + Merged into c-common. + +1999-07-05 Dave Brolley + + * lex.c (errorcount): Declare it. + (finish_parse): Update errorcount for when using CPPLIB. + +1999-07-05 Mark Mitchell + + * cp-tree.h (IS_AGGR_TYPE): Include instantiated template template + parameters. + (IMPLICIT_TYPENAME_TYPE_DECL_P): New macro. + * decl.c (push_class_binding): Use it. + (lookup_name_real): Likewise. + +1999-07-02 Gavin Romig-Koch + + * cp-tree.h (widest_integer_literal_type_node, + widest_unsigned_literal_type) : New. + * decl.c (widest_integer_literal_type_node, + widest_unsigned_literal_type) : New. + (init_decl_processing): Handle/use the two new types. + * lex.c (real_yylex): Same. + * typeck.c (unsigned_type,signed_type,signed_or_unsigned_type) : + Same. + +1999-07-01 Mark Mitchell + + * decl.c (grokdeclarator): Don't give names "for linkage purposes" + to anonymous cv-qualified types. + +1999-07-01 Gavin Romig-Koch + + * lex.c (real_yylex) : Change integer literal overflow handling to + be like c-lex.c. + + * lex.c (real_yylex): Improve 'integer constant out of range' messages. + +1999-06-28 Richard Henderson + + * decl.c (cp_finish_decl): Fix typo in cp_warning_at call. + +1999-06-28 Jason Merrill + + * error.c (dump_type_real): Handle TREE_LIST again. + + * typeck.c (comp_target_parms): Don't complain about + converting from () to (...) if !flag_strict_prototype. + + * decl.c (grokdeclarator): Update the names of all variants when + de-anonymizing. + +1999-06-21 Mark Mitchell + + * init.c (expand_aggr_vbase_init): Rename to + construct_virtual_bases. Conditionalize construction here, + rather than ... + (emit_base_init): Here. + +1999-06-19 Mark Mitchell + + * semantics.c (finish_asm_stmt): Apply decay conversions to + input operands. + + * decl.c (expand_static_init): When building an anonymous function + for use with atexit, compute its body before and after entering + the function. + + * error.c (dump_expr): Handle BIND_EXPR, LOOP_EXPR, and + EXIT_EXPR. + +1999-06-18 Mark Mitchell + + * init.c (expand_aggr_vbase_init): Add flag parameter. + (build_partial_cleanup_for): Remove, inlining into .. + (expand_cleanup_for_base): ... here. Take flag parameter. + (emit_base_init): Pass the in_chrg parameter to + emit_aggr_vbase_init. + (emit_aggr_vbase_init): Pass it to expand_cleanup_for_base. + +1999-06-16 Mark Mitchell + + * decl2.c (import_export_decl): Use same_type_p, rather than + relying on pointer-equality for types. + + * method.c (do_build_copy_constructor): Simplify. + + * call.c (build_method_call): Remove bogus code for two-argument + delete. + * init.c (build_new_1): Expand on comment, and remove dead code. + + * init.c (expand_cleanup_for_base): New function, split out + from ... + (emit_base_init): Here. + (expand_aggr_vbase_init): Use it. + +1999-06-15 Mark Mitchell + + * cp-tree.h (class_cache_firstobj): Declare. + (maybe_push_cache_obstack): Rename to push_cache_obstack. + * class.c (permanent_obstack): Remove declaration. + (class_cache_firstobj): Make it global. + (add_method): Don't use permanent_obstack directly. + (pushclass): Only free the class_cache_obstack if we know how far + back to free it. + (maybe_push_cache_obstack): Rename to push_cache_obstack. + * decl.c: Remove dead comment. + (saved_scope): Add class_cache_firstobj. + (push_to_top_level): Save it. + (pop_from_top_level): Restore it. + (push_class_level_binding): Use push_cache_obstack, not + maybe_push_cache_obstack. + * search.c (push_class_decls): Likewise. + +1999-06-14 Martin von Löwis + + * pt.c (tsubst_friend_function): Push into namespace of friend + function before pushdecl'ing it. + +1999-06-14 Nathan Sidwell + + * call.c (build_new_op): Remove REF_BIND from all operands. + +1999-06-13 Alexandre Oliva + + * init.c (build_new_1): Look up operator delete even if there was + no explicit new placement. + +1999-06-08 Nathan Sidwell + + * except.c (complete_ptr_ref_or_void_ptr_p): New function, broken out + of ... + (build_throw): ... here. Call it. + (process_start_catch_block): Call it. + +1999-06-07 Mark Mitchell + + * search.c (convert_pointer_to_single_level): Reimplement without + using get_binfo. + +1999-06-06 Mark Mitchell + + * method.c (is_back_referenceable_type): Back-reference bools when + not squangling. + +1999-06-07 Dave Brolley + + * lex.c (real_yylex): Replace unused bytes from bad multibyte char. + * input.c (putback_buffer): New structure type. + (putback): Replaces putback_char member. + (putback): Replaces putback_char static variable. + (feed_input): Use putback. + (end_input): Use putback. + (sub_getch): Use putback. + (put_back): Use putback. + +1999-06-05 Mark Mitchell + + * decl.c (grokdeclarator): Fix typo in last change. + +1999-06-04 Jason Merrill + + * semantics.c (finish_if_stmt_cond): Copy cond to permanent_obstack. + (finish_while_stmt_cond, finish_do_stmt, finish_for_cond): Likewise. + +1999-06-04 Nathan Sidwell + + * except.c (build_throw): Check throw expression validity. + +1999-06-03 Mark Mitchell + + * decl.c (grokdeclarator): Don't treat arbitrary types as unsigned + just because flag_signed_bitfields is false. + +1999-06-03 Nathan Sidwell + + * semantics.c (begin_class_definition): Update the struct's + location here ... + * class.c (finish_struct): ... rather than here. + + * decl.c (make_typename_type): Don't rely on uninitialized + variable. + +1999-05-31 Kaveh R. Ghazi + + * Makefile.in (ALL_CFLAGS): Add '-W -Wall'. + +1999-05-31 Mark Mitchell + + * tree.c (build_cplus_array_type_1): Use push_obstacks_nochange + and friends rather than messing with current_obstack directly. + (cp_build_qualified_type_real): Rework ARRAY_TYPE + allocation to match practice throughout the rest of the + compiler. + +1999-05-30 Mark Mitchell + + * lex.c (make_lang_type): Create TYPE_BINFO for + TEMPLATE_TYPE_PARMs just like for non-template types. + + * decl.c (start_decl): Move checks on initialization to ... + (cp_finish_decl): Here. Tidy formatting slightly. + +1999-05-28 Mark Mitchell + + * decl.c (add_binding): Don't complain about a redeclaration of a + semantically identical typedef in a local scope. + +1999-05-28 Nathan Sidwell + + * decl.c (complete_array_type): Allocate off same obstack. Fix + DO_DEFAULT comment to match reality. + + * friend.c (make_friend_class): Fix diagnostic typo. + +1999-05-28 Mark Mitchell + + * decl.c (lookup_namespace_name): Handle getting a + TEMPLATE_ID_EXPR. + (expand_static_init): Don't call pushdecl for implicitly declared + `atexit' used to register destructors. + +1999-05-25 Mark Mitchell + + * class.c (finish_vtbls): Copy BINFO_VIRTUALs before using it to + initialize a vtable. + + * cp-tree.h (NAMESPACE_LEVEL): Reformat. + (lang_decl_flags): Document MEMFUNC_POINTER_TO. Save four bytes + by combining TEMPLATE_INFO and LEVEL into a single union. + (DECL_TEMPLATE_INFO): Reformat. + (DECL_SAVED_TREE): Document. + (DECL_TEMPLATE_INJECT): Remove. + * class.c (finish_struct): Remove code to deal with + DECL_TEMPLATE_INJECT. + + * decl.c (maybe_process_template_type_declaration): Handle all new + types in templates uniformly. + * method.c (bulid_overload_identifier): Use CP_DECL_CONTEXT, not + DECL_CONTEXT. + * pt.c (lookup_template_class): Inject template instantiations of + forward-declarations. + (instantiate_class_template): Remove code processing + DECL_TEMPLATE_INJECT. + + * pt.c (lookup_template_class): Tweak lookup to find member + templates. + + * pt.c (tsubst_expr, case ASM_STMT): Don't tsubst into + ASM_CV_QUAL. + * semantics.c (finish_asm_stmt): Make strings permanent if they're + used in a template. + +1999-05-25 Jason Merrill + + * typeck.c (casts_away_constness, casts_away_constness_r): Strip both + parts of pointer to data member types. + +1999-05-24 Mark Mitchell + + * decl2.c (mark_vtable_entries): Don't make a copy of a function, + and then make it look like `abort'. Just use `abort' instead. + + * typeck.c (build_static_cast): Don't allow static_casts that cast + away constness. + (casts_away_constness_r): New function. + (casts_away_constness): Likewise. + + * decl.c (lookup_tag): Remove code no longer needed after + name-lookup improvements. + * decl2.c (handle_class_head): Make error-recovery more robust. + * friend.c (make_friend_class): Reject templated typename types. + * lex.c (is_global): A template parameter isn't global. + * parse.y (class_head): Robustify. + * parse.c: Regenerated. + +1999-05-22 Mark Mitchell + + * pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs, + INDIRECT_REFs, and COMPONENT_REFs. Handle FIELD_DECLs. + + * cp-tree.h (push_nested_namespace): Declare. + (pop_nested_namespace): Likewise. + * decl.c (push_nested_namespace): New function. + (pop_nested_namespace): Likewise. + * pt.c (instantiate_class_template): Use them. + + * tree.c (mapcar): Handle NON_LVALUE_EXPR. + + * cp-tree.h (cplus_expand_constant): Declare. + * cvt.c (convert_to_pointer): Expand PTRMEM_CSTs when they're + converted from one pointer-to-object type to another. + * expr.c (cplus_expand_constant): Don't make it static. + * typeck.c (build_component_ref): Don't crash when presented with + a component which is a TEMPLATE_DECL. + (build_ptrmemfunc): Tidy. Clarify comment. Make sure that even a + cast from a pointer-to-member constant to its own type does not + result in a valid non-type template argument. + +1999-05-21 Mark Mitchell + Nathan Sidwell + + * Make-lang.in (cc1plus): Make it depend on gxx.gperf. + * cp-tree.h: Fix typo in documentation on pointers-to-members. + (cp_build_qualified_type): Make it a macro. + (cp_build_qualified_type_real): Declare. + * decl.c (grokdeclarator): Remove misleading comment. Avoid + problem with template parameters and restrict-qualification. + * gxx.gperf: Replace NORID with RID_UNUSED throughout. + * hash.h: Regenerated. + * lex.h (rid): Move RID_FIRST_MODIFIER and RID_LAST_MODIFIER into + the enumeration. + (NORID): Remove definition. + * pt.c (tsubst_aggr_type): Use cp_build_qualified_type_real. + (tsubst): Likewise. Remove special handling for FUNCTION_TYPEs. + (fn_type_unification): Check that the function type resulting from + the deduction is legal. + (check_cv_quals_for_unify): Don't handle FUNCTION_TYPEs specially. + (unify): Use cp_build_qualified_type_real. + * tree.c (build_cplus_array_type_1): Handle error_marks as inputs. + (cp_build_qualified_type): Rename to ... + (cp_build_qualified_type_real): Add additional COMPLAIN parameter + and modify appropriately. + + * typeck.c (build_ptrmemfunc): Handle PTRMEM_CSTs carefully to + reveal optimization opportunities. + + * pt.c (tsubst): Don't issue error messages when we're not + complaining, even if we see a qualified function type. + (check_cv_quals_for_unify): Don't allow a qualified function + type. + +1999-05-20 Jason Merrill + + * class.c (instantiate_type): Downgrade errors for object-dependent + memfn refs to pedwarn. + +1999-05-20 Mark Mitchell + + * decl.c (grokdeclarator): Don't treat [] as indicating a + zero-sized array in a typedef. + + * call.c (build_object_call): Don't look at DECL_NAME for a type. + (pt.c): Or CP_TYPE_QUALS for an ERROR_MARK. + (typeck.c): Or TYPE_MAIN_VARIANT for a type. + + * pt.c (for_each_template_parm): Rework to match documentation. + Don't be fooled by a COMPONENT_REF with no TREE_TYPE. + +1999-05-20 Jason Merrill + + * class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P. + + * class.c (finish_base_struct): Allow non-COM bases for COM classes + except at the leftmost position. + (modify_one_vtable, fixup_vtable_deltas1, override_one_vtable): + Pass the binfo's class, not the most derived, to skip_rtti_stuff. + * search.c (get_abstract_virtuals, expand_upcast_fixups): Likewise. + + * tree.c (lvalue_p_1): A NOP_EXPR can be an lvalue. + (build_cplus_new): Make sure that what we return is of the right type. + +1999-05-20 Mark Mitchell + + * cp-tree.h (make_ptrmem_cst): New function. + * expr.c (cplus_expand_constant): Split out from ... + (cplus_expand_expr): Here. Use cplus_expand_constant. + (init_cplus_expand): Set lang_expand_constant. + * pt.c (convert_nontype_argument): Use make_ptrmem_cst. + + * tree.c (make_ptrmem_cst): Define. + * typeck.c (unary_complex_lvalue): Use make_ptrmem_cst. + * typeck2.c (initializer_constant_valid_p): Use make_ptrmem_cst. + +1999-05-19 Mark Mitchell + + * pt.c (build_template_decl): Copy DECL_NONCONVERTING_P. + + * decl2.c (start_static_storage_duration_function): Fix comment. + (finish_file): Create static storage duration functions lazily. + +1999-05-19 Jason Merrill + + Implement anonymous structs. + * cp-tree.h (ANON_AGGR_TYPE_P): Rename from ANON_UNION_TYPE_P. + * class.c, decl.c, decl2.c, init.c, pt.c, search.c, typeck.c: Adjust. + * class.c (finish_struct_1): Remove redundant check for anon struct. + * decl.c (fixup_anonymous_aggr): Renamed from fixup_anonymous_union. + (check_tag_decl): Check for anonymous struct here. + * decl2.c (build_anon_union_vars): Catch anon struct at file scope. + * init.c (sort_member_init, emit_base_init): Handle getting fields + as well as names in current_member_init_list. + (perform_member_init): Handle getting an anon aggr. + * method.c (do_build_assign_ref): Don't descend into anon aggrs. + (do_build_copy_constructor): Likewise. + +1999-05-19 Mark Mitchell + + * tree.c (cp_build_qualified_type): Don't allow qualified function + types. + +Wed May 19 02:50:53 1999 Arvind Sankar + + * gxxint.texi: Fix typo. + +1999-05-19 Jason Merrill + + * call.c (find_scoped_type, resolve_scope_to_name): Lose. + * class.c (finish_struct_1): Use CLASS_TYPE_P. + * ptree.c (print_lang_type): Likewise. + * typeck.c (build_modify_expr, c_expand_asm_operands): Use + IS_AGGR_TYPE_CODE. + * typeck2.c (digest_init): Likewise. + +1999-05-18 Jason Merrill + + * call.c (joust): Compare the types of the conv ops, not the + target types of the conversions. + +Tue May 18 00:21:34 1999 Zack Weinberg + + * lang-specs.h: Define __GNUC__ and __GNUC_MINOR__ only if -no-gcc + was not given. + +1999-05-17 Mark Mitchell + + * cp-tree.def (TEMPLATE_ID_EXPR): Update documentation. + * decl.c (grokfndecl): Don't allow inline declarations of friend + template specializations, or friend template specializations with + default arguments. + * pt.c (tsubst): Handle substitution into array types that does + not yield a fixed upper bound, even when not processing a + template. + (tsubst_copy): Deal with the fact that the second operand to a + TEMPLATE_ID_EXPR may be NULL_TREE, a TREE_LIST, or a TREE_VEC. + * search.c (marked_pushdecls_p): Don't descend into + TEMPLATE_TYPE_PARMs and the like. + (unmarked_pushdecls_p): Likewise. + + * call.c (build_over_call): Don't throw away + initializations/copies of empty classes; use MODIFY_EXPR and + INIT_EXPR as for non-empty classes. + * class.c (finish_struct_1): Put the padding byte for an empty + class on the TYPE_NONCOPIED_PARTS list for the class. + +1999-05-16 Mark Mitchell + + * decl2.c (build_expr_from_tree): Handle COMPONENT_REFs that + indicate a reference to a field that is a qualified name. + +1999-05-16 Jason Merrill + + * decl2.c (finish_objects): Don't use .?tors.* if we don't have + ASM_OUTPUT_CONSTRUCTOR. + + * friend.c (do_friend): Add attrlist arg. Remove support for + getting a non-decl as 'decl'. + * decl.c (grokfndecl): Remove attrlist arg. Don't set attrs or + rtl. + (grokdeclarator): Adjust. + * cp-tree.h: Adjust. + +1999-05-16 Mark Mitchell + + * cp-tree.h (permanent_p): New function. + * init.c (build_new_1): Use mapcar, not copy_node, to copy a + possibly complex tree node. + * tree.c (mapcar): Adjust comments, and follow coding standards in + conditional. + (permanent_p): New function. + +1999-05-13 Per Bothner + + * class.c (push_lang_context): Turn off DECL_IGNORED_P for + primitive Java types, if we actually see `extern "Java"'. + +1999-05-10 18:21 -0400 Zack Weinberg + + * lang-specs.h: Pass -$ to the preprocessor. + +1999-05-10 Jason Merrill + + * init.c (build_offset_ref): Wrap baselinks in OFFSET_REF, too. + Don't bother wrapping an OFFSET_TYPE around unknown_type_node. + (resolve_offset_ref): Don't handle a raw baselink. + * cvt.c (build_expr_type_conversion): Likewise. + * typeck.c (decay_conversion, build_c_cast, convert_for_assignment, + convert_for_initialization): Likewise. + * class.c (instantiate_type): Handle seeing a baselink under an + OFFSET_REF. + * error.c (dump_expr): Likewise. + * pt.c (for_each_template_parm): Likewise. + (resolve_overloaded_unification): Likewise. + * tree.c (is_overloaded_fn, really_overloaded_fn): Likewise. + * typeck.c (expr_sizeof): Also complain about other permutations + of overloaded functions. + +1999-05-07 Jason Merrill + + * init.c (resolve_offset_ref): Don't return a raw method. + Use BASELINK_P. + * typeck.c (decay_conversion): Don't handle a raw method. + Resolve all OFFSET_REFs. + (get_member_function_from_ptrfunc): 0 is a valid vtable index. + (build_binary_op_nodefault): Handle resolving overloaded fns. Use + same_type_p for pmf bits. Don't use build_binary_op to compare + raw pointers to methods. + (convert_for_assignment): Check for OFFSET_REF, not OFFSET_TYPE, + to decide when to call resolve_offset_ref. + (build_c_cast, convert_for_initialization): Likewise. + * cvt.c (build_expr_type_conversion): Likewise. + +1999-05-06 Nathan Sidwell + + * call.c (build_new_method_call): Use TYPE_MAIN_VARIANT of class. + +1999-05-05 Mark Mitchell + + * decl2.c (start_objects): Don't let static constructors and + destructors get inlined. + + * parse.y (nested_name_specifier): Make sure ordinary types are + complete, just like template types. + * parse.c: Regenerated. + + * pt.c (check_explicit_specialization): Improve error messages. + +1999-05-04 Martin von Löwis + + * typeck.c (string_conv_p): Use same_type_p to check whether we + try to convert between char and wchar_t. + +1999-05-03 Mark Mitchell + + * search.c (lookup_field_r): Set the TREE_TYPE of an ambiguous + lookup to error_mark_node here. + (lookup_member): Revise documentation. Add comments. Don't set + the TREE_TYPE to error_mark_node here, and don't build up an extra + TREE_LIST for ambiguous lookups. + (setup_class_bindings): Adjust accordingly. + (push_class_decls): Revise out-of-date comments. + + * typeck.c (build_const_cast): Tighten checks for legality. + +1999-05-02 Martin von Löwis + + * init.c (build_member_call): Lookup names coming from + namespace-scoped LOOKUP_EXPR. + +1999-05-03 Jim Blandy + + * gxxint.texi: Add documentation for 'I'. + +1999-05-02 Martin von Löwis + + * tinfo.cc (operator==): Qualify type_info with std::. + +1999-05-02 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Remove comdat. Updated dummy. + (DECL_COMDAT): Remove definition. + +1999-05-01 Mark Mitchell + + * decl.c (wrapup_globals_for_namespace): Fix thinko in previous + change. + +1999-04-30 Mark Mitchell + + * class.c (build_vtable): Use build_lang_decl when building + vtables, not just build_decl. + (prepare_fresh_vtable): Likewise. + * decl.c (wrapup_globals_for_namespace): Mark vtables as + DECL_EXTERNAL when calling wrapup_global_declarations. + * decl2.c (priority_info_s): Add initializations_p and + destructions_p members. + (finish_vtable_vardecl): Use TREE_SYMBOL_REFERENCED, not TREE_USED, + when deciding what vtables to write out. + (ssdf_decls): New variable. + (ssdf_decls_used): Likewise. + (start_static_storage_duration_function): Deal with being called + multiple times. Avoid inlining this function. + (generate_inits_for_priority): Deal with reuse of priority map. + (get_priority_info): Clear initializations_p and destructions_p. + (do_static_initialization): Tweak comment. + (do_static_destruction): Likewise. Fix condition on sentries for + destruction. + (generate_ctor_or_dtor_function): Call all of the static storage + duration functions. + (generate_ctor_or_dtor_function_for_priority): Check + initializations_p and destructions_p to see what priorities need + initialization functions. + (finish_file): Rework to generate multiple static storage duration + functions, rather than just one. + + * typeck.c (build_const_cast): Tweak last change to handle + templates correctly. + + * typeck.c (build_const_cast): Disallow use of const_cast to + anything but a pointer or reference type. + +1999-04-30 Nathan Sidwell + + * decl.c (cp_finish_decl): Don't permit arrays of abstract or + signature type. + +1999-04-29 Mark Mitchell + + * decl2.c (do_static_destruction): Remove obsolete FIXME comment. + (finish_file): Indent comments properly. + +1999-04-29 Richard Henderson + + * decl2.c (do_static_initialization): Call do_pending_stack_adjust. + (do_static_destruction): Likewise. + +1999-04-29 Nathan Sidwell + + * cp-tree.h (TYPE_NOTHROW_P): New macro. + * decl2.c (delete_sanity): Warn on deleting void *. + * init.c (build_new_1): Use TYPE_NOTHROW_P. + * typeck.c (c_expand_return): cp_pedwarn on returning NULL from + throwing operator new. + +1999-04-28 Nathan Sidwell + + * cp-tree.h (build_component_addr): Remove prototype. + * typeck.c (build_component_addr): Make static. Remove MSG + argument. + (build_component_addr): Remove MSG parameter, clean up + comment. + (build_x_function_call): Use cp_error. + (build_unary_op): Adjust call of build_component_addr. + +1999-04-28 Mark Mitchell + + * pt.c (tsubst_friend_class): Check for NULL. + +Wed Apr 28 11:42:22 1999 Andreas Schwab + + * search.c (binfo_for_vtable): Initialize bfvi.var. + +1999-04-27 Nathan Sidwell + + * rtti.c (build_x_typeid): Check rtti is enabled. + +1999-04-26 Mark Mitchell + + * search.c (is_subobject_of_p): Make sure we're looking at the + right baseclasses. + +1999-04-26 Marc Espie + + * Make-lang.in (cplib2.ready): Don't depend on phony targets. + +1999-04-23 Mark Mitchell + + * decl2.c (finish_file): Tweak handling of extern inlines so that + they are not unnecessarily put out. + + * search.c (is_subobject_of_p): Handle TEMPLATE_TYPE_PARMs and + such as base classes. + +1999-04-22 Brendan Kehoe + + * tree.c (build_exception_variant): Fix typo: use the chain of U, + not trying V, while cycling through U. + +1999-04-22 Mark Mitchell + + * cp-tree.h (lang_decl_flags): Remove returns_first_arg and + preserves_first_arg. Enlarge dummy accordingly. + (DECL_TINFO_FN_P): New macro. + (SET_DECL_TINFO_FN_P): Likeiwse. + (DECL_RETURNS_FIRST_ARG): Remove. + (DECL_PRESERVES_THIS): Likewise. + (DECL_INIT_PRIORITY): New macro. + (finish_struct_1): Change prototype. + (cat_namespace_levels): Remove prototype. + (vtable_decl_p): New prototype. + (vtype_decl_p): Likewise. + (sigtable_decl_p): Likewise. + (walk_globals_pred): New typedef. + (walk_globals_fn): Likewise. + (walk_globals): New prototype. + (walk_namespaces_fn): New typedef. + (walk_namespaces): New prototype. + (wrapup_globals_for_namespace): Likewise. + (walk_vtables): Remove prototype. + (walk_sigtables): Likewise. + (instantiate_pending_templates): New prototype. + * class.c (finish_struct_1): Don't return a value. + * decl.h (pending_statics): Remove declaration. + * decl.c (walk_namespaces_r): New function. + (walk_globals_r): Likewise. + (vtable_decl_p): Likewise. + (vtype_decl_p): Likewise. + (sigtable_decl_p): Likewise. + (walk_namespaces): Likewise. + (walk_globals_data): New type. + (walk_globals): New function. + (wrapup_globals_for_namespace): Likewise. + (expand_static_init): Remove assertion. Remove redundancy in + conditional. Don't put static data members in static_aggregates + Tidy. + (finish_function): Remove redundancy in conditional. Don't set + DECL_RETURNS_FIRST_ARG. + (cat_namespace_levels): Remove. + * decl2.c: Include splay-tree.h and varray.h. + (priority_info_s): New structure. + (finish_vtable_vardecl): Change prototype. Adjust for new calling + conventions. + (prune_vtable_vardecl): Likewise. + (finish_sigtable_vardecl): Likewise. + (setup_initp): Remove. + (do_dtors): Remove. + (do_ctors): Remove. + (start_static_storage_duration_function): New function. + (generate_inits_for_priority): Likewise. + (finish_static_storage_duration_function): Likewise. + (get_priority_info): Likewise. + (do_static_initialization): Likewise. + (do_static_destruction): Likewise. + (do_static_initialization_and_destruction): Likewise. + (generate_ctor_or_dtor_function): Likewise. + (generate_ctor_and_dtor_functions_for_priority): Likewise. + (pending_statics): Make it a varray. + (pending_statics_used): New variable. + (saved_inlines): Make it a varray. + (saved_inlines_used): New variable. + (finish_static_data_member): Change method of updating + pending_statics. + (mark_inline_for_output): Remove #if 0'd code. Change method of + updating saved_inlines. + (walk_vtables): Remove. + (walk_sigtables): Likewise. + (import_export_decl): Use DECL_TINFO_FN_P. + (pending_templates): Remove declaration. + (maybe_templates): Likewise. + (static_aggregates_initp): Likewise. + (setup_initp): Likewise. + (finish_objects): Simplify. + (INITIALIZE_P_IDENTIFIER): New macro. + (PRIORITY_IDENTIFIER): New macro. + (SSDF_IDENTIFIER): New macro. + (initialize_p_decl): New variable. + (priority_decl): Likewise. + (ssdf_decl): Likewise. + (priority_info_map): Likewise. + (finish_file): Recode output of static intializers and other + file-scope finalization tasks. + * error.c (OB_END_TEMPLATE_ID): New macro. + (dump_type_real): Use it. + (dump_decl): Likewise. + (dump_function_name): Likewise. + * lex.c (set_typedecl_interface_info): Adjust for new walk_globals + interface. + (check_newline): Use walk_globals, not walk_vtables. + * pt.c (pending_tempalte_expansions): Remove. + (set_vardecl_interface_info): Likewise. + (pending_templates): Make static. + (maybe_templates): Likewise. + (instantiate_class_template): Adjust call to finish_struct_1. + (instantiate_pending_templates): New function. + * rtti.c (get_tinfo_fn): Use SET_DECL_TINFO_FN_P. + * tree.c (static_aggregates_initp): Remove. + (cp_valid_lang_attribute): Don't use it; use DECL_INIT_PRIORITY + instead. + * Makefile.in (decl2.o): Depend on varray.h and splay-tree.h. + + * gxx.gperf (RETURN): Rename to RETURN_KEYWORD to avoid clashes + with the RTL code RETURN. + * hash.h: Regenerated. + * lex.c (reinit_parse_for_block): Use RETURN_KEYWORD. + * parse.y: Replace RETURN with RETURN_KEYWORD throughout. + * parse.c: Regenerated. + * pt.c: Include varray.h. Include rtl.h since varray.h requires + it. + (inline_parm_levels): New variable. + (inline_parm_levels_used): Likewise. + (maybe_begin_member_template_processing): Update them. + (maybe_end_member_template_processing): Use them, rather than + guessing how many levels to pop. + + * decl.c (make_typename_type): Tighten error-checking. + +1999-04-20 Mark Mitchell + + * cp-tree.h (build_binary_op): Remove unneeded parameter. + * class.c (build_vrable_entry_ref): Adjust call to + build_binary_op. + * decl.c (expand_static_init): Likewise. + (grokdeclarator): Likewise. + (finish_function): Likewise. + * decl2.c (delete_sanity): Likewise. + (do_dtors): Likewise. + (do_ctors): Likewise. + * error.c (dump_type_suffix): Likewise. + * expr.c (cplus_expand_expr): Likewise. + * init.c (resolve_offset_ref): Likewise. + (build_new): Likewise. + (build_new_1): Likewise. + (build_vec_delete_1): Likewise. + (expand_vec_init_catch_clause): Likewise. + (build_delete): Likewise. + * pt.c (tsubst): Likewise. + * rtti.c (synthesize_tinfo_fn): Likewise. + * search.c (expand_upcast_fixups): Likewise. + (expand_direct_vtbls_init): Likewise. + * typeck.c (get_member_function_from_ptrfunc): Likewise. + (build_binary_op_nodefault): Likewise. + (point_int_sum): Likewise. + (pointer_diff): Likewise. + (build_unary_op): Likewise. + (build_modify_expr): Likewise. + (get_delta_difference): Likewise. + (build_ptrmemfunc): Likewise. + (expand_ptrmemfunc_cst): Likewise. + +1999-04-20 Jason Merrill + + * decl.c (grokfndecl): Always call cplus_decl_attributes. + * decl2.c (grokfield): Pass attrlist to grokdeclarator. + +1999-04-19 Mark Mitchell + + * cp-tree.h (finish_static_data_member_decl): New function. + * decl2.c (finish_static_data_member_decl): Split out from ... + (grokfield): Here. + * pt.c (instantiate_class_template): Use it here instead of + trying to fake it. + (tsubst_decl): Don't set DECL_ASSEMBLER_NAME; + finish_static_data_member_decl will do that. Explicit set + DECL_EXTERNAL to match non-template processing. + +1999-04-18 Mark Mitchell + + * cp-tree.h (finish_class_definition): Add parameter. + * parse.y (structsp): Use it. Don't call pop_scope here. + * parse.c: Regenerated. + * semantics.c (finish_class_definition): Pop it here. + +1999-04-17 Mark Mitchell + + * decl.c (xref_tag): Revise handling of nested template + declarations. + * pt.c (check_explicit_specialization): Tweak handling of friend + templates in template classes. + (tsubst_friend_class): Handle friend declarations for nested + member template classes. + +1999-04-16 Mark Mitchell + + * class.c (finish_struct): Remove unused variable. + (pushclass): Likewise. + (invalidate_class_lookup_cache): Likewise. + * cp-tree.def (TYPENAME_TYPE): Improve documentation. + * decl.c (build_typename_type): Make sure TYPENAME_TYPE_FULLNAME + doesn't get obliterated. + (make_typename_type): Handle template classes correctly. + + * cp-tree.h (TREE_NONLOCAL_FLAG): Remove. + (storetags): Declare. + * class.c (finish_struct): Don't use TREE_NONLOCAL_FLAG. + (pushclass): Likewise. Use storetags to install tag declarations, + not pushtag. + (invalidate_class_lookup_cache): Don't use TREE_NONLOCAL_FLAG. + * decl.c (storetags): Make it global. + (push_class_binding): Set INHERITED_VALUE_BINDING_P for an + implicit typename declaration. + (pushtag): Tidy. Don't use TREE_NONLOCAL_FLAG. + * method.c (hack_identifier): Likewise. + * search.c (lookup_member): Likewise. + + * decl.c (warn_about_implicit_typename_lookup): New function. + (lookup_name_real): Use it. Rework handling of implicit typename + extension. + +1999-04-15 Mark Mitchell + + * cp-tree.h (lookup_nested_field): Remove. + * class.c (push_nested_class): Handle UNION_TYPEs. + (pop_nested_class): Likewise. + * decl.c (lookup_name_real): Don't call lookup_nested_field. + (start_decl): Use push_nested_class, not just pushclass. + (cp_finish_decl): Use pop_nested_class, not just popclass. + * search.c (lookup_nested_field): Remove. + + * cp-tree.h (lang_type): Add documentation. + * decl2.c (handle_class_head): Create template declarations here, + as appropriate. + * parse.y (class_head): Return whether or not we entered a new + scope, as well as the type named. + (named_class_head): Likewise. + (named_complex_class_head_sans_basetype): Likewise. + (structsp): Adjust accordingly. Pop scope when required. + * parse.c: Regenerated. + * pt.c (check_default_tmpl_args): Robustify. + (redeclare_class_template): Likewise. + (instantiate_class_template): An instantiation of an + anonymous union is itself an anonymous union. + * semantics.c (begin_class_definition): Don't create template + declarations here. + +1999-04-15 Jason Merrill + + * parse.y (after_type_declarator_intern): New nonterminal. + (after_type_declarator): Use it. + (direct_after_type_declarator): Likewise. Move above + nonnested_type to fix reduce/reduce conflict resolution. + (declmods): Reducing from just 'attributes' has EMPTY precedence. + * Makefile.in (CONFLICTS): Update. + + * decl.c (define_label): Downgrade error for jumping over a + non-POD decl to pedwarn. + +1999-04-14 Mark Mitchell + + * cp-tree.h (popclass): Change declaration. + (pop_nested_class): Likewise. + (poplevel_class): Remove declaration. + * call.c (convert_default_argument): Pass no arguments to + popclass. + * class.c (finish_struct_1): Likewise. + (finish_struct): Likewise. + (popclass): Remove argument. Simplify code accordingly. + (pop_nested_class): Likewise. + * decl.c (poplevel_class): Declare it here, and make it static. + (poplevel): Handle class scopes. + (poplevel_class): Don't take an rgument. Simplify. + (pop_everything): Pass no arguments to pop_nested_class. + (cp_finish_decl): Pass no arguments to popclass. + (grokdeclarator): Pass no arguments to pop_nested_class. + (finish_function): Likewise. + * decl2.c (grokfield): Likewise. + (pop_scope): Pass no arguments to popclass. + * lex.c (do_pending_defargs): Pass no arguments to pop_nested_class. + * pt.c (instantiate_class_template): Move call to pushclass, and + document. Pass no arguments to popclass. + (regenerate_decl_from_template): Likewise. + +1999-04-14 Jason Merrill + + * typeck.c (build_unary_op): Handle taking the address of a unique + bound non-static member function. + +1999-04-13 Martin von Löwis + + * lang-options.h (-Wdeprecated): New flag. + * decl2.c (warn_deprecated): New flag. + (lang_decode_option): Deprecated this-is-variable, + external-templates, alt-external-templates. + Support -Wdeprecated. + * errfn.c (cp_deprecated): New function. + +1999-04-13 Jason Merrill + + * decl2.c (setup_initp): Compare DECL_ASSEMBLER_NAME instead + of the decls themselves. + + * pt.c (tsubst_function_type): Copy attributes over. + + * tree.c (cp_valid_lang_attribute): New fn. Handle init_priority + and com_interface. + * cp-tree.h: Add prototype. + * decl.c (init_decl_processing): Set valid_lang_attribute. + +1999-04-13 Mark Mitchell + + * class.c (finish_struct_1): Look at the const-ness of the field's + type, not the TREE_READONLY-ness of the declaration. + * method.c (synthesize_method): Likewise. + * pt.c (tsubst_decl): Call c_apply_type_quals_to_decl when + creating new declarations. + +1999-04-13 Mike Stump + + * decl2.c (import_export_decl): Because vtables always reference + virtual functions, even if they are inlined, don't allow + -fno-implement-inlines to not emit them, instead, emit them with + the vtable. + * decl.c (start_function): Likewise. + +1999-04-12 Jason Merrill + + * cp-tree.h (struct lang_type): Add com_interface. + (CLASSTYPE_COM_INTERFACE): New macro. + * class.c (set_rtti_entry): COM interface classes have no RTTI + entries in their vtables; adjust. + (add_virtual_function, finish_base_struct, skip_rtti_stuff, + modify_one_vtable, fixup_vtable_deltas1, override_one_vtable, + finish_struct_1): Likewise. + * decl2.c (mark_vtable_entries): Likewise. + * rtti.c (build_headof, get_tinfo_fn_dynamic): Likewise. + * search.c (get_abstract_virtuals_1, get_abstract_virtuals, + expand_upcast_fixups): Likewise. + * tree.c (debug_binfo): Likewise. + + * cp-tree.h (COMPARE_NO_ATTRIBUTES): New macro. + * typeck.c (comptypes): If we get it, ignore attributes. + * class.c (instantiate_type): Use BASELINK_P. Change complain + parameter to flags; 2 means ignore attributes. + * call.c (build_op_delete_call): Pass it. + + * decl.c (xref_tag): Only complain once about using a typedef-name + with 'struct'. Downgrade to pedwarn. + + * decl.c (grokdeclarator): Allow [] syntax for zero-length array. + + * parse.y (absdcl_intern): New nonterminal. + (absdcl, direct_abstract_declarator): Use it. + + * pt.c (lookup_template_class): Look through implict typename. + +1999-04-11 Mark Mitchell + + * friend.c (add_friend): Deal gracefully with error_mark_node. + * method.c (build_overload_value): Handle pointers-to-members as + template parameters. + + * decl.c (push_binding): Fix typo in comment. + +1999-04-10 Mark Mitchell + + * error.c (dump_type_real): If a typename is a template-id, put + out the template arguments. + (dump_expr): Handle TEMPLATE_ID_EXPR. + * pt.c (lookup_template_class): Now that full arguments are + available everywhere, remove code that tried to guess them. + +1999-04-09 Mark Mitchell + + * decl.c (make_typename_type): Complain if we don't find a type + when trying to make a typename type for a non-template type. + +1999-04-09 Jason Merrill + + * decl.c (start_decl): Pass attributes to grokdeclarator. + (grokdeclarator): Handle attributes on constructor-syntax + initializers. + +1999-04-08 Mark Mitchell + + * error.c (dump_expr): Don't crash on INDIRECT_REFs whose operands + don't have types. + + * search.c (template_self_reference_p): Tweak. + +1999-04-07 Mark Mitchell + + * init.c (build_offset_ref): Don't build yet another weird data + structure to describe overloaded functions. + +1999-04-06 Mark Mitchell + + * cp-tree.h (BASELINK_P): New macro. + (SET_BASELINK_P): Likewise. + * init.c (build_member_call): Remove needless assignment in if + statement. + * search.c (lookup_field_r): Fix handling when we are looking + specifically for a type; these are not hidden by functions and + variables. + (lookup_member): Use SET_BASELINK_P. + * tree.c (is_overloaded_fn): Use BASELINK_P. + (really_overloaed_fn): Likewise. + (get_first_fn): Likewise. + +1999-04-05 Mark Mitchell + + * decl.c (lookup_name_current_level): Tweak, and improve + documentation. + + * class.c (maybe_fixup_vptrs): Remove declaration. + (build_class_init_list): Likewise. + * decl.c (pushdecl_class_level): Call check_template_shadow here + ... + (push_class_level_binding): ... not here. + * search.c (dfs_push_type_decls): Only avoid + template-self-reference TYPE_DECLs if they are from base classes. + +1999-04-04 Mark Mitchell + + * pt.c (check_template_shadow): Don't treat OVERLOADs as _DECL + nodes. Tidy. + +1999-04-03 Jason Merrill + + * class.c (maybe_fixup_vptrs, build_class_init_list): Lose. + (finish_struct_1): Don't call build_class_init_list. + +1999-04-02 Mark Mitchell + + * tinfo.h (__class_type_info): Fix illegal declaration. + + * cp-tree.def (TEMPLATE_ID_EXPR): Update comment. + * cp-tree.h (INHERITED_VALUE_BINDING_P): New macro. + (IDENTIFIER_CLASS_VALUE): Improve documentation. + (is_properly_derived_from): Declare. + (invalidate_class_lookup_cache): Likewise. + (maybe_maybe_note_name_used_in_class): Likewise. + (note_name_declared_in_class): Likewise. + (push_using_decl): Remove duplicate declaration. + (id_in_current_class): Remove declaration. + (push_class_binding): Change prototype. + (clear_identitifer_class_values): Declare. + * call.c (is_properly_derived_from): Make it global. + (build_new_function_call): Be careful about updating candidates. + (build_new_method_call): Handle COMPONENT_REFs. Don't crash when + asked to make illegal calls. + * class.c: Include splay-tree.h. + (class_stack_node): Add names_used slot. + (check_member_decl_is_same_in_complete_scope): Remove. + (add_method): Fix comment. Push the declaration into class + scope. + (finish_struct_1): When popping the class, pop the bindings too. + Remove check for data member/function member conflict. + (finish_struct): Remove calls to + check_member_decl_is_same_in_complete_scope. Change calls to + popclass. + (pushclass): Clear names_used in the class stack entry. + Use invalidate_class_lookup_cache to remove cached entries, rather + than magic values with popclass. Clear IDENTIFIER_CLASS_VALUE + before entering a new class. Remove dead code. Don't mess with + current_function_decl when pushing declarations. + (invalidate_class_lookup_cache): New function, split out from ... + (popclass): Here. Clean up names_used on our way out. + (instantiate_type): Adjust. + (build_self_reference): Don't push the declaration here. + (maybe_note_name_used_in_class): New function. + (note_name_declared_in_class): Likewise. + * decl.c (add_binding): Change prototype. + (find_class_binding_level): New function. + (innermost_nonclass_level): Likewise. + (current_binding_level): Update documentation. + (inner_binding_level): Remove. Replace with current_binding_level + throughout. + (push_binding_level): Remove special handling of + class_binding_level. + (pop_binding_level): Likewise. Use find_class_binding_level. + (suspend_binding_level): Likewise. + (global_bindings_p): Use innermost_nonclass_level. + (toplevel_bindings_p): Likewise. + (namespace_bindings_p): Likewise. + (pseudo_global_level_p): Likewise. + (push_binding): Clear INHERITED_VALUE_BINDING_P. + (add_binding): Check for illegal multiple declarations. Return a + value indicating whether or not the new binding was legal. + (push_local_binding): Skip over class binding levels. Check + return value from add_binding. + (push_class_binding): Set INHERITED_VALUE_BINDING_P. Call + note_name_declared_in_class. + (pushlevel_class): Remove "fake out the rest of the compiler" + code. + (poplevel_class): Reset IDENTIFIER_CLASS_VALUEs. + (clear_identifier_class_values): New function. + (pop_from_top_level): Use it. + (pop_everything): Tweak. + (maybe_process_template_type_declaration): Don't push the + declaration for the template here. + (pushtag): Don't push tag declarations into class scope here. + (pushdecl): Apply DeMorgan's law for readability. + (pushdecl_class_level): Remove special-case code for + TYPE_BEING_DEFINED. Handle OVERLOADs and anonymous unions. + (push_class_level_bindng): Deal with inherited bindings. + (lookup_name_real): Remove special-case code for + TYPE_BEING_DEFINED, and some implicit typename magic. + (grokdeclarator): Handle COMPONENT_REF for a template function. + (build_enumerator): Don't call pushdecl_class_level here. + (id_in_current_class): Remove. + * decl2.c (grokfield): Don't call pushdecl_class_level or + check_template_shadow. + * errfn.c (cp_file_of): Don't declare. + (cp_line_of): Likewise. + * error.c (dump_decl): Handle an OVERLOAD. + (cp_file_of): Likewise. + (cp_line_of): Likewise. + * init.c (build_member_call): Handle a COMPONENT_REF. + * lex.c (do_identifier): Call maybe_note_name_used_in_class, not + pushdecl_class_level. + * method.c (hack_identifier): Build COMPONENT_REFs for references + to member templates as well as member functions. Remove dead + code. + * parse.y (left_curly): Remove. + (nonnested_type): Call maybe_note_name_used_in_class, not + pushdecl_class_level. + * parse.c: Regenerated. + (nested_name_specifier_1): Likewise. + * pt.c (check_explicit_specialization): Adjust, for robustness. + (check_template_shadow): Handle OVERLOADs. + (build_template_decl): Set DECL_CONSTRUCTOR_P on the + TEMPLATE_DECL, if appropriate. + * search.c (envelope_add_decl): Remove. + (dfs_pushdecls): Likewise. + (dfs_compress_decls): Likewise. + (dfs_push_decls): New function. + (dfs_push_type_decls): Likewise. + (setup_class_bindings): Likewise. + (template_self_reference_p): Likewise. + (lookup_field_r): Use it. + (looup_member): Remove old comment. Deal with ambiguity. + (push_class_decls): Use dfs_push_decls and dfs_push_type_decls, + and remove envelope processing. + * semantics.c (begin_class_definition): Let pushclass push + declarations for base classes. + (finish_member_declaration): Push declarations into class scope. + * typeck.c (build_component_ref): Just put an OVERLOAD into the + COMPONENT_REF, not a TREE_LIST of an OVERLOAD. + (build_x_function_call): Deal with OVERLOAD. Handle template-ids. + * Makefile.in (class.o): Depend on splay-tree.h. + +Wed Mar 31 11:30:43 1999 Nathan Sidwell + + * cvt.c (convert_pointer_to_real): Use same_type_p. + * typeck.c (comp_target_types): Use same_type_p. + +1999-03-31 Jason Merrill + + * semantics.c (begin_inline_definitions, + finish_inline_definitions): Rename from finish_default_args and + begin_inline_definitions, respectively, to something that isn't a + total lie. :) + * parse.y (structsp): Adjust. + + * tree.c (hash_tree_cons): Remove obsolete via_* parms. + (list_hash_lookup): Likewise. + (hash_tree_chain): Adjust. + * pt.c (tsubst): Adjust. + (tsubst_arg_types): Use plain hash_tree_cons. + * cp-tree.h (hash_tree_cons_simple): Lose. + * parse.y (declmods, nonempty_cv_qualifiers): Use hash_tree_cons. + +Wed Mar 31 10:48:29 1999 Kaveh R. Ghazi + + * Makefile.in (hash.h): Generate using gperf language 'C', not + 'KR-C', so gperf uses the `const' keyword on strings. + + * gxx.gperf (resword): Const-ify a char*. + +1999-03-30 Jason Merrill + + * cp-tree.h (IDENTIFIER_AS_DESC, IDENTIFIER_AS_LIST, + CLASSTYPE_BASELINK_VEC, CLASSTYPE_N_SUPERCLASSES, + CLASSTYPE_N_BASECLASSES, CLASSTYPE_MAX_DEPTH, + CLASSTYPE_BASE_INIT_LIST, CLASSTYPE_AS_LIST, CLASSTYPE_ID_AS_LIST, + CLASSTYPE_BINFO_AS_LIST): Remove cruft. + * class.c, lex.c, parse.y, ptree.c, search.c, semantics.c, + tree.c: Adjust. + +1999-03-29 Jason Merrill + + * decl2.c (lang_decode_option): Remove -Wsign-promo from -Wall. + +1999-03-28 Jason Merrill + + * pt.c (fn_type_unification): Ignore 'this' parm from conversion ops. + +1999-03-27 Mark Mitchell + + * cp-tree.h (add_friend): Declare. + (add_friends): Likewise. + * friend.c (add_friend): Make it global. Don't add to + DECL_BEFRIENDING_CLASSES if the befriending class is a template. + (add_friends): Make it global. + (make_friend_class): Don't add to DECL_BEFRIENDING_CLASSES if the + befriending class is a template. + * parse.y (component_decl_1): Fix typo in comment. + * parse.c: Regenerated. + * pt.c (instantiate_class_template): Use add_friend and + add_friends rather that duplicating some of their functionality + here. + +1999-03-27 Jason Merrill + + * call.c (build_field_call): Unify 'this' and non-'this' cases. + + * typeck.c (build_indirect_ref): Check for 'this' sooner. + +Fri Mar 26 10:20:34 1999 Kaveh R. Ghazi + + * call.c (op_error): Const-ify a char*. + (add_candidate, source_type, add_warning): Add static prototype. + (print_z_candidates): Const-ify a char*. + + * class.c (resolve_address_of_overloaded_function, + fixed_type_or_null, build_vtable_entry_ref): Add static prototype. + (get_vtable_name, finish_struct_1): Const-ify a char*. + + * cvt.c (convert_to_reference): Likewise. + + * decl.c (redeclaration_error_message, record_builtin_type, + record_unknown_type, member_function_or_else, bad_specifiers): + Likewise. + (find_binding, select_decl, unqualified_namespace_lookup, + lookup_flags, qualify_lookup, record_builtin_java_type, tag_name): + Add static prototype. + (warn_extern_redeclared_static, duplicate_decls, pushdecl, + implicitly_declare, record_builtin_java_type, define_function, + grok_op_properties, tag_name): Const-ify a char*. + + * cp-tree.h (FORMAT_VBASE_NAME): Allow parameter `BUF' to be const. + (define_function, finish_builtin_type): Const-ify a char*. + (cp_error, cp_error_at, cp_warning, cp_warning_at, cp_pedwarn, + cp_pedwarn_at, cp_compiler_error, cp_sprintf): Add prototype args. + (file_name_nondirectory): Const-ify a char*. + (init_filename_times): Don't prototype. + (compiler_error): Prototype. + (yyerror, init_repo): Const-ify a char*. + (build_srcloc): Don't prototype. + (build_x_indirect_ref, build_indirect_ref, build_component_addr): + Const-ify a char*. + (warn_for_assignment): Don't prototype. + (convert_for_initialization, readonly_error, check_for_new_type, + GNU_xref_begin, GNU_xref_file, GNU_xref_ref, GNU_xref_call): + Const-ify a char*. + + * decl2.c (acceptable_java_type, output_vtable_inherit, + setup_initp, start_objects, finish_objects, do_dtors, do_ctors, + merge_functions, decl_namespace, validate_nonmember_using_decl, + do_nonmember_using_decl): Add static prototype. + (lang_f_options): Const-ify a char*. + (finish_builtin_type): Likewise. + (add_function, arg_assoc_namespace, arg_assoc_class): Add static + prototype. + + * errfn.c: Include cp-tree.h. + (cp_thing): Add static prototype. + (compiler_error): Don't protoptype. + (cp_compiler_error): Cast `compiler_error' to `errorfn' before + passing it to `cp_thing'. + + * error.c (interesting_scope_p): Add static prototype. + + * except.c (build_eh_type_type, build_eh_type_type_ref): Const-ify + a char*. + + * init.c (compiler_error): Don't prototype. + (member_init_ok_or_else): Const-ify a char*. + (build_java_class_ref): Add static prototype. + + * lex.c (compiler_error): Don't prototype. + (get_time_identifier, interface_strcmp, extend_token_buffer, + handle_cp_pragma): Const-ify a char*. + (is_global, init_filename_times): Add static prototype. + (file_name_nondirectory, cplus_tree_code_name): Const-ify a char*. + (compiler_error): Change from fixed args to variable args. + (yyerror): Const-ify a char*. + + * parse.y (cond_stmt_keyword): Const-ify a char*. + (parse_decl): Add static prototype. + + * pt.c (template_args_equal, print_template_context): Likewise. + (print_candidates, check_default_tmpl_args): Const-ify a char*. + (instantiate_class_template): Likewise. + + * repo.c (get_base_filename, open_repo_file, init_repo): Likewise. + + * rtti.c (call_void_fn, expand_generic_desc, expand_si_desc, + expand_class_desc, expand_ptr_desc, expand_attr_desc): Likewise. + + * search.c (lookup_field_info, lookup_member): Likewise. + (lookup_member): Cast the first argument of `bzero' to a PTR. + + * sig.c (compiler_error): Don't prototype. + (build_signature_pointer_or_reference_nam): Const-ify a char*. + (get_sigtable_name, build_member_function_pointer): Likewise. + + * tree.c (compiler_error): Don't prototype. + (no_linkage_helper, build_srcloc): Add static prototype. + (build_vbase_pointer_fields): Const-ify a char*. + (__eprintf): Don't unnecessarily handle `const' when !__STDC__. + + * typeck.c (compiler_error): Don't prototype. + (convert_for_assignment): Const-ify a char*. + (comp_cv_target_types): Add static prototype. + (build_x_indirect_ref, build_indirect_ref, convert_arguments, + build_component_addr, build_unary_op, convert_for_initialization): + Const-ify a char*. + + * typeck2.c (ack): Add static prototype and change from fixed args + to variable args. + (readonly_error, check_for_new_type): Const-ify a char*. + + * xref.c (_XREF_FILE, find_file, filename, fctname, declname, + fixname, open_xref_file, classname, GNU_xref_begin): Likewise. + (GNU_xref_file): Likewise. Also use `xmalloc' instead of `malloc'. + (GNU_xref_end_scope, GNU_xref_ref, GNU_xref_decl, GNU_xref_call, + gen_assign, GNU_xref_member): Const-ify a char*. + +1999-03-25 Martin von Löwis + + * gxxint.texi: Remove old discussion on copying virtual bases. + +1999-03-25 Zack Weinberg + + * Make-lang.in: Remove all references to g++.o/g++.c. + Link g++ from gcc.o. + +1999-03-25 Jason Merrill + + * decl2.c (comdat_linkage): Treat vtables like functions. + +1999-03-25 Mark Mitchell + + * pt.c (tsubst_decl): tsubst into DECL_BEFRIENDING_CLASSES. + +1999-03-25 Nathan Sidwell + + * decl.c (init_decl_processing): Add `signed' type as a synonym + for `int'. + +1999-03-25 Jason Merrill + + * typeck.c (common_type): Handle cv-qual unification for pointers + to members. + + * decl.c (unqualified_namespace_lookup): Return error_mark_node + on error. + (lookup_name_real): Set LOOKUP_COMPLAIN when *not* parsing. + * lex.c (do_identifier): If we got error_mark_node, call + lookup_name again. + +1999-03-24 Martin von Löwis + + * class.c (finish_struct_1): Always reset TYPE_FIELDS for empty + classes. + +1999-03-24 Jason Merrill + + * decl.c (lookup_name_real): Do nested field lookup regardless of + TYPE_BEING_DEFINED. + +1999-03-24 Mark Mitchell + + * cp-tree.h (lang_type): Remove has_assignment and + has_real_assignment. Add befriending_classes. + (TYPE_HAS_ASSIGNMENT): Remove. + (TYPE_HAS_REAL_ASSIGNMENT): Likewise. + (CLASSTYPE_BEFRIENDING_CLASSES): New macro. + (lang_decl): Document. + (DECL_BEFRIENDING_CLASSES): New macro. + (FRIEND_NAME): Move declaration to more obvious location. + (FRIEND_DECLS): Likewise. + * class.c (finish_struct_1): Don't use TYPE_HAS_REAL_ASSIGNMENT. + * decl.c (duplicate_decls): Copy DECL_BEFRIENDING_CLASSES. + (fixup_anonymous_union): Don't use TYPE_HAS_ASSIGNMENT. + (grok_op_properties): Likewise. + * friend.c (is_friend): Use FRIEND_NAME and FRIEND_DECLS. + (add_friend): Likewise. Don't do weird things with assignment + operators. Update DECL_BEFRIENDING_CLASSES. + (add_friends): Don't do weird things with assignment operators. + (make_friend_class): Likewise. Update + CLASSTYPE_BEFRIENDING_CLASSES. + * pt.c (instantiate_class_template): Don't set + TYPE_HAS_ASSIGNMENT. + (tsubst_copy): Substitute the TREE_TYPE for more unary + expressions. + * ptree.c (print_lang_type): Don't look at TYPE_HAS_ASSIGNMENT. + * search.c (protected_accessible_p): New function. + (friend_accessible_p): Likewise. + (accessible_p): Use them. + +1999-03-23 Mark Mitchell + + * pt.c (convert_nontype_argument): Don't create things that aren't + PTRMEM_CSTs when applying a qualification conversion to a + PTRMEM_CST. + +1999-03-23 Mark Mitchell + + * Makefile.in (OBJS): Don't mention hash.o. + (OBJDEPS): Likewise. + +1999-03-23 Jason Merrill + + * decl2.c (finish_file): Set at_eof to 2 after expanding ctors. + * decl.c (expand_static_init): Make sure we don't add any after + then. + + * decl.c (cp_finish_decl): Move intelligence about handling + DECL_COMDAT for variables from here... + * decl2.c (comdat_linkage): ...to here. + (maybe_make_one_only): Tweak. + (import_export_decl): Call comdat_linkage for variables, too. + (finish_file): Handle template statics properly. + +1999-03-22 Mark Mitchell + + * cp-tree.h (TYPE_PTRMEMFUNC_P): Use TYPE_PTRMEMFUNC_FLAG. + Document internals of pointer-to-member-functions. + (DELTA2_FROM_PTRMEMFUNC): Make it call delta2_from_ptrmemfunc. + (PFN_FROM_PTRMEMFUNC): Likewise. + (build_type_conversion): Remove unused parameter. + (build_ptrmemfunc1): Declare. + (expand_ptrmemfunc_cst): New function. + (delta2_from_ptrmemfunc): Likewise. + (pfn_from_ptrmemfunc): Likewise. + * cvt.c (cp_convert_to_pointer): Remove unused parameter to + build_type_conversion. Use TYPE_PTRMEM_P for readability. + (convert_to_reference): Remove unused parameter to + build_type_conversion. + (ocp_convert): Likewise. + (build_user_type_conversion): Likewise. + * error.c (dump_expr): Handle NULL pointer-to-member functions. + * expr.c (cplus_expand_expr): Handle PTRMEM_CSTs for functions. + * method.c (build_overload_value): Don't go splitting CONSTRUCTORs + open when handling pointer-to-member functions. + * pt.c (convert_nontype_argument): Clean up error messages. Be + more stringent with pointers-to-members. + * typeck.c (build_ptrmemfunc1): Don't declare. Make it global. + (build_unary_op): Tidy ever-so-slightly. + (build_conditional_expr): Remove extra parameter to + build_type_conversion. + (build_ptrmemfunc): Build PTRMEM_CSTs if we know what function + we're using. + (expand_ptrmemfunc_cst): Define. + (delta2_from_ptrmemfunc): Likewise. + (pfn_from_ptrmemfunc): Likewise. + +1999-03-19 Mark Mitchell + + * init.c (build_member_call): Handle template-id expressions + correctly. + * typeck.c (build_x_function_call): Likewise. + +1999-03-19 Chip Salzenberg + + * friend.c (make_friend_class): Avoid core dump when + not-yet-defined friend type lacks TYPE_LANG_SPECIFIC(). + +1999-03-18 Jason Merrill + + * decl.c (start_function): Suppress normal linkage heuristics + for #pragma interface under MULTIPLE_SYMBOL_SPACES. + +1999-03-19 Alexandre Oliva + + * Make-lang.in: ($(INTL_TARGETS)): Depend on cp/parse.c. + ($(srcdir)/cp/parse.c): Moved from ../Makefile.in. + +1999-03-17 Martin von Löwis + + * parse.y (named_complex_class_head_sans_basetype): + Do not push a scope for error_mark_node. + (maybe_base_class_list): Likewise. + + * decl.c (start_decl): Check for error_mark_node as a type. + Detected by g++.brendan/array-refs.C. + (start_decl_1): Likewise. Detected by g++.bugs/900322_01.C. + (maybe_build_cleanup_1): Likewise. Detected by + g++.jason/incomplete1.C. + + * tree.c (build_dummy_object): Use void_zero_node instead of the + error_mark_node. + (is_dummy_object): Check for such a node. + Detected by g++.bob/inherit1.C + +1999-03-16 Jason Merrill + + * method.c (old_backref_index): Split out... + (flush_repeats): From here. Rename back from try_old_backref. + (build_mangled_name): Put back some old-style repeat handling. + +Mon Mar 15 21:57:16 1999 Kaveh R. Ghazi + + * lex.c: Don't include setjmp.h. + (parse_float): New static function. + (pf_args): New struct. + (real_yylex): Use them in call to `do_float_handler'. + +1999-03-15 Mark Mitchell + + * decl.c (xref_basetypes): Set CLASSTYPE_VBASECLASSES here. + * tree.c (layout_basetypes): Not here. + * search.c (dfs_search): Remove; no longer used. + +1999-03-12 Mark Mitchell + + * decl2.c (validate_nonmember_using_decl): Issue sensible + error-messages on bogus qualifiers. + +1999-03-14 Jason Merrill + + * call.c (add_function_candidate): Fix uninitialized variable. + + * Makefile.in (search.o): Add dependency on varray.h. + +1999-03-13 Jason Merrill + + * decl.c (duplicate_decls): Use same_type_p. + * method.c (try_old_backref): Renamed from flush_repeats. Use + same_type_p. Don't try to handle repeats. Return success. + (is_back_referenceable_type): Return 0 if TYPE_FOR_JAVA. Support + calls from old-style code, too. + (check_ktype): Use same_type_p. + (check_btype): Use same_type_p. Don't pull out TYPE_MAIN_VARIANT. + (build_qualified_name): Simplify logic. + (process_overload_item): Strip typedefs and quals at the top. + (build_mangled_name_for_type_with_Gcode): Remove call to + type_canonical_variant. + (build_mangled_name): Likewise. Remove support for old-style + repeats, which have been disabled since 2.7.2. Don't mess with + TREE_USED. + (build_decl_overload_real): Don't mess with TREE_USED. + +1999-03-13 Nathan Sidwell + + * error.c (cp_printers): Add 'F' escape character. + (dump_type_real): Remove TREE_LIST (fnargs) printing. + Functionality moved to dump_parameters. + (dump_type_suffix): Use dump_parameters and dump_exception_spec. + (dump_function_decl): Extend meaning of V parameter. Use + dump_parameters and dump_exception_spec. + (dump_parameters): New static function. + (dump_exception_spec): New static function. + (fndecl_as_string): Change argument semantics. Use + dump_function_decl directly. + + * sig.c (build_signature_table_constructor): Use cp_error. + +1999-03-13 Martin von Löwis + + * semantics.c (finish_switch_cond): Handle error cases gracefully. + Detected by g++.law/enum5.C. + + * typeck.c (build_modify_expr): Check for errors after resolving + offsets. Detected by g++.brendan/static1.C. + + * decl.c (complete_array_type): Ignore initial_value if it is an + error. Detected by g++.benjamin/17930.C. + + * typeck2.c (process_init_constructor): Return error if one argument + is in error. Detected by g++.benjamin/13478.C. + +1999-03-12 Martin von Löwis + + * decl.c (select_decl): Allow class templates when we need types. + * decl2.c (ambiguous_decl): Likewise. + +1999-03-12 Mark Mitchell + + * lex.c (do_identifier): Correct call to enforce_access. + * search.c (accessible_p): Tweak comment. + +1999-03-10 Mark Mitchell + + * semantics.c (begin_class_definition): Call build_self_reference. + (finish_member_declaration): Set DECL_CONTEXT for TYPE_DECLs. + + * search.c (assert_canonical_unmarked): Fix typo in prototype. + + * search.c (dfs_canonical_queue): New function. + (dfs_assert_unmarked_p): Likewise. + (assert_canonical_unmarked): Likewise. + (access_in_type): Use it. + (accessible_p): Likewise. Walk the whole tree when umarking. + + * sig.c (build_signature_table_constructor): Use accessible_p + instead of compute_access. + +1999-03-09 Jason Merrill + + * call.c (add_builtin_candidates): Handle overloaded conversion ops. + +1999-03-09 Mark Mitchell + + * cp-tree.h (flag_access_control): Declare. + (TREE_VIA_PPUBLIC): Document. + (DECL_NONSTATIC_MEMBER_P): New macro. + (enforce_access): Return an indication of whether or not access + was permitted. + (build_self_reference): Change prototype. + (compute_access): Replace with ... + (accessible_p): New function. + (dfs_walk): Change prototype. + (dfs_unmark): Likewise. + (markedp): Likewise. + * call.c (enforce_access): Use accessible_p. + * class.c (build_self_reference): Insert the declaration into the + list of members for this type, and make it public. + * decl.c (xref_basetypes): Avoid ill-timed recursion. + * init.c (build_offset_ref): Use lookup_member, not three separate + name-lookups. Call enforce_access rather than checking for + illegal accesses here. + (resolve_offset_ref): Likewise. + * lex.c (do_identifier): Likewise. + * method.c (hack_identifier): Likewise. + * parse.y (self_reference): Remove. + (opt_component_decl_list): Don't use it. + * parse.c: Regenerated. + * pt.c (print_candidates): Generalize to handle lists of + overloaded functions. + (instantiate_class_template): Don't rely on TREE_VIA_PRIVATE; it's + not set. + (get_template_base): Use new calling convention for dfs_walk. + * search.c: Include varray.h. Add prototypes. + (dfs_walk): Accept a data pointer to pass to the work functions. + All callers changed. All work functions changed. + (breadth_first_search): Rename to bfs_walk, and make consistent + with dfs_walk. + (dfs_walk_real): New function. + (canonical_binfo): New function. + (context_for_name_lookup): Likewise. + (shared_marked_p): Likewise. + (shared_unmarked_p): Likewise. + (lokup_field_queue_p): Likewise. + (lookup_field_r): Generalize to handle both functions and fields. + (lookup_field): Just call lookup_member. + (lookup_fnfields): Likewise. + (lookup_member): Move body of lookup_field here and generalize. + (dfs_accessible_queue_p): Likewise. + (dfs_accessible_p): Likewise. + (dfs_access_in_type): Likewise. + (access_in_type): Likewise. + (compute_access): Remove, and replace with ... + (accessible_p): New function. + (vbase_types): Remove. + (vbase_decl_ptr_intermediate): Likewise. + (vbase_decl_ptr): Likewise. + (vbase_init_result): Likewise. + (closed_envelopes): Likewise. + (bvtable): Likewise. + +1999-03-09 Jason Merrill + + * call.c (add_function_candidate): Check for proper number of args + before checking the validity of those args. + +1999-03-06 Jason Merrill + + * cp-tree.h (struct lang_type): Add anon_union field. + (ANON_UNION_TYPE_P): Use it instead of examining type. + (SET_ANON_UNION_TYPE_P): New macro. + * decl.c (check_tag_decl): Use it. + + * search.c (compute_access): Handle non-type contexts earlier, and + handle NULL_TREE. + + * tree.c (build_exception_variant): Use copy_to_permanent. + + * decl2.c (setup_initp): Give statics with no priority the default + priority here. + (do_dtors, do_ctors, finish_file): Remove special handling of + non-prioritized statics. + +1999-03-05 Mark Mitchell + + * cp-tree.h (ANON_UNION_TYPE_P): Robustify. + * decl.c (make_typename_type): Don't issue an error if an + immediate lookup fails; it migt be resolved later. + * friend.c (is_friend): Add comment. + * search.c (breadth_first_search): Add POSTFN and DATA + parameters. Tidy. All callers changed. + (lookup_field_queue_p): New function. + (lookup_field_r): Likewise. + (lookup_field_post): Likewise. + (lookup_field): Use them, via breadth_first_search, instead of + duplicating logic. + (compute_access): Robustify. + (lookup_fnfield_info): New structure. + +1999-03-05 Jason Merrill + + * pt.c (tsubst, case ARRAY_REF): Use tsubst_expr again. + +1999-03-03 Jason Merrill + + * class.c, decl2.c, method.c, pt.c: Add 'static' to make SunOS 4 + cc happy. + + * decl2.c (import_export_class): Also return if + CLASSTYPE_INTERFACE_ONLY is set. + +1999-03-03 Martin von Löwis + + * decl.c (push_overloaded_decl): Only overwrite the old binding if + there was one. + * decl2.c (do_local_using_decl): Fix loop termination. + +1999-03-02 Mark Mitchell + + * cp-tree.h (determine_specialization): Don't declare. + * pt.c (determine_specialization): Make it static. Eliminate + complain parameter. Note that decl is always non-NULL now, and + simplify accordingly. + + * decl.c (maybe_push_to_top_level): Always call + push_cp_function_context. + (pop_from_top_level): Always call pop_cp_function_context. + +1999-02-26 Nathan Sidwell + + * typeck.c (complete_type_or_else): Add VALUE arg, for helpful + diagnostics. + * cp-tree.h (complete_type_or_else): Added VALUE parameter. + * init.c (build_new_1): Extra arg to complete_type_or_else. + (build_delete): Likewise. + * typeck.c (require_complete_type): Likewise. + (pointer_int_sum): Likewise. + (pointer_diff): Likewise. + (build_component_ref): Likewise. + + * typeck2.c (incomplete_type_error): Always use cp_error. + Show declaration of undefined type, if appropriate. + Deal with UNKNOWN_TYPE nodes. + + * typeck.c (require_complete_type): Use TYPE_SIZE as + size_zero_node to mean incomplete type. + (require_complete_type_in_void): New function. + (build_compound_expr): Call complete_type_in_void for LHS. + (build_c_cast): Call complete_type_in_void for void cast. + * cvt.c (ocp_convert): Call complete_type_in_void for void cast. + * decl.c (cplus_expand_expr_stmt): Void expression checks moved to + require_complete_type_in_void. Call it. + * cp-tree.h (require_complete_type_in_void): Prototype new function. + + * typeck.c (convert_arguments): Use alternative format for + function decls. Don't require_complete_type here. Simplify + diagnostic printing. + (convert_for_initialization): Don't require_complete_type on RHS yet. + * call.c (convert_arg_to_ellipsis): Call require_complete_type. + + * call.c (build_over_call): Cope with qualified void return type. + * semantics.c (finish_call_expr): Likewise. + * typeck.c (build_function_call_real): Likewise. + (c_expand_return): Likewise. + * decl2.c (reparse_absdcl_as_expr): Cope with qualified void type. + + * call.c (print_z_candidates): Use alternate print format, to be + consistent with (pt.c) print_candidates. + * method.c (hack_identifier): List candidate members. + * search.c (lookup_field): Build ambiguous list, and show it, if + ambiguous. + +1999-02-26 Mark Mitchell + + * typeck.c (decay_conversion): Don't confuse constant array + variables with their initializers. + + * decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when + merging decls. + * pt.c (regenerate_decl_from_template): Tweak for clarity. + (instantiate_decl): Mark a decl instantiated before regenerating + it to avoid recursion. + * tree.c (mapcar): Don't call decl_constant_value unless we know + something is TREE_READONLY_DECL_P. + + * class.c (check_for_override): Don't stop checking when we find + the first overridden function. Delete #if 0'd code. + * search.c (get_matching_virtual): Likewise. + +1999-02-25 Richard Henderson + + * lang-specs.h: Define __FAST_MATH__ when appropriate. + +1999-02-24 Mike Stump + + * typeck.c (convert_for_assignment): Allow boolean integral constant + expressions to convert to null pointer. + +1999-02-24 Martin von Löwis + + * decl.c (lookup_namespace_name): Resolve namespace aliases. + + * class.c (push_nested_class): Allow namespaces. + + * decl2.c (set_decl_namespace): Add friendp parameter. + * decl.c (grokfndecl): Pass it. + (grokvardecl): Likewise. + * cp-tree.h: Change declaration. + +1999-02-24 Jason Merrill + + * pt.c (tsubst): Allow an array of explicit size zero. + +1999-02-23 Jason Merrill + + * errfn.c: Change varargs code to look like toplev.c. + + * method.c (process_modifiers): Don't prepend 'U' for char or + wchar_t. + +1999-02-20 Craig Burley + + * Make-lang.in (cplib2.ready): Don't consider updating + cplib2 stuff if the current directory isn't writable, as + it won't work (such as during a `make install'). + +Sun Feb 21 20:38:00 1999 H.J. Lu (hjl@gnu.org) + + * decl2.c (start_objects): Make file scope constructors and + destructors local to the file if ASM_OUTPUT_CONSTRUCTOR and + ASM_OUTPUT_DESTRUCTOR are defined. + +1999-02-19 Mark Mitchell + + * cp-tree.h (CLASSTYPE_METHOD_VEC): Adjust comment. + (fn_type_unification): Adjust prototype. + (lookup_fnfields_1): Declare. + * call.c (add_template_candidate_real): Adjust call to + fn_type_unification. + * class.c (add_method): Don't allow duplicate declarations of + constructors or destructors. + (resolve_address_of_overloaded_function): Remove unused variable. + Adjust call to fn_type_unification. + * decl.c (grokfndecl): Be more robust in the face of illegal + specializations. + * decl2.c (check_classfn): Remove hokey handling of member + templates. + * pt.c (determine_specialization): Improve comments. Adjust to + handle template argument deduction as per the standard. + (check_explicit_specialization): Fix comment spacing. Handle + type-conversion operators correctly. Improve error-recovery. + (fn_type_unification): Remove EXTRA_FN_ARG parameter. + (get_bindings_real): Simplify handling of static members. + * search.c (lookup_fnfields_1): Make it have external linkage. + * typeck.c (compparms): Fix comment. + (build_unary_op): Don't try to figure out which template + specialization is being referred to when when the address-of + operator is used with a template function. + +Thu Feb 18 23:40:01 1999 Kaveh R. Ghazi + + * cp-tree.h (lvalue_or_else): Qualify a char* with the `const' + keyword to match an analogous change at the top level. + + * tree.c (lvalue_or_else): Likewise. + +1999-02-17 Mark Mitchell + + * decl.c (xref_basetypes): Comment. + * pt.c (instantiate_class_template): Use xref_basetypes. + +1999-02-16 Mark Mitchell + + * cp-tree.h (tsubst): Change prototype. + (tsubst_expr): Likewise. + (tsubst_copy): Likewise. + (type_unification): Remove prototype. + * call.c (convert_default_arg): Adjust call to tsubst_expr. + * class.c (resolve_address_of_overloaded_function): Just use + fn_type_unification. + * decl.c (grokdeclarator): Adjust call to tsubst. + * method.c (build_template_parm_names): Likewise. + * pt.c (GTB_VIA_VIRTUAL): New macro. + (GTB_IGNORE_TYPE): Likewise. + (resolve_overloaded_unification): Add `complain' parameter. + (try_one_overload): Likewise. + (tsubst_template_arg_vector): Likewise. + (tsubst_template_parms): Likewise. + (tsubst_aggr_type): Likewise. + (tsubst_arg_types): Likewise. + (tsubst_call_declarator_parms): Likewise. + (unify): Remove explicit_mask. + (type_unification_real): Likewise. + (get_template_base_recursive): Likewise. + (coerce_template_template_parms): Provide prototype. + (tsubst_function_type): Likewise. + (try_class_unification): New function. + All callers changed to use new complain parameter. + (get_template_base): Use try_class_unification. + (unify): Adjust handling of classes derived from template types. + (fn_type_unification): Substitute explicit arguments before + unification. + +1999-02-16 Kriang Lerdsuwanakij + + * decl.c (pushdecl): Remove dead code. + +1999-02-16 Jason Merrill + + * decl2.c (finish_objects): Fix code I missed in previous change. + +1999-02-13 Jason Merrill + + * decl.c (grokfndecl): Return NULL_TREE instead of error_mark_node. + (grokdeclarator): Don't expect error_mark_node from grokfndecl. + + * pt.c (maybe_process_partial_specialization): Complain about + 'template <>' on non-specialization. + +1999-02-10 Jason Merrill + + * decl.c (grokdeclarator): Catch weird declarators. + * decl2.c (finish_file): Don't abort because of namespace parsing + failure. + (check_decl_namespace): Remove. + +1999-02-09 Mark Mitchell + + * cp-tree.h (get_template_base): Don't declare. + (dfs_walk): Declare. + (dfs_unmark): Likewise. + (markedp): Likewise. + * pt.c (unify): Remove duplicate declaration. Pass tparms and + targs to get_template_base. + (get_template_base_recursive): Move here from search.c. Check to + see that the base found can be instantiated to form the desired + type. + (get_template_base): Likewise. + (get_class_bindings): Simplify. + * search.c (get_template_base_recursive): Move to pt.c. + (get_template_base): Likewise. + (markedp): Make it global. + (dfs_walk): Likewise. + (dfs_unmark): Likewise. + +1999-02-07 Jason Merrill + + * pt.c (maybe_process_partial_specialization): Complain about + specialization in wrong namespace. + * tree.c (decl_namespace_context): New fn. + +1999-02-06 Kriang Lerdsuwanakij + + * decl2.c (arg_assoc_type): Handle TEMPLATE_TEMPLATE_PARM. + * pt.c (coerce_template_template_parms): Handle nested + template template parameters. + +Sat Feb 6 18:08:40 1999 Jeffrey A Law (law@cygnus.com) + + * typeck2.c: Update email addresses. + +1999-02-04 Kriang Lerdsuwanakij + + * pt.c (unify): Call coerce_template_parms with the COMPLAIN flag + turned off. + +1999-02-04 Jason Merrill + + * lex.c (retrofit_lang_decl): Split out... + (build_lang_decl): From here. + * decl.c (pushdecl): Call it for functions generated by the middle + end that don't have DECL_LANG_SPECIFIC. + * cp-tree.h: Declare it. + + * decl2.c: Remove flag_init_priority. Always enable initp stuff. + (start_objects, finish_objects): Only use special + init_priority code if the user specified a priority. + (do_ctors, do_dtors): Use DEFAULT_INIT_PRIORITY for the non-initp + objects. + +Wed Feb 3 22:50:17 1999 Marc Espie + + * Make-lang.in (GXX_OBJS): Remove choose-temp.o, pexecute.o and + mkstemp.o. Get them from libiberty now. + (DEMANGLER_PROG): Simlarly, remove getopt.o getopt1.o. + +Tue Feb 2 22:38:48 1999 Theodore Papadopoulo + + * decl2.c (lang_decode_option): Use read_integral_parameter. + +1999-02-01 Mark Mitchell + + * pt.c (tsubst, case TYPENAME_TYPE): Check TYPE_BEING_DEFINED + before calling complete_type_or_else. + +Mon Feb 1 09:49:52 1999 Kaveh R. Ghazi + + * input.c (inline): Don't define, its handled by system.h. + +Sun Jan 31 20:34:29 1999 Zack Weinberg + + * decl2.c: Don't define flag_no_ident here. Don't process + -f(no-)ident here. + * cp-tree.h: Don't declare flag_no_ident here. + * lang-specs.h: Map -Qn to -fno-ident. + +1999-01-28 Jason Merrill + + * cp-tree.h (struct tree_binding): Replace scope field with a union. + (BINDING_SCOPE): Adjust. + * decl.c (BINDING_LEVEL): Adjust. + +1999-01-26 Jason Merrill + + * pt.c (instantiate_class_template): Set up the DECL_INITIAL of + member constants. + + * init.c (expand_member_init): Pull out TYPE_MAIN_VARIANT in + a ctor initializer. + + * tree.c (equal_functions): Fix name in prototype. + + * decl.c (push_local_binding): Add FLAGS argument. + (pushdecl, push_overloaded_decl): Pass it. + * decl2.c (do_local_using_decl): Likewise. + * cp-tree.h: Adjust prototype. + * decl.c (poplevel): Fix logic. + + * decl.c (push_local_binding): Also wrap used decls in a TREE_LIST. + (poplevel): Handle that. Fix logic for removing TREE_LISTs. + (cat_namespace_levels): Don't loop forever. + +1999-01-25 Richard Henderson + + * typeck.c (build_reinterpret_cast): Fix typo in duplicated test. + +1999-01-25 Jason Merrill + + * class.c (resolve_address_of_overloaded_function): Mark the + chosen function used. + + * call.c (build_call): Make sure that a function coming in has + been marked used already. + * decl.c (expand_static_init): Call mark_used instead of + assemble_external. + * except.c (call_eh_info, do_pop_exception, expand_end_eh_spec, + alloc_eh_object, expand_throw): Likewise. + * init.c (build_builtin_delete_call): Likewise. + * rtti.c (call_void_fn, get_tinfo_fn, build_dynamic_cast_1, + expand_si_desc, expand_class_desc, expand_ptr_desc, expand_attr_desc, + expand_generic_desc): Likewise. + +1999-01-25 Martin von Löwis + + * tree.c (equal_functions): New function. + (ovl_member): Call it. + +1999-01-24 Jason Merrill + + * cvt.c (cp_convert_to_pointer): Fix conversion of 0 to pmf. + +1999-01-25 Martin von Löwis + + * decl.c (decls_match): Return 1 if old and new are identical. + (push_overloaded_decl): Set OVL_USED when PUSH_USING. + +1999-01-24 Jason Merrill + + * decl.c (start_function): Make member functions one_only on windows. + * decl2.c (import_export_decl): Likewise. + + * decl.c (grokdeclarator): Don't complain about implicit int in + a system header. Change same-name field check to not complain in + a system header instead of within extern "C". + +1999-01-21 Mark Mitchell + + * cp-tree.h (PUSH_GLOBAL): New macro. + (PUSH_LOCAL): Likewise. + (PUSH_USING): Likewise. + (namespace_bindings_p): Declare. + (push_overloaded_decl): Likewise. + * decl.c (push_overloaded_decl): Don't make it static. Check for + illegal declarations after using declarations here. + (namespace_bindings_p): Likewise. + (duplicate_decls): Don't consider declarations from different + namespaces to be the same. + (pushdecl): Use symbolic PUSH_ constants in calls to + push_overloaded_decl. + (push_overloaded_decl_1): Likewise. + * decl2.c (validate_nonmember_using_decl): Tweak `std' handling. + (do_nonmember_using_decl): Check for illegal using declarations + after ordinary declarations here. + (do_local_using_decl): Call pushdecl to insert declarations. + +1999-01-21 Jason Merrill + + * decl.c (grokdeclarator): Fix lang_c -> lang_name_c typo. + +1999-01-21 Mark Mitchell + + * tree.c (build_cplus_array_type_1): Don't call build_array_type + for types involving template parameters. + + * cp-tree.h (PARM_DECL_EXPR): Delete. + (convert_default_arg): Change prototype. + (check_default_argument): Declare. + (search_tree): Likewise. + * call.c (convert_default_arg): Take the function to which the + default argument belongs as a parameter, and do any necessary + instantiation here, instead of ... + (build_over_call): Here. + * decl.c (local_variable_p): New function. + (check_default_argument): Likewise, split out and tidied from ... + (grokparms): Here. + * error.c (dump_expr): Don't set PARM_DECL_EXPR. + * pt.c (tsubst_call_declarator_parms): New function. + (for_each_template_parm): Handle ARRAY_REFs. Do the obvious thing + with CALL_EXPRs, rather than trying to be clever. + (tsubst): Use tsubst_call_declarator_parms. + * tree.c (search_tree): Don't make it static. + * typeck.c (convert_arguments): Use new interface to + convert_default_arg. + +1999-01-20 Mark Mitchell + + * error.c (dump_function_decl): Don't print the argument types for + a function when the verbosity level is negative. + + * call.c (build_over_call): Check format attributes at call-time. + + * pt.c (tsubst_copy): Fix comment. + (unify): Don't allow unification with variable-sized arrays. + + * semantics.c (finish_stmt_expr): When processing a template make + the BIND_EXPR long-lived. + +1999-01-19 Jason Merrill + + * decl2.c (finish_vtable_vardecl): Make vtables comdat here. + (import_export_vtable): Not here. + +1999-01-18 Jason Merrill + + * typeck.c (build_component_ref): Wrap an OVERLOAD around a unique + non-static member function. + +1999-01-18 Nathan Sidwell + + * class.c (instantiate_type): Only diagnose illegal address of member + function if complaining. + + * decl.c (lookup_name_real): Remove duplicate code. + +1999-01-18 Jason Merrill + + * tree.c (copy_template_template_parm): Use permanent_obstack. + +1999-01-18 Kriang Lerdsuwanakij + + * pt.c (unify): Remove restrictions on deduction of argument + of template template parameters. + +1999-01-18 Nathan Sidwell + + * rtti.c (build_dynamic_cast_1): Resolve OFFSET_REF exprs. + + * class.c (resolve_address_of_overloaded_function): Show list of + all candidates, when none of them match. + +1999-01-18 Chip Salzenberg + + * typeck.c (comp_ptr_ttypes_reinterpret): Per ANSI, tighten up + definition of 'casting away const' in reinterpret_cast<>. + +1999-01-18 Graham + + * cvt.c: Add include for decl.h, remove extern for + static_aggregates which is now provided by decl.h. + + * Makefile.in (cvt.o): Add dependency for decl.h and missing + dependencies for convert.h and flags.h. + +1999-01-18 Nathan Sidwell + + * decl2.c (do_dtors): Set current location to that of the + decl, for sensible diagnostics and debugging. + (check_classfn): Issue `incomplete type' error, if + class is not defined. + +1999-01-16 Jason Merrill + + * cp-tree.h: Add prototype for bound_pmf_p. + +1999-01-16 Jason Merrill + Manfred Hollstein + + * decl.c (grokdeclarator): Don't make 'main(){}' an error with only + -Wreturn-type. + +1999-01-16 Nathan Sidwell + + * cp-tree.h (struct lang_type): Added has_mutable flag. + (CLASSTYPE_HAS_MUTABLE): New macro to access it. + (TYPE_HAS_MUTABLE_P): New macro to read it. + (cp_has_mutable_p): Prototype for new function. + * class.c (finish_struct_1): Set has_mutable from members. + * decl.c (cp_finish_decl): Clear decl's TREE_READONLY flag, if + it contains a mutable. + * typeck.c (cp_has_mutable_p): New function. + +1999-01-15 Mark Mitchell + + * pt.c (process_template_parm): Ignore top-level qualifiers on + non-type parameters. + + * decl.c (start_function): Use current_function_parms in the call + to require_complete_type_for_parms, not the probably empty + DECL_ARGUMENTS. + +1999-01-14 Jason Merrill + + * semantics.c (finish_asm_stmt): Don't warn about redundant volatile. + + * decl2.c (import_export_class): MULTIPLE_SYMBOL_SPACES only means + that we don't suppress the other copies. + * lex.c (handle_cp_pragma): Likewise. + +1999-01-13 Mark Mitchell + + * decl.c (grokdeclarator): Undo 1998-12-14 change. + * tree.c (build_cplus_array_type_1): Likewise. + * pt.c (instantiate_class_template): Remove misleading comment. + (tsubst_aggr_type): Substitute if there are template parameters, + regardless of whether or not they use template arguments. + (unify): Likewise, but for unification. + +1999-01-12 Richard Henderson + + * cp-tree.h (flag_permissive): Declare extern. + +1999-01-06 Mark Mitchell + + * cp-tree.h (IDENTIFIER_TYPENAME_P): Use OPERATOR_TYPENAME_FORMAT + here. + (lang_type): Add is_partial_instantiation. Decrease width of + dummy. + (PARTIAL_INSTANTIATION_P): New macro. + (OPERATOR_TYPENAME_P): Remove. + * decl.c (unary_op_p): Use IDENTIFIER_TYPENAME_P, not + OPERATOR_TYPENAME_P. + (grok_op_properties): Likewise. + * friend.c (do_friend): Handle friends that are member functions + correctly. + * lex.c (init_parse): Use OPERATOR_TYPENAME_FORMAT. + * pt.c (instantiate_class_template): Rework for clarity. Avoid + leaving TYPE_BEING_DEFINED set in obscure cases. Don't do + any more partial instantiation than is absolutely necessary for + implicit typename. Set PARTIAL_INSTANTIATION_P. + (tsubst_decl): Use IDENTIFIER_TYPENAME_P. + * semantics.c (begin_class_definition): Handle partial + specializations of a type that was previously partially + instantiated. + +Wed Jan 6 03:18:53 1999 Mark Elbrecht + + * Make-lang.in (g++.o): Depend on prefix.h. + +1999-01-04 Jason Merrill + + * tree.c (bound_pmf_p): New fn. + * typeck.c (build_c_cast): Use it. + + * decl.c (grok_op_properties): Use same_type_p. + + +Copyright (C) 1999 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2000 b/gcc/cp/ChangeLog-2000 new file mode 100644 index 000000000..7be14cd5b --- /dev/null +++ b/gcc/cp/ChangeLog-2000 @@ -0,0 +1,7281 @@ +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 Löwis + + * 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 Löwis + + * 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. + + + +Copyright (C) 2000 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2001 b/gcc/cp/ChangeLog-2001 new file mode 100644 index 000000000..2bdb9f1ab --- /dev/null +++ b/gcc/cp/ChangeLog-2001 @@ -0,0 +1,3901 @@ +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. + + +Copyright (C) 2001 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2002 b/gcc/cp/ChangeLog-2002 new file mode 100644 index 000000000..16dc2cd60 --- /dev/null +++ b/gcc/cp/ChangeLog-2002 @@ -0,0 +1,4581 @@ +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. + + + +Copyright (C) 2002 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2003 b/gcc/cp/ChangeLog-2003 new file mode 100644 index 000000000..6dfb50afb --- /dev/null +++ b/gcc/cp/ChangeLog-2003 @@ -0,0 +1,6912 @@ +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. + + + +Copyright (C) 2003 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2004 b/gcc/cp/ChangeLog-2004 new file mode 100644 index 000000000..602745f7e --- /dev/null +++ b/gcc/cp/ChangeLog-2004 @@ -0,0 +1,6884 @@ +2004-12-31 Richard Henderson + + PR middle-end/17799 + * call.c (make_temporary_var_for_ref_to_temp): Set DECL_IGNORED_P. + * class.c (build_vtable): Don't conditionallize setting it + based on DWARF2_DEBUG. + (layout_class_type): Set DECL_IGNORED_P. + * decl2.c (get_guard): Likewise. + * rtti.c (get_tinfo_decl, build_lang_decl): Likewise. + * tree.c (build_local_temp): Likewise. + +2004-12-30 Mark Mitchell + + * cp-tree.h (cp_declarator): Split "name" field into + qualifying_scope and unqualified_name. + * decl.c (get_scope_of_declarator): Adjust accordingly. + (grokdeclarator): Likewise. + * decl2.c (grokfield): Likewise, and adjust call to + do_class_using_decl. + * name-lookup.c (do_class_using_decl): Split "decl" into + "scope" and "name". Remove unnecessary code. + * name-lookup.h (do_class_using_decl): Adjust declaration. + * parser.c (make_id_declarator): Split "id" into qualifying_scope + and unqualified_name. + (cp_parser_using_declaration): Adjust call to do_class_using_decl. + (cp_parser_direct_declarator): Adjust to handle the fact that + cp_parser_declarator_id no longer returns a SCOPE_REF. + (cp_parser_direct_declarator): Likewise. + (cp_parser_declarator_id): Do not create a SCOPE_REF for qualified + names. + (cp_parser_member_declaration): Adjust call to make_id_declarator. + (cp_parser_check_declarator_template_parameters): Do not expect a + SCOPE_REF. + + * decl.c (duplicate_decls): Call ggc_free on declarations we will + not be needing any longer. + + PR c++/19190 + * cvt.c (convert_to_void): Do not use STRIP_NOPs. + +2004-12-28 Richard Henderson + + PR inline-asm/15740 + * semantics.c (finish_asm_stmt): Resolve asm names. Validate input + constraints. Mark memory inputs addressable. + +2004-12-27 Jason Merrill + + * decl.c (expand_static_init): Don't use shortcut if + targetm.relaxed_ordering. + +2004-12-27 Mark Mitchell + + PR c++/19149 + * decl.c (check_tag_decl): Robustify. + +2004-12-23 Mark Mitchell + + PR c++/17595 + * parser.c (cp_parser_error): Issue better messages about + #pragma in locations where it is not permitted. + + PR c++/17413 + * pt.c (check_instantiated_args): Remove bogus SFINAE code. + + * cvt.c (convert_to_void): Fix typo in comment. + +2004-12-23 Alexandre Oliva + + PR c++/18962 + * pt.c (check_explicit_specialization): Use the argument list from + the definition in a template function specialization definition. + +2004-12-23 Giovanni Bajo + + PR c++/18733 + * pt.c (check_explicit_specialization): Use special logic to validate + befriended specializations. + +2004-12-22 Mark Mitchell + + * rtti.c (emit_support_tinfos): Avoid using C99 semantics. + + PR c++/18464 + * call.c (build_this): In templates, do not bother with + build_unary_op. + * typeck.c (unary_complex_lvalue): In a template, always refuse + simplifications. + + PR c++/18492 + * cp-gimplify.c (cp_genericize): Relax assertion. + + PR c++/11224 + * cvt.c (convert_to_void): Warn about unused values. + + PR c++/18257 + * rtti.c (emit_support_tinfos): On systems without weak symbols, + emit the runtime library type-info objects as non-COMDAT. + +2004-12-21 Mark Mitchell + + PR c++/18378 + * call.c (convert_like_real): Do not permit the use of a copy + constructor to copy a packed field. + + PR c++/19063 + * decl.c (grokdeclarator): Return error_mark_node, not + void_type_node, to indicate errors. + * parser.c (cp_parser_template_parameter_list): Robustify. + (cp_parser_template_parameter): Likewise. + + PR c++/19034 + * tree.c (cp_tree_equal): Handle OVERLOAD. + +2004-12-22 Volker Reichelt + + * decl.c (define_label): Use POP_TIMEVAR_AND_RETURN. + * name-lookup.c (pushdecl_class_level): Likewise. + +2004-12-21 Volker Reichelt + + * name-lookup.c (pushtag): Add missing POP_TIMEVAR_AND_RETURN. + +2004-12-21 Andrew Pinski + + PR c++/18984 + * cp-gimplify.c (cp_genericize_r): Don't insert first but instead + check to see if contains the pointer. Insert the statement before + returning. + +2004-12-21 Nathan Sidwell + + PR c++/14075 + * decl.c (check_initializer): Check string initializer of array is + not parenthesized. + * cp-tree.h (PAREN_STRING_LITERAL_P): New. + * semantics.c (finish_parenthesized_expr): Mark a STRING_CST. + * error.c (dump_expr): Add parens, if needed. + + * cp-tree.def (TEMPLATE_TYPE_PARM, + BOUND_TEMPLATE_TEMPLATE_PARM, TYPE_OF_TYPE, TYPENAME_TYPE): Reorder + for better code efficiency. + * cp-tree.h (CLASS_TYPE_P): Short circuit IS_AGGR_TYPE check. + (CAN_HAVE_FULL_LANG_DECL_P): Reorder for better optimization. + (INTEGRAL_CODE_P, CP_INTEGRAL_TYPE_P, + INTEGRAL_OR_ENUMERATION_TYPE_P, SCALAR_TYPE_P, + CP_AGGREGATE_TYPE_P, TYPE_PTROB_P, TYPE_REF_OBJ_P, + TYPE_PTROBV_P): Likewise. + + PR c++/18975 + * method.c (do_build_copy_constructor): Refactor. Don't const + qualify a mutable field. + (do_build_assign_ref): Likewise. + +2004-12-20 Matt Austern + + PR c++/19044 + * decl.c (make_rtl_for_nonlocal_decl): Use + set_builtin_user_assembler_name. + +2004-12-19 Mark Mitchell + + * cp-tree.h (note_decl_for_pch): New function. + * class.c (build_clone): Call note_decl_for_pch. + * semantics.c (finish_member_declaration): Likewise. + (note_decl_for_pch): New function. + +2004-12-17 Steven Bosscher + + * init.c (build_zero_init): max_index is the number of + elements, minus 1. + +2004-12-17 Nathan Sidwell + + PR c++/18721 + * class.c (add_method): Do not push conversion operators into a + binding level. + + * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE_TYPE): Reformat. + * error.c (dump_decl): Remove extraneous braces. + +2004-12-16 Nathan Sidwell + + PR c++/18905 + * cp-tree.h (integral_constant_value): Declare. + * call.c (null_ptr_cst_p): Use integral_constant_value, not + decl_constant_value. + (convert_like_real): Likewise. + * class.c (check_bitfield_decl): Likewise. + * cvt.c (ocp_convert): Likewise. + (convert): Remove unnecessary decl_constant_value call. + * decl.c (compute_array_index_type): Use integral_constant_value, + not decl_constant_value. + (build_enumerator): Likewise. + * decl2.c (grokfield): Likewise. + * init.c (decl_constant_value): Simplify. + (integral_constant_value): New. + * pt.c (fold_decl_constant_value): Use integral_constant_value, + remove subsequent check. + (tsubst): Use integral_constant_value, not decl_constant_value. + (tsubst_copy, unify): Likewise. + * typeck.c (decay_conversion): Likewise. + (build_compound_expr): Remove unnecessary decl_constant_value + calls. + (build_static_cast_1, build_reinterpret_cast_1): + (convert_for_assignment): Remove comment about not calling + decl_constant_value. + +2004-12-15 Kriang Lerdsuwanakij + + PR c++/18825 + * pt.c (instantiate_class_template): Set input_location for + friend function. + (tsubst_friend_function): Don't set input_location here. + Make sure the context is complete if necessary. + +2004-12-15 Nathan Sidwell + + PR c++/18981 + * parser.c (cp_parser_lookup_name): Remove unneeded TYPENAME_TYPE + flag setting. + +2004-12-14 Mark Mitchell + + PR c++/18738 + * decl.c (make_typename_type): Do not handle namespace-scoped + names here. + (tag_name): Handle typename_type. + (check_elaborated_type_specifier): Handle typenames. + * parser.c (cp_parser_diagnose_invalid_type_name): Improve + comment. + (cp_parser_elaborated_type_specifier): Use + cp_parser_diagnose_invalid_type_name. + +2004-12-14 Andrew Pinski + + PR c++/18965 + * init.c (build_zero_init): If the max_index is 0, there is no + need to create a RANGE_EXPR. + +2004-12-14 Mark Mitchell + + PR c++/18793 + * cp-objcp-common.c (cp_expr_size): Loosen assertion. + +2004-12-14 Nathan Sidwell + + PR c++/18949 + * pt.c (tsubst_copy_and_build): Check that a + REFERENCE_REF_P is dereferencing a reference type. + * typeck.c (build_static_cast): Convert from reference even in a + template. + (build_reinterpret_cast, build_const_cast, build_c_cast): Likewise. + +2004-12-14 Volker Reichelt + + * parser.c (cp_parser_uncommitted_to_tentative_parse_p): New function. + (cp_parser_name_lookup_error): Use it. + (cp_parser_check_for_invalid_template_id): Likewise. + (cp_parser_skip_to_closing_parenthesis): Likewise. + (cp_parser_nested_name_specifier_opt): Likewise. + (cp_parser_simple_declaration, cp_parser_template_id): Likewise. + (cp_parser_parameter_declaration_list): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_template_name): Let cp_parser_simulate_error perform + the checking. + (cp_parser_committed_to_tentative_parse): Remove. + +2004-12-13 Andrew Pinski + + PR c++/18968 + * class.c (build_base_path): Convert the zero constant to the correct + type when comparing. + +2004-12-13 Mark Mitchell + + PR c++/18925 + * class.c (layout_class_type): Determine the visibility of static + data members. + +2004-12-12 Roger Sayle + + PR middle-end/12454 + * cp-gimplify.c (gimplify_if_stmt): Optimize the case where the + condition is a constant and the unexecuted clause is empty. + +2004-12-10 Volker Reichelt + + PR c++/18731 + * parser.c (cp_parser_class_head): Reject typedef-name in class head. + +2004-12-09 Matt Austern + + PR c++/18514 + * name-lookup.c (do_nonmember_using_decl): A real function + declaration takes precedence over an anticipated declaration. + +2004-12-09 Volker Reichelt + + * parser.c (cp_parser_member_declaration): Fix comment typo. + +2004-12-09 Alexandre Oliva + + PR c++/18757 + * parser.c (cp_parser_template_id): Don't create a CPP_TEMPLATE_ID + if parsing failed. + +2004-12-09 Volker Reichelt + + PR c++/18073 + * typeck.c (build_reinterpret_cast_1): Allow cast from vector type. + +2004-12-09 Nathan Sidwell + + PR c++/16681 + * init.c (build_zero_init): Build a RANGE_EXPR for an array + initializer. + +2004-12-08 Kelley Cook + + * typeck.c: Remove DOS line endings. + +2004-12-08 Kriang Lerdsuwanakij + + PR c++/18100 + * decl.c (lookup_and_check_tag): Diagnose nested class with + the same name as enclosing class. + +2004-12-08 Nathan Sidwell + + PR c++/18803 + * cp-tree.h (REFERENCE_REF_P): New. + (CPTI_TYPE_INFO_TYPE): Rename to ... + (CPTI_CONST_TYPE_INFO_TYPE): ... here. + (CPTI_TYPE_INFO_REF_TYPE): Remove. + (type_info_type_node): Rename to ... + (const_type_info_type_node): ... here. + (type_info_ref_type): Remove. + * call.c (build_user_type_conversion): Reformat. + (resolve_args): Do not convert_from_reference. + (build_object_call): Call convert_from_reference. + (prep_operand): Do not convert_from_reference. + (build_new_method_call): Likewise. + * class.c (build_vfield_ref): Likewise. + * cvt.c (convert_to_reference): Likewise. + (convert_from_reference): Build INDIRECT_REF here, not with + build_indirect_ref. + (convert_force): Do not convert_from_reference. + (build_expr_type_conversion): Likewise. + * decl.c (grok_reference_init): Likewise. + * decl2.c (delete_sanity): Likewise. + * except.c (initialize_handler_parm): Use POINTER_TYPE_P. + * init.c (build_dtor_call): Do not convert_from_reference. + * parser.c (cp_parser_template_argument): Unwrap indirected + reference. Allow TEMPLATE_PARM_INDEX as an object parm. + * pt.c (tsubst_copy_and_build) : Use + convert_from_reference, if indicated. + : Do not convert_from_reference. + : Convert_from_reference if needed. + (tsubst_initializer_list): Do not convert_from_reference. + * rtti.c (init_rtti_processing): Adjust node creation. + (throw_bad_typeid): Use const_type_info_type_node. + Do not convert_from_reference. + (typeid_ok_p): Use const_type_info_type_node. + (build_typeid, get_typeid): Always return type_info typed node. + (build_dynamic_cast_1): Dont convert_from_reference. Refactor. + * semantics.c (finish_stmt_expr_expr): Do not + convert_from_reference. + (finish_id_expression): Convert_from_reference as appropriate. + * typeck.c (decay_conversion): Do not convert_from_reference. + (finish_class_member_access_expr): Likewise. + (build_indirect_ref): Use POINTER_TYPE_P. + (convert_arguments): Do not convert_from_reference. + (build_modify_expr): Likewise. + (convert_for_initialization): Likewise. + * typeck2.c (build_x_arrow): Likewise. + +2004-12-07 Ziemowit Laski + + * cp-tree.h (struct lang_type_class): Rename 'objc_protocols' + field to 'objc_info'. + +2004-12-07 Kazu Hirata + + * pt.c: Replace a use of first_rtl_op with TREE_CODE_LENGTH. + +2004-12-07 Roger Sayle + + * name-lookup.c (leave_scope): We only need to update + class_binding_level when leaving a class scope. + +2004-12-06 Ziemowit Laski + + * cp-tree.h (struct lang_type_class): Add 'objc_protocols' field. + +2004-12-04 Kriang Lerdsuwanakij + + PR c++/17011, c++/17971 + * pt.c (tsubst_copy) : Check and diagnose + invalid field. + (tsubst_copy_and_build) : Check + error_mark_node after member substitution. + * semantics.c (finish_id_expression): Call + finish_non_static_data_member for non-dependent FIELD_DECL. + +2004-12-03 Nathan Sidwell + + PR c++/18782 + * decl.c (grokdeclarator): Make sure class in pointer to member is + not a namespace. + +2004-12-02 Nathan Sidwell + + PR c++/18318 + * parser.c (cp_parser_new_type_id): Move array size expression + checks from here ... + * init.c (build_new): ... to here. + +2004-12-02 Nathan Sidwell + + PR c++/18758 + * parser.c (cp_parser_class_head): Return NULL_TREE when + push_template_decl fails. Update comment. + +2004-12-02 Kriang Lerdsuwanakij + + PR c++/15664, c++/18276 + * pt.c (tsubst_decl) : Reorganize. Correctly + tsubst TEMPLATE_DECL that is a TEMPLATE_TEMPLATE_PARM. + +2004-12-02 Kriang Lerdsuwanakij + + PR c++/18123 + * parser.c (cp_parser_type_specifier): Catch template declaration + of enum. + +2004-12-01 Matt Austern + + * name-lookup.c (namespace_binding): Omit alias check for global + namespace. + +2004-12-01 Nathan Sidwell + + PR c++/18729 + * parser.c (cp_parser_class_name): Check decl's type is not + error_mark_node. + + PR c++/17431 + * call.c (standard_conversion): Add FLAGS parameter. Do not allow + derived to base conversion when checking constructor + accessibility. + (implicit_conversion): Pass FLAGS to standard_conversion. + (check_constructir_callable): Disallow conversion functions. + +2004-11-30 Kazu Hirata + + * parser.c: Fix comment typos. + +2004-11-27 Mark Mitchell + + PR c++/18368 + * parser.c (cp_parser_check_for_definition_in_return_type): Take + the defined type as a parameter, and inform the user about the + possibility of a missing semicolon. + (cp_parser_explicit_instantiation): Adjust call to + cp_parser_check_for_definition_in_return_type. + (cp_parser_init_declarator): Likewise. + (cp_parser_member_declaration): Likewise. + + PR c++/18674 + * cp-tree.def (TYPENAME_TYPE): Remove discussion of implicit + typename from comments. + * cp-tree.h (TYPENAME_IS_ENUM_P): New macro. + (TYPENAME_IS_CLASS_P): Likewise. + (make_typename_type): Change prototype. + * decl.c (struct_typename_info): New type. + (typename_compare): Expect the second argument to be a + typename_info, not a tree. + (build_typename_type): Add tag_type parameter. Do not create a + new type until necessary. + (make_typename_type): Add tag_type parameter. + * error.c (TYPENAME_TYPE): Print tags other than "typename" if + appropriate. + * friend.c (make_friend_class): Adjust call to make_typename_type. + * parser.c (cp_parser_make_typename_type): Likewise. + (cp_parser_primary_expression): Adjust call to + cp_parser_lookup_name. + (cp_parser_unqualified_id): Adjust calls to cp_parser_class_name. + (cp_parser_class_or_namespace_name): Likewise. + (cp_parser_postfix_expression): Adjust calls to + make_typename_type. + (cp_parser_mem_initializer_id): Adjust calls to + cp_parser_class_name. + (cp_parser_type_parameter): Adjust calls to cp_parser_lookup_name. + (cp_parser_template_name): Likewise. + (cp_parser_template_argument): Likewise. + (cp_parser_type_name): Adjust call to cp_parser_class_name. + (cp_parser_elaborated_type_specifier): Adjust calls to + make_typename_type and cp_parser_lookup_name. + (cp_parser_namespace_name): Likewise. + (cp_parser_class_name): Replace type_p parameter with tag_type. + Adjust calls to make_typename_type and cp_parser_lookup_name. + (cp_parser_class_head): Adjust calls to cp_parser_class_name. + (cp_parser_base_specifier): Likewise. + (cp_parser_lookup_name): Replace is_type parameter with tag_type. + Adjust calls to make_typename_type and lookup_qualified_name. + (cp_parser_lookup_name_simple): Adjust call to + cp_parser_lookup_name. + (cp_parser_constructor_declarator_p): Adjust call to + cp_parser_class_name. + * pt.c (convert_template_argument): Adjust all to + make_typename_type. + (tsubst_decl): Do not pre-substitute the type of the declaration. + (tsubst): Hand off declarations more quickly. Adjust call to + make_typename_type. + + PR c++/18512 + * parser.c (cp_parser_postfix_dot_deref_expression): Robustify. + +2004-11-29 Daniel Jacobowitz + + PR c/7544 + * Make-lang.in (cp/decl2.o): Update dependencies. + * decl2.c (finish_file): Call maybe_apply_pending_pragma_weaks. + +2004-11-29 Kriang Lerdsuwanakij + + PR c++/18652 + * name-lookup.c (pushtag): Change return type to tree. + * cp-tree.h (pushtag): Adjust declaration. + * decl.c (xref_tag, start_enum): Use return value of pushtag. + * pt.c (push_template_decl_real): Return immediately if + pushdecl_namespace_level returns error_mark_node. + +2004-11-27 Kazu Hirata + + * pt.c: Fix a comment typo. + +2004-11-27 Kriang Lerdsuwanakij + + Friend class name lookup 4/n + * class.c (pushclass): Don't call cxx_remember_type_decls. + * cp-tree.h (clear_anon_tags): Remove declaration. + * decl.c (grokdeclarator): Don't call lookup_tag_reverse. + * name-lookup.c (binding_entry_free, binding_table_free): Comment + out functions. + (binding_table_find_anon_type, binding_table_reverse_maybe_remap, + binding_table_remove_anonymous_types, cxx_remember_type_decls, + bt_print_entry, clear_anon_tags, follow_tag_typedef, lookup_tag, + lookup_tag_reverse): Remove + (begin_scope, leave_scope, kept_level_p, print_binding_level): + Don't use type_decls field in cp_binding_level. + (maybe_process_template_type_declaration, pushtag): Set + CLASSTYPE_NESTED_UTDS directly. + * name-lookup.h (binding_table_remove_anonymous_types, + cxx_remember_type_decls, lookup_tag, lookup_tag_reverse): Remove + declaration. + (cp_binding_level): Remove type_decls field. + +2004-11-26 Kazu Hirata + + * typeck.c: Fix a comment typo. + +2004-11-25 Mark Mitchell + + PR c++/18445 + * class.c (instantiate_type): Treat NON_DEPENDENT_EXPRs with + unknown_type as non matching. Tidy up. + * pt.c (build_non_dependent_expr): Do not build a + NON_DEPENDENT_EXPR for a VAR_DECL. + + PR c++/18001 + * cp-tree.h (lvalue_or_else): Remove declaration. + * tree.c (lvalue_or_else): Remove. + * typeck.c (build_unary_op): Adjust call to lvalue_or_else. + (build_modify_expr): Likewise. + + PR c++/18625 + * decl.c (duplicate_decls): Return error_mark_node on error, as + specified. + + PR c++/18466 + * decl.c (grokvardecl): Keep track of whether or not a there was + explicit qualification. + * name-lookup.c (set_decl_namespace): Complain about explicit + qualification of a name within its own namespace. + + PR c++/18545 + * typeck.c (check_return_expr): Robustify. + +2004-11-25 Kriang Lerdsuwanakij + + Friend class name lookup 3/n, PR c++/3332 + * name-lookup.c (push_inner_scope, pop_inner_scope): New functions. + (lookup_type_scope): Don't deal with name from user declaration + specially. + * name-lookup.h (push_inner_scope, pop_inner_scope): Add declarations. + * parser.c (cp_parser_class_specifier): Use push_inner_scope and + pop_inner_scope. + +2004-11-25 Kriang Lerdsuwanakij + + Friend class name lookup 2/n, PR c++/14513, c++/15410 + * name-lookup.c (lookup_name_real): Simplify. + (lookup_type_scope): Add SCOPE parameter. Handle friend class + lookup. + * name-lookup.h (tag_scope): New enum type. + (lookup_type_scope): Adjust declaration. + * decl.c (lookup_and_check_tag, xref_tag, xref_tag_from_type): + Change bool parameter GLOBALIZED to TAG_SCOPE parameter SCOPE. + (start_enum): Likewise. Add assertion test that NAME is + IDENTIFIER_NODE. Use anonymous name for dummy ENUMERAL_TYPE in + case of error. + * cp-tree.h (xref_tag, xref_tag_from_type): Adjust declarations. + * parser.c (cp_parser_elaborated_type_specifier, + cp_parser_class_head): Adjust call to xref_tag. + * pt.c (lookup_template_class, instantiate_class_template): + Likewise. + * rtti.c (init_rtti_processing, build_dynamic_cast_1, + tinfo_base_init, emit_support_tinfos): Likewise. + +2004-11-25 Joseph S. Myers + + * g++spec.c, lex.c: Avoid ` as left quote in diagnostics. + +2004-11-24 Mark Mitchell + + PR c++/17473 + * name-lookup.c (supplement_binding): Do not allow typedefs to be + redefined in class scope. + + PR c++/18285 + * parser.c (cp_parser_set_decl_type_spec): Do not try to allow + redefinitions of builtin types other that "bool" or "wchar_t". + +2004-11-24 Steven Bosscher + + * decl.c (cxx_init_decl_processing): Don't clear + flag_inline_functions. + +2004-11-24 Mark Mitchell + + * pt.c (tsubst_function_type): Do not permit function types which + return arrays or functions. + + PR c++/18586 + * parser.c (cp_parser_init_declarator): Do not pop scope twice. + + PR c++/18530 + * cp-tree.h (CTOR_NAME): Remove. + (DTOR_NAME): Remove. + * decl.c (initialize_predefined_identifiers): Add spaces to the + end of constructor and destructor names. + +2004-11-24 Giovanni Bajo + + PR c++/8929 + * decl.c (start_decl): Check for invalid specialization headers. + +2004-11-24 Paolo Bonzini + + PR c++/16882 + + * call.c (standard_conversion): Move check for conversions between + vector pointers... + * typeck.c (ptr_reasonably_similar): ... here. + +2004-11-23 Ben Elliston + + * cp-tree.h (context_as_string): Remove extern. + * error.c (context_as_string): Remove. + + * cp-tree.h (cp_type_qual_from_rid): Remove extern. + * lex.c (cp_type_qual_from_rid): Remove. + + * cp-tree.h (do_poplevel): Remove extern. + (check_multiple_declarators): Likewise. + * semantics.c (do_poplevel): Make static. + (check_multiple_declarators): Remove. + + * cp-tree.h (check_final_overrider): Remove extern. + * search.c (check_final_overrider): Make static. + + * cp-tree.h (build_artificial_parm): Remove extern. + * decl2.c (build_artificial_parm): Make static. + +2004-11-22 Giovanni Bajo + + PR c++/18354 + * typeck.c (build_unary_op) : Unify code. + Make sure the result is always a rvalue. + +2004-11-16 Giovanni Bajo + + * decl.c (start_preparsed_function): Call check_function_type even + in templates. + (require_complete_types_for_parms): Skip dependent types. + (check_function_type): Likewise. + +2004-11-16 Steven Bosscher + + * Make-lang.in (cp/decl.o, cp/search.o): Don't depend on stack.h. + * search.c: Don't include it. + +2004-11-15 Andrew Pinski + + * cp-gimplify.c: Include pointer-set.h + (cp_genericize_r): Use pointer_sets instead of a hashtable. + Also instert the new statement for CLEANUP_STMT. + (cp_genericize): Use pointer_sets instead of a hashtable. + * Make-lang.in (cp-gimplify.o): Depend on pointer-set.h. + +2004-11-15 Kriang Lerdsuwanakij + + Friend class name lookup 1/n, PR c++/18471 + * decl.c (lookup_and_check_tag): New function. + (xref_tag, start_enum): Use it. + (check_elaborated_type_specifier): Move TEMPLATE_TYPE_PARM check + before !DECL_IMPLICIT_TYPEDEF_P. Also display previously declared + location. + * name-lookup.c (lookup_name_current_level): Rename to ... + (lookup_name_innermost_nonclass_level): ... this. + (lookup_type_scope): New function. + * name-lookup.h (lookup_name_current_level): Rename to ... + (lookup_name_innermost_nonclass_level): ... this. + (lookup_type_scope): Add declaration. + +2004-11-14 Kriang Lerdsuwanakij + + PR c++/17344 + * pt.c (coerce_template_parms): Only emit error message about + invalid template argument when TF_ERROR. + +2004-11-12 Mark Mitchell + + PR c++/18389 + * decl.c (start_decl): Make sure to set *pop_scope_p. Return + error_mark_node to indicate errors. + + PR c++/18429 + * parser.c (cp_parser_direct_declarator): Disallow non-constant + array bounds when not inside a function. + + PR c++/18436 + * pt.c (tsubst_copy_and_build): Do not do Koenig lookup when an + unqualified name resolves to a member function. + + PR c++/18407 + * pt.c (tsubst_copy_and_build): Handle qualified names used from a + derived class correctly. + + * decl2.c (import_export_decl): Fix typo in comment. + * tree.c (pod_type_p): Likewise. + +2004-11-10 Andrew Pinski + + * typeck.c (cxx_mark_addressable): Add braces around the first if. + +2004-11-10 Adam Nemet + + PR middle-end/18160 + * typeck.c (cxx_mark_addressable): Issue an error if address of an + explicit register variable is requested. + +2004-11-10 Nathan Sidwell + + PR c++/18143 + * cp-tree.h (NON_THUNK_FUNCTION_CHECK, THUNK_FUNCTION_CHECK): New. + (struct lang_decl_flags): Add thunk_p flag. + (struct lang_decl): Remove separate fixed_offset. Place + cloned_function and fixed_offset into union. + (DECL_CLONED_FUNCTION_P, DECL_CLONED_FUNCTION): Adjust. + (DECL_THUNK_P, SET_DECL_THUNK_P): Adjust. + (THUNK_FIXED_OFFSET): Adjust. + * method.c (make_thunk): Adjust. + +2004-11-09 Mark Mitchell + + PR c++/18369 + * init.c (build_new_1): Handle parenthesized type-ids that name an + array type. Tidy. + +2004-11-09 Joseph S. Myers + + * call.c, class.c, decl.c, decl2.c, error.c, mangle.c, parser.c, + pt.c, search.c, semantics.c, typeck.c: Use %q, %< and %> for + quoting in diagnostics. + * parser.c (cp_parser_sizeof_operand): Use '' instead of `' for + quoting in printf format. + * decl.c (duplicate_decls, start_decl): Use %qD instead of + unquoted %D. + +2004-11-08 Kazu Hirata + + * class.c, decl.c, lex.c, name-lookup.c, parser.c, pt.c, + search.c, typeck2.c: Fix comment formatting. + +2004-11-04 Ulrich Weigand + + PR tree-optimization/18184 + * cp-objcp-common.c (cxx_types_compatible_p): Do not treat pointers + of different modes or alias-all flags as equivalent. + * typeck.c (comptypes): Likewise. + +2004-11-04 Giovanni Bajo + + DR 49, 100 + * cp-tree.h (TYPE_REF_OBJ_P): New macro. + (TYPE_PTR_P, TYPE_PTROB_P, TYPE_PTROBV_P, TYPE_PTRFN_P, + TYPE_REFFN_P): Document. + (fold_decl_constant_value): New prototype. + * pt.c (convert_nontype_argument_function): Rewrite and extract + parts into... + (fold_decl_constant_value, convert_nontype_argument_function): New. + (lookup_template_class): Add comment about useless double call. + * mangle.c (write_expression): Strip conversions before lowering + pointer to members. + * cvt.c (ocp_convert): Check LOOKUP_COMPLAIN for a pedwarn. Disallow + enum to enum conversion. + +2004-11-02 Mark Mitchell + + PR c++/18124 + * parser.c (cp_parser_type_parameter): Robustify. + + PR c++/18155 + * parser.c (cp_parser_single_declaration): Disallow template + typedefs. + + PR c++/18177 + * typeck.c (build_const_cast): Use error_operand_p. + +2004-11-02 Ziemowit Laski + + * cp-lang.c (cxx_types_compatible_p): Remove prototype and definition. + (LANG_HOOKS_TYPES_COMPATIBLE_P): Move to cp-objcp-common.h. + * cp-objcp-common.c (cxx_types_compatible_p): Moved definition here + from cp-lang.c. + * cp-objcp-common.h (cxx_types_compatible_p): Moved prototype here + from cp-lang.c. + (LANG_HOOKS_TYPES_COMPATIBLE_P): Moved here from cp-lang.c. + +2004-11-01 Nathan Sidwell + + PR c++/18064 + * search.c (check_final_overrider): Deprecate gnu covariant extension. + +2004-10-31 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 9/n + * typeck.c (build_x_unary_op, convert_member_func_to_ptr, + get_delta_difference): Use new quotation style. + * repo.c (reopen_repo_file_for_write): Likewise. + * pt.c (do_type_instantiation): Likewise. + * parser.c (cp_parser_diagnose_invalid_type_name): + * name-lookup.c (push_overloaded_decl, set_decl_namespace): + * error.c (cp_print_error_function, + print_instantiation_full_context): Likewise. + * decl.c (define_label, grok_reference_init, + maybe_deduce_size_from_array_init, revert_static_member_fn): + * decl2.c (check_classfn): Likewise. + * class.c (add_method, check_field_decls, layout_class_type, + resolve_address_of_overloaded_function): Likewise. + * call.c (build_x_va_arg, build_over_call): Likewise. + +2004-10-31 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 8/n + * cvt.c (cp_convert_to_pointer, warn_ref_binding, + convert_to_reference, ocp_convert, convert_to_void + cp_convert_to_pointer): Use new quotation style. + +2004-10-31 Mark Mitchell + + PR c++/15172 + * typeck2.c (store_init_value): Use split_nonconstant_init even + for types that require construction. + +2004-10-28 Matt Austern + + PR c++/17542 + * cp-tree.h (class_key_or_enum_as_string): Declare. + * error.c (class_key_or_enum): Rename to class_key_or_enum_as_string + and remove static qualifier. + * decl.c (shadow_tag): Warn about ignored attributes in class/struct/ + union/enum declaration. + +2004-10-29 Kazu Hirata + + * pt.c: Fix a comment typo. + +2004-10-28 Nathan Sidwell + + * typeck.c (composite_pointer_type): Remove comment about DR 195. + (build_reinterpret_cast_1): Revert DR195 patch. Only emit a + warning when being pedantic. + (build_reinterpet_cast, build_c_cast): Adjust. + +2004-10-29 Mark Mitchell + + PR c++/17695 + * decl.c (grokdeclarator): Mark TYPE_DECLs as abstract when they + appear in a constructor/destructor that will be cloned. + +2004-10-28 Matt Austern + + PR c++/14124 + * decl.c (finish_enum): Handle packed attribute. + * parser.c (cp_parser_enum_specifier): Process trailing attributes. + +2004-10-28 Mark Mitchell + + PR c++/17132 + * pt.c (instantiate_class_template): Increment + processing_template_decl when substituting into a member class + template. + +2004-10-27 Mark Mitchell + + PR c++/17435 + * call.c (convert_like_real): Fix formatting. + (initialize_reference): When binding a temporary to a base class, + ensure that the nominal copy made is to the derived class, not the + base class. + + PR c++/18140 + * parser.c (cp_parser_next_token_ends_template_argument_p): Do not + include ">>". + +2004-10-27 Andrew Pinski + + * decl.c (bad_specifiers): Move the q after the %. + +2004-10-27 Andrew Pinski + + * parser.c (cp_parser_diagnose_invalid_type_name): Move the q after + the %. + +2004-10-26 Mark Mitchell + + * name-lookup.c (do_namespace_alias): Use FROB_CONTEXT. + * search.c (current_scope): Fix prototype. + + PR c++/18093 + * search.c (current_scope): Return the innermost non-block scope, + not the innermost non-block, non-namespace scope. + (at_namespace_scope_p): Adjust accordingly. + (dfs_accessible_post): Do not pass namespaces to is_friend. + (dfs_walk_once_accessible_r): Likewise. + * decl.c (grokvardecl): Adjust call to current_scope. + (build_enumerator): Likewise. + * parser.c (cp_parser_using_declaration): Likewise. + (cp_parser_direct_declarator): Use at_namespace_scope_p instead of + current_scope. + (cp_parser_class_head): Adjust call to current_scope. + * name-lookup.c (do_namespace_alias): Set the DECL_CONTEXT for the + alias. + + PR c++/18020 + * pt.c (tusbst_copy_and_build): Resolve enumeration constants to + their underlying values. + + PR c++/18161 + * typeck.c (build_binary_op): Honor build_type, even when in a + template. + +2004-10-26 Nathan Sidwell + + * parser.c (cp_lexer_get_preprocessor_token): Remove unneeded + padding token checking. + +2004-10-25 Andrew Pinski + + PR c++/18121 + * decl.c (grokdeclarator) : Remove the call + layout_type as it is already done by create_array_type_for_decl. + +2004-10-22 Nathan Sidwell + + PR c++/18095 + * parser.c (eof_token): Make const, correctly initialize rid and + location fields. + (struct cp_lexer): Replace buffer_end pointer with buffer_length + count. Adjust. + (cp_lexer_new_main): Directly grow lexer's buffer here. Don't + zero it out. + (cp_lexer_new_from_tokens): Adjust. + (cp_lexer_grow_buffer): Remove. + (cp_lexer_peek_nth_token, cp_lexer_consume_token, + cp_lexer_purge_token): Add const casts. + +2004-10-21 Mark Mitchell + + PR c++/18073 + PR c++/10841 + * cp-tree.h (convert_to_base): Change prototype. + (build_ptrmemfunc): Likewise. + (convert_ptrmem): New function. + * call.c (struct conversion): Adjust documentation for base_p. + (standard_conversion): Set base_p for ck_pmem conversions as + appropriate. + (convert_like_real): Use convert_to_base for ck_pmem and ck_ptr + conversions. + * class.c (convert_to_base): Handle both pointers and objects. + Add nonnull parameter. + (build_vfield_ref): Adjust call to convert_to_base. + * cvt.c (cp_convert_to_pointer): Adjust call to build_ptrmemfunc. + (convert_force): Likewise. + * typeck.c (build_unary_op): Likewise. + (convert_ptrmem): New function. + (build_static_cast_1): Use it. + (build_reinterpret_cast): Allow conversions to vector types. + (get_delta_difference): Add c_cast_p parameter. + (build_ptrmemfunc): Likewise. Adjust calls to + get_delta_difference. + +2004-10-21 Andrew Pinski + + PR c++/13560 + * error.c (cp_error_at): Output the context as it might be + different file as the other location. + +2004-10-21 Kazu Hirata + + * typeck.c: Fix a comment typo. + +2004-10-20 Kriang Lerdsuwanakij + + PR c++/13495 + * decl.c (make_unbound_class_template): Add PARM_LIST parameter. + * cp-tree.h (make_unbound_class_template): Adjust prototype. + * parser.c (cp_parser_lookup_name): Adjust call to + make_unbound_class_template. + (cp_parser_single_declaration): Handle member class of class + template as template friend parsing correctly. + * friend.c (is_friend): Call is_specialization_of_friend for + template friend class. + (make_friend_class): Handle member class of class template as + template friend. + * pt.c (is_specialization_of_friend): Likewise. + (instantiate_class_template): Likewise. + (tsubst): Adjust call to make_unbound_class_template. + +2004-10-20 Nathan Sidwell + + * typeck.c (composite_pointer_type): Add comment about DR 195 + (build_reinterpret_cast_1): Add for_reinterpret_cast_p parameter. + Allow function pointer conversions that DR195 suggests. + (build_reinterpret_cast, build_c_cast): Update + build_reinterpret_cast_1 calls. + +2004-10-20 Kazu Hirata + + * call.c, typeck.c: Fix comment typos. + +2004-10-20 Nathan Sidwell + + * parser.c (cp_token_position): New typedef. Define VEC thereof. + (struct cp_lexer): Allow buffer and buffer_end to be NULL. Make + next_token and last_token cp_token_position. Make saved_tokens a + VEC(cp_token_position). + (eof_token): New static variable. + (CP_SAVED_TOKENS_SIZE): Rename to ... + (CP_SAVED_TOKEN_STACK): ... here. + (cp_lexer_new_main): Adjust main lexer creation and buffer + filling. + (cp_lexer_new_from_tokens): Do not copy the tokens, merely point + to the parent buffer. Do not append eof token. + (cp_lexer_destroy): Only free buffer if non-NULL. Free token + stack. + (cp_lexer_next_token, cp_lexer_prev_token): Remove. + (cp_lexer_token_position, cp_lexer_token_at): New. + (cp_lexer_saving_tokens): Adjust. Make inline. + (cp_lexer_advance_token, cp_lexer_token_difference): Remove. + (cp_lexer_peek_token_emit_debug_info): Fold into ... + (cp_lexer_peek_token): ... here. + (cp_lexer_peek_nth_token): Don't peek past EOF. + (cp_lexer_consume_token): Set next_token to eof_token, if reaching + EOF. + (cp_lexer_purge_token): Adjust eof setting. + (cp_lexer_purge_tokens_after): Likewise. + (cp_lexer_save_tokens): Push next_token directly. + (cp_lexer_commit_tokens): Adjust. + (cp_lexer_rollback_tokens): Pop next_token directly. + (cp_parser_check_for_invalid_template_id): Adjust token purging. + (cp_parser_translation_unit): Do not consume the EOF. + (cp_parser_nested_name_specifier_opt): Adjust token purging. + (cp_parser_template_id, cp_parser_template_name): Likewise. + +2004-10-19 Mark Mitchell + + PR c++/14035 + * call.c (struct conversion): Add base_p. + (convert_like): Add c_cast_p argument. + (convert_like_with_conversion): Likewise. + (build_conv): Clear base_p. + (standard_conversion): Set it, for derived-to-base conversions. + (convert_like_real): Add c_cast_p parameter. Handle pointer + conversions directly rather than relying on ocp_convert. + (perform_direct_initialization_if_possible): Add c_cast_p + parameter. + * cp-tree.h (perform_direct_initialization_if_possible): Change + prototype. + (convert_member_func_to_ptr): New function. + * typeck.c (check_for_casting_away_constness): Add diag_fn + parameter. + (build_static_cast_1): New function, split out from ... + (build_static_cast): ... here. Use build_static_cast_1. + (build_reinterpret_cast_1): New function, split out from ... + (build_reinterpret_cast): ... here. Use build_reinterpret_cast_1. + (build_const_cast_1): New function, split out from ... + (build_const_cast): ... here. Use build_const_cast_1. + (build_c_cast): Rewrite to use build_const_cast_1, + build_static_cast_1, and build_reinterpret_cast_1. + (convert_member_func_to_ptr): New function. + +2004-10-19 Paolo Bonzini + + PR c++/18047 + * parser.c (enum cp_parser_prec): Give relational expressions + a higher precedence than equality expressions. + +2004-10-15 Nathan Sidwell + + * cp-tree.h (UNIQUELY_DERIVED_FROM_P): Adjust lookup_base call. + (ACCESSIBLY_UNIQUELY_DERIVED_P): Remove. + (PUBLICLY_UNIQUELY_DERIVED_P): Adjust lookup_base call. + (enum base_access): Reorganize. + (accessible_base_p, accessible_p): Add consider_local_p parameter. + * call.c (standard_conversion): Update comment about + DERIVED_FROM_P. + (enforce_access): Adjust accessible_p call. + (build_over_call): Adjust accessible_base_p call. + * class.c (convert_to_base): Adjust lookup_base call. + (build_vtbl_ref_1): Likewise. + (warn_about_ambiguous_bases): Likewise. Add early exit. + * cvt.c (convert_to_pointer_force) Adjust lookup_base call. + * search.c (accessible_base_p): Add consider_local_p parameter. + (lookup_base): Pass consider_local_p to accessible_base_p call. + (friend_accessible_p): Check whether scope is a class member. + Remove unnecessary class template check. + (accessible_p): Add consider_local_p parameter. Use it. + (adjust_result_of_qualified_name_lookup): Adjust lookup_base call. + * tree.c (maybe_dummy_object): Likewise. + * typeck.c (comp_except_type): Use PUBLICLY_UNIQUELY_DERIVED_P. + (build_class_member_access_expr): Adjust lookup_base call. + * typeck2.c (binfo_or_else): Likewise. + * rtti.c (build_dynamic_cast_1): Access can consider friendship + and current scope. + +2004-10-17 Giovanni Bajo + + PR c++/17743 + * decl2.c (grokfield): Apply attributes also to TYPE_DECLs. + +2004-10-16 Giovanni Bajo + + PR c++/10479 + * parser.c (cp_parser_parenthesized_expression_list): Fold + non-dependent expressions in attribute lists. + +2004-10-15 Mark Mitchell + + PR c++/17042 + * decl.c (declare_global_var): Use the return value from pushdecl. + + PR c++/14667 + * parser.c (cp_parser_simple_declaration): Do not diagnose invalid + type names if we have already found a valid type. + (cp_parser_member_declaration): Likewise. + + PR c++/17916 + * parser.c (cp_parser_member_specification_opt): Handle + CPP_PRAGMA. + +2004-10-15 Kazu Hirata + + * dump.c, g++spec.c, repo.c: Update copyright. + +2004-10-15 Kazu Hirata + + * decl.c: Fix a comment typo. + +2004-10-13 Andrew Pinski + + PR c++/16301 + * name-lookup.c (parse_using_directive): If we have a + error_mark_node, do not set the decl namespace associations + on it. + +2004-10-14 Mark Mitchell + + PR c++/17976 + * decl.c (cp_finish_decl): Do not call expand_static_init more + than once for a single variable. + +2004-10-14 Matt Austern + + * Make-lang.in (pt.o): depends on pointer-set.h + * cp-tree.h (cp_walk_subtrees): Last argument is pointer_set_t* now. + * pt.c (struct pair_fn_data): Use pointer_set_t, not htab_t + (for_each_template_parm): Convert from htab_t to pointer_set_t. + * tree.c (cp_walk_subtrees): Last argument is pointer_set_t* now. + +2004-10-13 Andrew Pinski + + PR c++/17661 + * semantics.c (finish_for_expr): Convert expression to void + so that we don't create temporaries for a?b:c. + +2004-10-13 Kazu Hirata + + * search.c: Fix a comment typo. + +2004-10-12 Nathan Sidwell + + * class.c (dfs_modify_vtables): Simplify condition. Return + dfs_skip_bases as appropriate. + (modify_all_vtables): Walk in pre-order. + * search.c (dfs_walk_all, dfs_walk_once_r, + dfs_walk_once_accessible_r): Assert post order function never + returns dfs_skip_bases. + + * search.c (struct lookup_base_data_s): New. + (lookup_base_r): Replace with ... + (dfs_lookup_base): ... this. + (lookup_base): Use dfs_walk_all. + +2004-10-12 Kazu Hirata + + * search.c: Fix comment typos. + +2004-10-11 Mark Mitchell + + PR c++/15786 + * parser.c (cp_parser_declarator): Add member_p parameter. + (cp_parser_condition): Adjust calls to cp_parser_declarator. + (cp_parser_explicit_instantiation): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_direct_declarator): Add member_p parameter. Do not + parse tentatively when parsing the parameters to a member. + (cp_parser_type_id): Adjust calls to cp_parser_declarator. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_exception_declaration): Likewise. + + PR c++/17936 + * cp-tree.h (CLASSTYPE_TEMPLATE_SPECIALIZATION): Add a comment. + * pt.c (optimize_specialization_lookup_p): Do not optimize lookups + for members of partial or explicit specializations. + + PR c++/17929 + * decl2.c (finish_anon_union): Robustify. + +2004-10-11 Nathan Sidwell + + * cp-tree.h (get_dynamic_cast_base_type): Rename to ... + (dcast_base_hint): ... here. + * rtti.c (build_dynamic_cast_1): Use dcast_base_hint. + * search.c (struct dcast_data_s): New. + (dynamic_cast_base_recurse): Remove. Replace with ... + (dfs_dcast_hint_pre, dfs_dcast_base_post): ... these. New. + (get_dynamic_cast_base_type): Rename to ... + (dcast_base_hint): ... here. Use dfs_walk_once_accessible. + (accessible_r): Remove. + (dfs_accessible_post): New, broken out of accessible_r. + (accessible_p): Use dfs_walk_once_accessible. + (dfs_walk_once_accessible_r): New. From accessible_r. + (dfs_walk_once_accessible): New. From acessible_p. + + * cp-tree.h (SAME_BINFO_TYPE_P): New. + * class.c (build_base_path): Use SAME_BINFO_TYPE_P to compare + binfo types. + (convert_to_base_statically, determine_primary_bases, + update_vtable_entry_for_fn, dfs_modify_vtables, build_vtt_inits, + dfs_build_secondary_vptr_vtt_inits, build_ctor_vtbl_group, + accumulate_vtbl_inits, dfs_accumulate_vtbl_inits, + build_vtbl_initializer, add_vcall_offset_vtbl_entries_1): Likewise. + * init.c (expand_member_init): Likewise. + * search.c (lookup_base_r, dynamic_cast_base_recurse, + binfo_via_virtual, copied_binfo, binfo_for_vbase, + original_binfo): Likewise. + * tree.c (copy_binfo): Likewise. + +2004-10-11 Kazu Hirata + + * semantics.c: Fix comment typos. + +2004-10-10 Andrew Pinski + + PR c++/17554 + part of c++/17657 + middle-end/17703 + * semantics.c (maybe_cleanup_point_expr): Call + fold_build_cleanup_point_expr. + (maybe_cleanup_point_expr_void): New function. + (add_decl_expr): Call maybe_cleanup_point_expr_void. + (finish_expr_stmt): Likewise. + (finish_return_stmt): Likewise. + (finish_for_expr): Likewise. + (finish_asm_stmt): Likewise. + * typeck.c (condition_conversion): Call + fold_build_cleanup_point_expr. + +2004-10-10 Andrew Pinski + + PR c++/17907 + * semantics.c (add_decl_expr): If the decl has a size which + has side effects then the decl expression needs a cleanup point. + +2004-10-10 Mark Mitchell + + PR c++/17393 + * decl.c (grokdeclarator): Robustify error-recovery on invalid + declarations. + +2004-10-10 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 7/n + * typeck.c (composite_pointer_type_r, composite_pointer_type, + cxx_sizeof_or_alignof_type, cxx_sizeof_or_alignof_expr, + string_conv_p, build_class_member_access_expr, + build_class_member_access_expr, lookup_destructor, + finish_class_member_access_expr, build_indirect_ref, + get_member_function_from_ptrfunc, build_function_call, + convert_arguments, build_binary_op, pointer_diff, build_unary_op, + check_for_casting_away_constness, build_static_cast, + build_reinterpret_cast, build_const_cast, build_c_cast, + build_modify_expr, get_delta_difference, build_ptrmemfunc, + dubious_conversion_warnings, convert_for_assignment, + convert_for_initialization, + maybe_warn_about_returning_address_of_local, check_return_expr): + Use quoting marks. + + * typeck2.c (error_not_base_type, readonly_error, + abstract_virtuals_error, cxx_incomplete_type_diagnostic, + store_init_value, digest_init, build_x_arrow, + build_m_component_ref, require_complete_eh_spec_types): Likewise. + + * tree.c (cp_build_qualified_type_real, + handle_java_interface_attribute, handle_init_priority_attribute): + Likewise. + + * semantics.c (finish_asm_stmt, finish_non_static_data_member, + finish_pseudo_destructor_expr, + check_template_template_default_arg, begin_class_definition, + finish_base_specifier, qualified_name_lookup_error, + finish_id_expression, finish_typeof): Likewise. + + * search.c (lookup_base, check_final_overrider, + look_for_overrides_r): Likewise. + + * rtti.c (get_tinfo_decl, build_dynamic_cast_1): Likewise. + +2004-10-09 Mark Mitchell + + PR c++/17867 + * error.c (dump_expr): Correct handling of AGGR_INIT_EXPRs using a + constructor. + + PR c++/17670 + * init.c (build_new): Correct comments. + * parser.c (cp_parser_new_expression): Use NULL_TREE for nelts in + the non-array case. + + PR c++/17821 + * parser.c (cp_parser_postfix_dot_deref_expression): If the + pseduo-destructor-name production does not work, fall back to the + ordinary production. + + PR c++/17826 + * tree.c (cp_tree_equal): Handle a BASELINK. + + PR c++/17524 + * cp-tree.h (check_var_type): New function. + * decl.c (check_var_type): New function, split out from ... + (grokdeclarator): ... here. + * pt.c (tsubst_decl): Use check_var_type. + + PR c++/17685 + * decl.c (grokdeclarator): Disallow declarations of operators as + non-functions. + +2004-10-08 Volker Reichelt + + PR c++/17868 + * error.c (dump_expr): Add missing case for RDIV_EXPR. + +2004-10-08 Kazu Hirata + + * pt.c, search.c: Fix comment typos. + +2004-10-08 Nathan Sidwell + + * cp-tree.h (dfs_walk, dfs_walk_real, dfs_unmark, markedp, + unmarkedp): Remove. + (dfs_skip_bases, dfs_walk_all, dfs_walk_once): New. + * class.c (struct find_final_overrider_data): Remove most_derived, + vpath_list and vpath fields. Add path field. + (dfs_find_final_ocerrider_1): Add DEPTH parameter. Adjust. + (dfs_find_final_overrider): Rename to ... + (dfs_find_final_overrider_pre): ... here. Adjust. + (dfs_find_final_overrider_post): Adjust. + (dfs_find_final_overrider_q): Fold into + dfs_find_final_overrider_pre. + (find_final_overrider): Adjust dfs searching. + (dfs_modify_vtables): Don't mark binfo here. + (modify_all_vtables): Use dfs_walk_once. + (build_vtt_inits): Likwise. Use dfs_walk_all. + (dfs_build_secondary_vptr_vtt_inits): Don't mark binfo here. + Return dfs_skip_bases as appropriate. + (dfs_fixup_binfo_vtbls): Return dfs_skip_bases as appropriate. + * init.c (dfs_initialized_vtbl_ptrs): Return dfs_skip_bases as + appropriate. Don't mark binfo here. + (initialize_vtbl_ptrs): Use dfs_walk_once. + * search.c (struct vbase_info): Remove unused struct. + (access_in_type): Use dfs_walk_once. + (dfs_access_in_type): Don't mark binfo here. + (dfs_accessible_queue_p, dfs_accessible_p) Remove. + Fold into ... + (accessible_r): ... here. New. Specialize dfs_walk_once. + (accessible_p): Use accessible_r. + (lookup_field_queue_p): Remove. Fold into ... + (lookup_field_r): ... here. Adjust. + (lookup_member): Use dfs_walk_all. + (dfs_walk_real, dfs_walk): Replace with ... + (dfs_walk_all, dfs_walk_once): ... these. + (dfs_walk_once_r, dfs_unmark_r): Workers for dfs_walk_once. + (dfs_unmark, unmarkedp, markedp): Remove. + (dfs_get_pure_virtuals): Don't mark binfo here. + (get_pure_virtuals): Use dfs_walk_once. + (dfs_debug_unmarked_p): Remove. Fold into ... + (dfs_debug_mark): ... here. + (note_debug_info_needed): Use dfs_walk_all. + +2004-10-07 Andrew Pinski + + * pt.c (tsubst_expr) : Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-07 Mark Mitchell + + * cp-tree.h (ICS_USER_FLAG): Remove comment about obsolete flag. + (DECL_MEMBER_TEMPLATE_P): New macro. + (is_member_template): Remove. + (class_method_index_for_fn): New function. + * pt.c (build_over_call): Use DECL_MEMBER_TEMPLATE_P. + * class.c (finish_struct_methods): Remove out-of-date comment. + * decl.c (copy_fn_p): Use DECL_MBMER_TEMPLATE_P. + * decl2.c (check_classfn): Use DECL_MEMBER_TEMPLATE_P and + class_method_index_for_fn. + * pt.c (is_member_template): Remove. + (is_member_template_class): Likewise. + (optimize_specialization_lookup_p): New function. + (retrieve_specialization): Optimize lookups for members that are + not member templates. + (register_specialization): Adjust accordingly. + (build_template_decl): Add member_template_p parameter. Set + DECL_MEMBER_TEMPLATE_P. + (process_partial_specialization): Adjust call to + retrieve_specialization. + (push_template_decl_real): Determine whether the template is a + member template. + (lookup_template_class): Use retrieve_specialization. + (tsubst_decl): Adjust call to retrieve_specialization. + (tsubst_exception_specification): New function. + (tsubst): Use it. + (tsubst_copy): Use DECL_MEMBER_TEMPLATE_P. + (instantiate_template): Adjust call to retrieve_specialization. + (regenerate_decl_from_template): Do not actually generate a new + DECL. + (instantiate_decl): Adjust call to retrieve_specialization. + (class_method_index_for_fn): New method. + +2004-10-07 Andrew Pinski + + * parser.c (cp_parser_asm_definition): Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-06 Andrew Pinski + + PR c++/17368 + * semantics.c (finish_asm_stmt): Asm expressions need cleanup + also. + +2004-10-05 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 6/n + * pt.c (finish_member_template_decl, check_specialization_scope, + maybe_process_partial_specialization, determine_specialization, + check_explicit_specialization, maybe_check_template_type, + process_partial_specialization, check_default_tmpl_args, + push_template_decl_real, redeclare_class_template, + convert_nontype_argument, coerce_template_parms, + lookup_template_class, push_tinst_level, + instantiate_class_template, tsubst_arg_types, + tsubst_function_type, tsubst, tsubst_qualified_id, + tsubst_copy_and_build, check_instantiated_args, + do_decl_instantiation, do_type_instantiation, + invalid_nontype_parm_type_p, check_specialization_namespace, + convert_template_argument, determine_specialization, + check_template_shadow, tsubst_decl + instantiate_pending_templates): Use quoting marks. + +2004-10-05 Nathan Sidwell + + PR c++/17829 + * parser.c (cp_parser_postfix_expression): Inhibit Koenig when + unqualified lookup finds a member function. + +2004-10-04 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 5/n + * parser.c (cp_parser_name_lookup_error, + cp_parser_diagnose_invalid_type_name, + cp_parser_primary_expression, cp_parser_unqualified_id, + cp_parser_nested_name_specifier_opt, cp_parser_labeled_statement, + cp_parser_jump_statement, cp_parser_simple_declaration, + cp_parser_decl_specifier_seq, cp_parser_mem_initializer_id, + cp_parser_type_parameter, cp_parser_template_id, + cp_parser_template_name, cp_parser_direct_declarator, + cp_parser_parameter_declaration_list, cp_parser_class_head, + cp_parser_base_specifier, cp_parser_lookup_name, + cp_parser_late_parsing_default_args, + cp_parser_optional_template_keyword + cp_parser_elaborated_type_specifier, cp_parser_check_class_key, + cp_parser_check_access_in_redeclaration): Use quoting marks. + + * name-lookup.c (supplement_binding, pushdecl, + check_for_out_of_scope_variable, validate_nonmember_using_decl, + do_nonmember_using_decl, lookup_tag, set_decl_namespace, + push_namespace, do_namespace_alias, do_using_directive, + ambiguous_decl, lookup_namespace_name, add_function): Likewise. + + * method.c (use_thunk): Likewise. + + * lex.c (unqualified_name_lookup_error, + unqualified_fn_lookup_error): Likewise. + +2004-10-04 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 4/n + * except.c (decl_is_java_type, build_throw, + is_admissible_throw_operand, check_handlers_1, check_handlers): + Use quoting formats. + * friend.c (add_friend, make_friend_class, do_friend): Likewise. + * init.c (sort_mem_initializers, emit_mem_initializers, + member_init_ok_or_else, expand_member_init, is_aggr_type, + build_offset_ref, build_java_class_ref): Likewise. + +2004-10-03 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 3/n + * decl.c (pop_label, duplicate_decls, redeclaration_error_message, + redeclaration_error_message, lookup_label, check_goto, + make_typename_type, make_unbound_class_template, + fixup_anonymous_aggr, check_tag_decl, start_decl, start_decl_1, + grok_reference_init, layout_var_decl, maybe_commonize_var, + check_for_uninitialized_const_var, reshape_init_array, + reshape_init, check_initializer, cp_finish_decl, + member_function_or_else, bad_specifiers, grokfndecl, grokvardecl, + check_static_variable_definition, compute_array_index_type, + create_array_type_for_decl, check_special_function_return_type, + grokdeclarator, check_default_argument, grokparms, + grok_ctor_properties, grok_op_properties, + check_elaborated_type_specifier, xref_tag, finish_enum, + build_enumerator, check_function_type, start_preparsed_function, + store_parm_decls): Use quoting formats. + * decl2.c (grok_array_decl, delete_sanity, check_member_template, + check_java_method, check_classfn, finish_static_data_member_decl, + grokfield, grokbitfield, grok_function_init, + build_anon_union_vars, coerce_new_type, coerce_delete_type, + check_default_args): Likewise. + * parser.c (cp_parser_decl_specifier_seq): Likewise. + +2004-10-03 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 2/n + * class.c (build_base_path, add_method, alter_access, + handle_using_decl, check_bases, + maybe_warn_about_overly_private_class, find_final_overrider, + warn_hidden, finish_struct_anon, add_implicitly_declared_members, + check_bitfield_decl, check_field_decls, layout_empty_base, + build_base_field, check_methods, layout_virtual_bases, + warn_about_ambiguous_bases, layout_class_type, finish_struct_1, + resolve_address_of_overloaded_function, instantiate_type, + note_name_declared_in_class): Use format flag "q" for quoting. + +2004-10-03 Gabriel Dos Reis + + Convert diagnostics to use quoting flag q 1/n + * error.c (locate_error): Ignore quoting flag q. + * call.c (build_user_type_conversion_1, build_operator_new_call, + build_object_call, op_error, build_conditional_expr, + build_new_op, build_op_delete_call, enforce_access, + convert_like_real, convert_arg_to_ellipsis, build_x_va_arg, + convert_default_arg, build_over_call, build_new_method_call, + joust, perform_implicit_conversion, initialize_reference): Use the + quoting flag q. + +2004-10-03 Andrew Pinski + + PR c++/17797 + * typeck.c (build_reinterpret_cast): Return if the inner type + is error_mark_node. + +2004-10-01 Jan Hubicka + + * semantics.c (expand_body): Update call of tree_rest_of_compilation. + +2004-09-30 Nathan Sidwell + + * cp-tree.h (struct lang_decl): Shrink by reordering fields and + turning operator_code and fixed_offset into bitfields. + +2004-09-29 Joseph S. Myers + + * decl.c (duplicate_decls): Merge TREE_DEPRECATED. + +2004-09-29 Jason Merrill + + PR tree-optimization/17697 + * decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl. + +2004-09-28 Jason Merrill + + PR middle-end/17525 + * class.c (build_base_field): Set TYPE_MODE. + +2004-09-28 Roger Sayle + + PR driver/17537 + * g++spec.c (lang_specific_driver): Unrecognized libraries, other + than -lc and -lm, may require linking against libstc++. + +2004-09-28 Kazu Hirata + + * tree.c: Fix a comment typo. + +2004-09-28 Nathan Sidwell + + * class.c (VTT_TOP_LEVEL_P, VTT_MARKED_BINFO_P): Remove. + (struct secondary_vptr_vtt_init_data_s): New. + (build_vtt_inits): Adjust dfs_walkers. + (dfs_build_secondary_vptr_vtt_inits): Caller data is a + secondary_vptr_vtt_init_data_s structure. Adjust. + (dfs_ctor_vtable_bases_queue_p): Remove. + (dfs_fixup_binfo_vtbls): No need to clear BINFO_MARKED. Simplify. + + * pt.c (struct get_template_base_data_s): Remove. + (get_template_base_r): Fold into get_template_base. + (get_template_base): Walk base binfos directly in inheritance + graph order. + +2004-09-27 Mark Mitchell + + PR c++/17642 + * cp-tree.h (fold_if_not_in_template): New function. + * call.c (build_conditional_expr): Use fold_if_not_in_template. + (build_cxx_call): Likewise. + * cvt.c (convert_to_complex): Likewise. + (ocp_convert): Likewise. + (convert): Likewise. + (convert_force): Likewise. + * decl.c (compute_array_index_type): Clear + processing_template_decl while folding array bounds. + * pt.c (convert_nontype_argument): Clear + processing_template_decl while processing non-type argument + initialization. + * tree.c (fold_if_not_in_template): New function. + * typeck.c (build_class_member_access_expr): Use + fold_if_not_in_template. + (build_array_ref): Likewise. + (build_binary_op): Likewise. Do not try to optimize computations + when processing templates. + (cp_pointer_int_sum): Use fold_if_not_in_template. + (pointer_diff): Likewise. + (build_unary_op): Likewise. + (build_reinterpret_cast): Likewise. + (get_delta_difference): Likewise. + (expand_ptrmemfunc_cst): Likewise. + (dubious_conversion_warnings): Likewise. + +2004-09-27 Matt Austern + + * cp/parser.c (struct cp_token): New one-bit field , implicit_extern_c + (cp_lexer_get_preprocessor_token): Set implicit_extern_c for + tokens that come from headers that are implicitly extern "C". + (struct cp_parser): new one-bit field, implicit_extern_c. + (cp_parser_new): Set parser's implicit_extern_c to false. + (cp_parser_translation_unit): Pop lang context if we were in a + header that was implicitly extern "C". + (cp_parser_declaration_seq_opt): Push/pop lang context as + required by the token's and parser's implicit_extern_c. + +2004-09-27 Mark Mitchell + + PR c++/17585 + * cp-tree.h (shared_member_p): Declare. + * search.c (shared_member_p): Give it external linkage. + * semantics.c (finish_qualified_id_expr): Use it. + (finish_id_expression): Likewise. + + PR c++/17585 + * semantics.c (finish_id_expression): Do not add "this->" to + static member functions. + +2004-09-27 Nathan Sidwell + + PR c++/17681 + * error.c (dump_type): Change TREE_VEC case into TREE_BINFO. + + * class.c (struct count_depth_data): Remove. + (dfs_depth_post, dfs_depth_q): Remove. + (find_final_overrider): Use number of vbase classes as depth + bound. + + * cp-tree.h (types_overlap_p): Remove. + * search.c (struct overlap_info): Remove. + (dfs_check_overlap, dfs_no_overlap_yet, types_overlap_p): Remove. + + * pt.c (GTB_VIA_VIRTUAL, GTB_IGNORE_TYPE): Remove. + (get_template_base_recursive): Remove. Replace with ... + (get_template_base_r): ... this. + (struct get_template_base_data_s): New. + (get_template_base): Use get_template_base_r via dfs_walk. Always + return NULL on failure. + (unify): Remove error_mark_node check from get_template_base result. + +2004-09-24 Paolo Bonzini + + * parser.c (cp_parser_expression_stack): Clarify why it is + an array of NUM_PREC_VALUES elements. + (cp_parser_binary_expression): Clarify why we do not need to + handle stack overflow. + +2004-09-24 Nathan Sidwell + + PR c++/16889 + * search.c (lookup_field_queue_p): Correct check for hidden base. + + * search.c (bfs_walk): Remove. + (lookup_member): Use dfs_walk_real. + (dfs_walk_real): Move and adjust documentation from bfs_walk. + +2004-09-23 Zack Weinberg + + * decl.c (grokfndecl): If ::main is found not to return int, + correct it after issuing a diagnostic. + (grokdeclarator): If the incoming type was error_mark_node, do + not complain about declaring something with no type. + (start_function): Change check for ::main not returning int to + an assertion, as grokfndecl now catches this when the user did it. + * init.c (perform_member_init, sort_mem_initializers) + (emit_mem_initializers): Make most diagnostics be issued on + the line of current_function_decl, not whatever the current + input line is. + * parser.c (cp_lexer_peek_token_emit_debug_info): Surround + definition and declaration with #ifdef ENABLE_CHECKING. + Avoid unnecessary use of fprintf. + (cp_lexer_print_token, cp_lexer_debug_stream): Adjust stub + definitions to avoid warnings. + (cp_lexer_new_main): Add assertion that first token is not a + padding token. + (cp_lexer_new_from_token_array): Fold into ... + (cp_lexer_new_from_tokens): ... here. Add assertion that + first token is not a padding token. + (cp_lexer_set_source_position_from_token): Move nearer to callers. + Remove unused lexer argument. + (cp_lexer_peek_token): Just print debugging report (if enabled) + and return lexer->next_token. + (cp_lexer_skip_purged_tokens): Delete. + (cp_lexer_next_token_is, cp_lexer_next_token_is_not): Make + inline, simplify bodies. + (cp_lexer_peek_nth_token): Add debugging report a la + cp_lexer_peek_token. + (cp_lexer_consume_token): Correct commentary. Advance over + purged tokens here. Set current source position here, from + token to be returned. Avoid unnecessary use of fprintf. + (cp_lexer_purge_token): Advance next_token pointer over this and + subsequent purged tokens. + (cp_parser_error): Adjust source position to that of the + peeked token. + (cp_parser_push_lexer_for_tokens, cp_parser_pop_lexer): New functions. + (cp_parser_string_literal): Remove some excessive cleverness. + (cp_parser_enum_specifier): Call start_enum before consuming + the opening brace. + (cp_parser_member_declaration): Make the "extra semicolon" + diagnostic consistently-worded with the other place this is + diagnosed. Explicitly set the diagnostic location to the + location of the offending semicolon. + (cp_parser_enclosed_template_argument_list): Use % quoting + in diagnostics. Do not use cp_parser_require. Set location + of diagnostics about improper use of '>>' to location of + offending token. + (cp_parser_late_parsing_for_member): + Use cp_parser_push_lexer_for_tokens and cp_parser_pop_lexer. + (cp_parser_late_parsing_default_args): Likewise. Manually + move some logic outside the loop. + +2004-09-23 Andrew Pinski + + PR c++/17618 + * cvt.c (cp_convert_to_pointer): Return early when the type is + an error_mark_node. + +2004-09-21 Fariborz Jahanian + + PR c++/13989 + PR c++/9844 + * decl.c (grokfndecl): Add new argument "attrlist", use it + to call cplus_decl_attributes. + (start_function): Remove call to cplus_decl_attributes. + * cvt.c (ocp_convert): Add support to use type conversion + function to vector type. + * parser.c (cp_parser_conversion_type_id): Add attributes, if any, + to the parsed type. + +2004-09-23 Paolo Bonzini + + PR c++/17596 + + * parser.c (cp_parser_token_tree_map_node, + cp_parser_pm_expression, cp_parser_additive_expression, + cp_parser_multiplicative_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): Removed. + (enum cp_parser_prec, struct cp_parser_token_tree_map_node, + binops, binops_by_token): New. + (cp_parser_assignment_expression): Use cp_parser_binary_expression. + (cp_parser_new): Initialize binops_by_token. + (cp_parser_binary_expression): Rewritten. + (N_CP_TTYPES): New. + +2004-09-23 Kazu Hirata + + * parser.c: Fix a comment typo. + +2004-09-23 Nathan Sidwell + + PR c++/17620 + * decl.c (xref_basetypes): Look through typedefs before checking + for duplicate base. + +2004-09-22 Nathan Sidwell + + * cp-tree.h (unemitted_tinfo_decls): Make a VEC(tree). + * decl2.c (cp_finish_file): Adjust tinfo decl emission loop. + * rtti.c (unemitted_tinfo_decls): Make a VEC(tree). + (init_rtti_processing): Initialize it to something realistic. + (get_tinfo_decl): Adjust pushing the new decl. + + * cp-tree.h (struct lang_type_class): Remove marked flags, add + diamond_shaped and repeated_base flags. Reorder to keep 8-bit blocks. + (TYPE_MARKED_P): New. + (CLASSTYPE_DIAMOND_SHAPED_P, CLASSTYPE_REPEATED_BASE_P): New. + (CLASSTYPE_MARKED_N, SET_CLASSTYPE_MARKED_N, + CLEAR_CLASSTYPE_MARKED_N): Remove. + (CLASSTYPE_MARKED_*, SET_CLASSTYPE_MARKED_*, + CLEAR_CLASSTYPE_MARKED_*): Remove. + * decl.c (xref_basetypes): Use TYPE_MARKED_P. Determine diamond + shaped and repeated base properties. + * lex.c (cxx_make_type): Don't clear TYPE_ALIAS_SET. + * rtti.c (dfs_class_hint_mark, dfs_class_hint_unmark, + class_hint_flags): Remove. + (get_pseudo_ti_init): Use CLASSTYPE_REPEATED_BASE_P and + CLASSTYPE_DIAMOND_SHAPED_P. + +2004-09-21 Ziemowit Laski + + * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Moved here from + cp-objcp-common.h. + (objcp_tsubst_copy_and_build): Reformat function signature. + * cp-objcp-common.h (objcp_tsubst_copy_and_build): Likewise. + (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Moved to cp-lang.c. + +2004-09-21 Zack Weinberg + + * parser.c (cp_lexer_peek_token, cp_lexer_consume_token): + Don't handle CPP_PRAGMA tokens specially. + (cp_lexer_handle_pragma): Use cp_lexer_consume_token. Don't + purge the token; do clear token->value after processing. Add + assertion at beginning that token->value is nonzero. + (cp_parser_statement, cp_parser_declaration_seq_opt): Handle + CPP_PRAGMA as a full statement or declaration in its own right. + +2004-09-21 Matt Austern + + PR c++/15049 + * decl.c (grokvardecl): Accept declarations of global variables + using anonymous types. + +2004-09-21 Roger Sayle + + PR c++/7503 + * tree.c (lvalue_p_1): Disallow MIN_EXPR and MAX_EXPR as lvalues + if either operand has side-effects. + * typeck.c (rationalize_conditional_expr): Assert that neither + operand of MIN_EXPR or MAX_EXPR has side-effects. + (build_modify_expr): Add support for MIN_EXPR and MAX_EXPR. + Check that the "lhs" is a valid lvalue, i.e. that neither operand + of a MIN_EXPR or MAX_EXPR has a side-effect. + +2004-09-21 Nathan Sidwell + + * cp-tree.h (struct lang_type_header): Remove + uses_multiple_inheritance field. + (TYPE_USES_MULTIPLE_INHERITANCE): Remove. + (TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P): Remove. + (TYPE_USES_VIRTUAL_BASECLASSES): Remove. + (DECL_NEEDS_VTT_PARM_P): Use CLASSTYPE_VBASECLASSES. + (TYPE_CONTAINS_VPTR_P): Likewise. + * call.c (add_template_candidate_real): Use + CLASSTYPE_VBASECLASSES. + (build_special_member_call): Likewise. + * class.c (finish_struct_bits): Remove + TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P & TYPE_USES_VIRTUAL_BASECLASSES + bookkeeping. + (check_bases_and_members): Use TYPE_CONTAINS_VPTR_P. + (create_vtable_ptr): Remove TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P + bookkeeping. + (build_vtt_inits): Use CLASSTYPE_VBASECLASSES. + (accumulate_vtbl_inits, build_vbase_offset_vtbl_entries): + Likewise. + * decl.c (xref_basetypes): Remove TYPE_USES_MULTIPLE_INHERITANCE, + TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P, TYPE_USES_VIRTUAL_BASECLASSES + bookkeeping. + (cxx_maybe_build_cleanup): Use CLASSTYPE_VBASECLASSES. + * decl2.c (maybe_retrofit_in_chrg): Likewise. + * init.c (expand_member, push_base_cleanups): Likewise. + * pt.c (instantiate_class_template): Remove + TYPE_USES_MULTIPLE_INHERITANCE, + TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P, TYPE_USES_VIRTUAL_BASECLASSES + bookkeeping. + * ptree.c (cxx_print_type): Remove TYPE_USES_MULTIPLE_INHERITANCE + check. + * typeck2.c (process_init_constructor): Replace some sorrys with + asserts. + +2004-09-21 Andreas Tobler + + * decl.c (reshape_init_array): Initialize max_index_cst to fix + bootstrap failure. + +2004-09-20 Mark Mitchell + + PR c++/17530 + * pt.c (tsubst): Fix parentheses to accomodate emacs. + (tsubst_baselink): If we get a single function, mark it as used. + +2004-09-20 Matt Austern + Zack Weinberg + + * decl.c (make_rtl_for_nonlocal_decl, start_preparsed_function): + Apply lbasename to input_filename before passing to get_fileinfo. + * semantics.c (begin_class_definition): Likewise. + * lex.c (handle_pragma_interface): Apply get_fileinfo to the + correct filename. Rename variables to be less confusing. + (handle_pragma_implementation): Likewise. Disable "appears + after file is included" diagnostic. + + * parser.c (struct cp_token): Add in_system_header fiag. + (CP_TOKEN_BLOCK_NUM_TOKENS, struct cp_token_block) + (CP_TOKEN_BUFFER_SIZE, cp_token_cache_push_token) + (CPP_NONE, cp_lexer_read_token): Delete. + (struct cp_lexer): Remove first_token, string_tokens, + main_lexer_p fields. Clarify comments. + (struct cp_token_cache): Now just a pair of pointers. + (CP_LEXER_BUFFER_SIZE): New #define. + (CPP_PURGED): New fake token type. + (cp_lexer_new_from_token_array, cp_lexer_destroy) + (cp_lexer_peek_token_emit_debug_info, cp_lexer_skip_purged_tokens) + (cp_lexer_handle_pragma, cp_token_cache_new, cp_parser_string_literal): + New functions. + (cp_lexer_new_from_tokens): Now a simple wrapper around + cp_lexer_new_from_token_array. + (cp_lexer_set_source_position_from_token): Also update + in_system_header. + (cp_lexer_next_token, cp_lexer_prev_token, cp_lexer_advance_token): + Don't wrap round. + (cp_lexer_token_difference): Dont handle wrapping round. + (cp_lexer_new_main): Enable pragma deferral and raw strings, + read the entire translation unit through c_lex_with_flags into + this lexer's buffer, then turn raw strings back off again. + (cp_lexer_grow_buffer): Adjust for buffer no longer being circular. + (cp_lexer_get_preprocessor_token): No need to handle not being + the main lexer. Set token->in_system_header too. + (cp_lexer_peek_token): Skip purged tokens. Feed pragma tokens + to cp_lexer_handle_pragma. No need to call cp_lexer_read_token. + (cp_lexer_peek_nth_token): Likewise. + (cp_lexer_purge_token): Mark the token PURGED, don't shift all + the other tokens down. + (cp_lexer_purge_tokens_after): Likewise. + (cp_lexer_save_tokens, cp_lexer_rollback_tokens): Don't worry + about there being no tokens. + (cp_lexer_print_token): Revise to give useful information on + all tokens. + (struct cp_parser): Add field translate_strings_p. + (cp_parser_new): Initialize it. + (cp_parser_translation_unit): Destroy the lexer when done. + (cp_parser_parameter_declaration): Restructure saving of + default arguments. + (cp_parser_save_member_function_body): Likewise. + (cp_parser_check_for_invalid_template_id) + (cp_parser_nested_name_specifier_opt, cp_parser_template_id): + Adjust calls to cp_lexer_advance_token. + (cp_parser_skip_to_closing_parenthesis, cp_parser_declaration): + No need to fiddle c_lex_string_translate. + (cp_parser_primary_expression, cp_parser_linkage_specification) + (cp_parser_asm_definition, cp_parser_asm_specification_opt) + (cp_parser_asm_operand_list, cp_parser_asm_clobber_list) + Use cp_parser_string_literal. + (cp_parser_attribute_list): Save and restore + parser->translate_strings_p, not c_lex_string_translate. + (cp_parser_cache_group): Delete. + (cp_parser_cache_group_1): Rename cp_parser_cache_group. Do + not take a cache argument. + +2004-09-20 Giovanni Bajo + + PR c++/14179 + * decl.c (reshape_init): Extract array handling into... + (reshape_init_array): New function. Use integers instead of trees + for indices. Handle out-of-range designated initializers. + +2004-09-20 Steven Bosscher + + * lex.c (cxx_init): Don't set the ridpointer for RID_NULL + to null_node. + +2004-09-19 Mark Mitchell + + * decl2.c (determine_visibility): Allow class visibility + directives to override targetm.cxx.export_class_data. + +2004-09-18 Kazu Hirata + + * call.c, semantics.c: Follow spelling conventions. + * class.c: Fix a comment typo. + +2004-09-16 Geoffrey Keating + + PR pch/13361 + * cp/lex.c (handle_pragma_interface): Duplicate string from tree. + (handle_pragma_implementation): Likewise. + +2004-09-17 Jeffrey D. Oldham + Zack Weinberg + + * cp-tree.def: Use tree_code_class enumeration constants + instead of code letters. + * call.c, class.c, cp-gimplify.c, cp-lang.c, cxx-pretty-print.c + * mangle.c, pt.c, semantics.c, tree.c, typeck.c: + Update for new tree-class enumeration constants. + +2004-09-16 Mark Mitchell + + PR c++/16002 + * parser.c (cp_parser_simple_declaration): Commit to tentative + parses after seeing a decl-specifier. + (cp_parser_simple_declaration): Eliminate spurious message. + (cp_parser_init_declarator): Adjust error message. + + PR c++/16029 + * lex.c (unqualified_name_lookup_error): Mark the dummy + declaration as used. + + PR c++/17501 + * parser.c (cp_parser_nested_name_specifier): Do not resolve + typename types if the user explicitly said "typename". + +2004-09-16 Andrew MacLeod + + * error.c (dump_decl): Make sure there is lang_specific info before + checking for DTOR and CTOR decls. + +2004-09-16 Nathan Sidwell + + * class.c (copy_virtuals): Remove. + (build_primary_vtable): Use copy_list directly. + (build_secondary_vtable): Likewise. + (update_vtable_entry_for_fn): Clear BV_CALL_INDEX here. + (create_vtable_ptr): Likewise. + +2004-09-16 Kazu Hirata + + * search.c: Follow spelling conventions. + +2004-09-16 Nathan Sidwell + + * cp-tree.h (struct lang_type_class): Make pure_virtuals a + VEC(tree). + (CLASSTYPE_INLINE_FRIENDS, CLASSTYPE_PURE_VIRTUALS): Update + comments. + * call.c (build_new_method_call): Don't confirm a pure virtual is + in CLASSTYPE_PURE_VIRTUALS. Reorder checks. Make it a warning. + * class.c (check_methods): CLASSTYPE_INLINE_FRIENDS is a VEC(tree). + (fixup_inline_methods, finish_struct): Likewise. + * decl.c (finish_method): Likewise. + * search.c (dfs_get_pure_virtuals, get_pure_virtuals): + CLASSTYPE_PURE_VIRTUALS is a VEC(tree). + * typeck2.c (abstract_virtuals_error): Likewise. Truncate the + vector to avoid repeating the list in error messages. + +2004-09-15 Mark Mitchell + + * cp-objcp-common.h (LANG_HOOKS_COMDAT_GROUP): Define. + * cp-tree.h (cxx_comdat_group): Declare. + * decl.c (cxx_comdat_group): New function. + +2004-09-15 Nathan Sidwell + + * search.c (get_pure_virtuals): Remove unused variables. + + * cp-tree.h (struct lang_decl_flags): Remove + needs_final_overrider. + (DECL_NEEDS_FINAL_OVERRIDER_P): Remove. + * decl.c (duplicate_decls): Do not copy DECL_NEEDS_FINAL_OVERRIDER_P. + * class.c (finish_struct_bits): Correct comment about + CLASSTYPE_PURE_VIRTUALS. + * search.c (get_pure_virtuals): Remove useless loop. + +2004-09-14 Mark Mitchell + + PR c++/17324 + * mangle.c (partially_mangled_name): New variable. + (partially_mangled_name_len): Likewise. + (save_partially_mangled_name): New function. + (restore_partially_mangled_name): Likewise. + (write_encoding): Save and restore partially mangled names around + calls to get_mostly_instantiated_function_type. + (write_unqualified_name): Likewise. + +2004-09-14 Nathan Sidwell + + * pt.c (unify): Replace gcc_unreachable with gcc_assert. + +2004-09-13 Mark Mitchell + + PR c++/16162 + * parser.c (cp_parser_id_expression): Correct value for + is_declarator. + (cp_parser_nested_name_specifier_opt): Look through typenames as + necessary. + (cp_parser_template_name): Honor check_dependency_p. + + PR c++/16716 + * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): + Robustify. + + PR c++/17327 + * pt.c (unify): Add ENUMERAL_TYPE case. Replace sorry with + gcc_unreacable. + +2004-09-12 Richard Henderson + + PR c++/16254 + * semantics.c (maybe_cleanup_point_expr): Don't call fold. + * typeck.c (condition_conversion): Likewise. + +2004-09-11 Richard Henderson + + PR c++/17404 + * pt.c (cur_stmt_expr): Move from tsubst_expr. + (tsubst_expr) : Move ... + (tsubst_copy_and_build): ... here. + +2004-09-10 Zack Weinberg + + * cp-tree.h (interface_only, interface_unknown): Delete declarations; + comment explaining them moved to c-common.h. + * lex.c (interface_only, interface_unknown, extract_interface_info): + Delete definitions. + (cxx_finish): Don't reset interface_unknown. + (handle_pragma_interface): Don't set interface_only and + interface_unknown; just the like-named fields in finfo. + (handle_pragma_implementation): Adjust comment. + * decl2.c (cp_finish_file): Don't reset interface_only and + interface_unknown. + * method.c (synthesize_method): Don't reset interface_unknown or + call extract_interface_info. + * pt.c (pop_tinst_level): Don't call extract_interface_info. + * decl.c (start_cleanup_fn): Don't save or restore interface_only + and interface_unknown. + (make_rtl_for_nonlocal_decl): Call get_fileinfo on input_filename + and use the result instead of the interface_only/interface_unknown + globals. + (start_preparsed_function): Likewise. + * lex.c (cxx_make_type): Likewise. + * semantics.c (begin_class_definition): Likewise. + (expand_body): Don't call extract_interface_info. + +2004-09-10 Ziemowit Laski + + * decl.c (objc_mark_locals_volatile): Make description of + routine more descriptive; only mark VAR_DECLs at each + binding level. + +2004-09-10 Richard Henderson + + PR c++/17386 + * call.c (build_vfield_ref): Move... + * class.c (build_vfield_ref): ... here. Convert datum to the + primary base containing the vptr. + (make_new_vtable): Simplify build_primary_vtable arguments. + (finish_struct_1): Do not duplicate TYPE_VFIELD. + * typeck.c (build_class_member_access_expr): Don't warn for + null object access to base fields. + +2004-09-10 Ziemowit Laski + + * decl.c (objc_get_current_scope, objc_mark_locals_volatile): + New functions, to be called from ObjC++. + +2004-09-10 Kazu Hirata + + * class.c, cp-tree.h, decl.c, decl2.c, mangle.c, + name-lookup.h, parser.c, search.c, semantics.c, typeck2.c: Fix + comment typos. + +2004-09-09 Ziemowit Laski + + * typeck.c (build_c_cast): Preserve the cast if casting + to and from an Objective-C type. + +2004-09-09 Ziemowit Laski + + * Make-lang.in (cp/typeck.o): Depend on c-common.h. + * typeck.c: Include c-common.h. + (comptypes): For RECORD_TYPEs, call objc_comptypes() and + return the result if nonnegative. + +2004-09-09 Zack Weinberg + + * decl2.c (import_export_class) + * lex.c (handle_pragma_interface): + Test MULTIPLE_SYMBOL_SPACES with if, not #ifdef. + +2004-09-08 Ziemowit Laski + + * Make-lang.in (cp/semantics.o): Depend on c-common.h. + * semantics.c: Include c-common.h. + (finish_compound_stmt): Call objc_clear_super_receiver(). + +2004-09-08 Ziemowit Laski + + * cp-tree.h (do_poplevel): New prototype. + * semantics.c (do_poplevel): Make externally visible. + +2004-09-08 Nathan Sidwell + + * cp-tree.h (tree_pair_s): Define a GC'd vector. + * name-lookup.h (cxx_saved_binding, cp_class_binding): Likewise. + * semantics.c (deferred_access): Likewise. + +2004-09-06 Daniel Jacobowitz + + * semantics.c (expand_body): Assert that we are not nested. + +2004-09-06 Zack Weinberg + + * decl.c (build_enumerator): Use add_double and int_fits_type_p + instead of cp_build_binary_op, to avoid creating short-lived trees. + * parser.c (cp_parse_type_specifier ): Use two-token + lookahead instead of backtracking. Move some code to avoid a + conditional branch. + (cp_parser_enum_specifier): Avoid duplication of effort with caller. + Use cp_lexer_next_token_is/cp_lexer_next_token_is_not as appropriate. + (cp_parser_enumerator_list, cp_parser_enumerator_definition): + Use cp_lexer_next_token_is/cp_lexer_next_token_is_not as appropriate. + +2004-09-04 Kriang Lerdsuwanakij + + * decl.c (grok_declarator): Remove a redundant semicolon. + + * parser.c (cp_parser_decl_specifier_seq, cp_parser_type_specifier): + Correct comments describing function parameters. + +2004-09-03 Matt Austern + Compile speed improvement. + * parser.c (cp_lexer_print_token): Only define if ENABLE_CHECKING set. + Otherwise define a stub macro that expands to nothing. + (cp_lexer_debugging_p): Only define if ENABLE_CHECKING set. Otherwise + define a stub macro that expands to 0. + (cp_lexer_start_debugging): Only define if ENABLE_CHECKING set. + (cp_lexer_stop_debugging): Likewise. + (cp_lexer_debug_stream): Only define if ENABLE_CHECKING set. Otherwise + define a stub macro that expands to NULL. + (cp_lexer_new_main): Only set debugging_p if ENABLE_CHECKING set. + (cp_lexer_new_from_tokens): Likewise. + +2004-09-03 Jan Hubicka + + * decl.c (finish_function): Clean out pointers we no longer need. + +2004-09-03 Jan Beulich + + * g++spec.c (MATH_LIBRARY_PROFILE): Default to MATH_LIBRARY rather + than "-lm". + +2004-09-02 Paul Brook + + * decl2.c (determine_visibility): Only check data visibility + for VAR_DECLS. + +2004-08-31 Mark Mitchell + + * cp-tree.h (DECL_CONSTRUCTION_VTABLE_P): New macro. + * class.c (build_ctor_vtbl_group): Set DECL_CONSTRUCTION_VTABLE_P. + * decl2.c (determine_visibility): Honor + TARGET_CXX_EXPORT_CLASS_DATA. + + * class.c (key_method): Rename to ... + (determine_key_method): ... this. + (finish_struct_1): Adjust accordingly. + * cp-tree.h (key_method): Declare. + * decl2.c (maybe_emit_vtables): Determine the key method here if + it has not already been done. + +2004-08-31 Ziemowit Laski + + * Make-lang.in (CXX_AND_OBJCXX_OBJS): Add cp/cp-objcp-common.o. + (cp/cp-lang.o): Depend on debug.h, gtype-cp.h and cp/cp-objcp-common.h. + (cp/cp-decl.c): Do not depend on gtype-cp.h. + (cp/cp-objcp-common.o): New target. + * cp-lang.c: Include debug.h, cp-objcp-common.h and gtype-cp.h. + (cxx_get_alias_set, cxx_warn_unused_global_decl, cp_expr_size, + cp_tree_size, cp_var_mod_type_p, cxx_initialize_diagnostics): Move + prototypes and definitions to cp-objcp-common.h and cp-objcp-common.c, + respectively. + (LANG_HOOKS_TREE_SIZE, LANG_HOOKS_FINISH, + LANG_HOOKS_CLEAR_BINDING_STACK, LANG_HOOKS_INIT_OPTIONS, + LANG_HOOKS_INITIALIZE_DIAGNOSTICS, LANG_HOOKS_HANDLE_OPTION, + LANG_HOOKS_HANDLE_FILENAME, LANG_HOOKS_MISSING_ARGUMENT, + LANG_HOOKS_POST_OPTIONS, LANG_HOOKS_GET_ALIAS_SET, + LANG_HOOKS_EXPAND_CONSTANT, LANG_HOOKS_EXPAND_EXPR, + LANG_HOOKS_EXPAND_DECL, LANG_HOOKS_PARSE_FILE, + LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, LANG_HOOKS_TRUTHVALUE_CONVERSION, + LANG_HOOKS_SET_DECL_ASSEMBLER_NAME, LANG_HOOKS_MARK_ADDRESSABLE, + LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_PRINT_XNODE, + LANG_HOOKS_PRINT_DECL, LANG_HOOKS_PRINT_TYPE, + LANG_HOOKS_PRINT_IDENTIFIER, LANG_HOOKS_PRINT_ERROR_FUNCTION, + LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL, LANG_HOOKS_WRITE_GLOBALS, + LANG_HOOKS_FUNCTION_INIT, LANG_HOOKS_FUNCTION_FINAL, + LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P, + LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE, + LANG_HOOKS_ATTRIBUTE_TABLE, LANG_HOOKS_TREE_INLINING_WALK_SUBTREES, + LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN, + LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS, + LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P, + LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P, + LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P, + LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN, + LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN, LANG_HOOKS_EXPR_SIZE, + LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR, + LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION, LANG_HOOKS_MAKE_TYPE, + LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIZE, + LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE, + LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, LANG_HOOKS_INCOMPLETE_TYPE_ERROR, + LANG_HOOKS_TYPE_PROMOTES_TO, LANG_HOOKS_REGISTER_BUILTIN_TYPE, + LANG_HOOKS_GIMPLIFY_EXPR, LANG_HOOKS_FOLD_OBJ_TYPE_REF): Move + hooks to cp-objcp-common.h. + (finish_file): New function. + * cp-objcp-common.c: New file. + * cp-objcp-common.h: New file. + * cp-tree.h (cp_finish_file): New prototype. + * decl.c: Do not include gtype-cp.h. + * decl2.c (finish_file): Rename to cp_finish_file. + +2004-08-31 Richard Henderson + + PR c++/17221 + * pt.c (tsubst_expr): Move OFFSETOF_EXPR handling ... + (tsubst_copy_and_build): ... here. + +2004-08-30 Mark Mitchell + + * cp-tree.h (initialize_artificial_var): Declare. + * decl.c (initialize_artifical_var): New function. + * class.c (initialize_array): Remove. + (initialize_vtable): Use initialize_artificial_var. + (build_vtt): Likewise. + (build_ctor_vtbl_group): Likewise. + +2004-08-30 Richard Henderson + + * class.c (build_base_path): Use build_address directly. + * typeck.c (build_unary_op): Don't lower &a.b to pointer + arithmetic directly. + * typeck2.c (store_init_value): Don't assume !TREE_CONSTANT + means !initializer_constant_valid_p. + +2004-08-30 Richard Henderson + + * class.c (fixed_type_or_null): Use get_base_address before + assuming an ADDR_EXPR is non-null. + +2004-08-30 Nathan Sidwell + + * name-lookup.c (pop_binding, pushdecl, + set_identifier_type_value_with_scope, push_overloaded_decl, + arg_assoc_type): Replace abort with gcc_assert or gcc_unreachable. + * parser.c (cp_parser_diagnose_invalid_type_name, + cp_parser_postfix_expression, cp_parser_unary_expression, + cp_parser_check_declarator_template_para): Likewise. + * pt.c (push_inline_template_parms_recursive, + check_explicit_specialization, convert_nontype_argument, + coerce_template_template_parms, uses_template_parms, + instantiate_class_template, tsubst_decl, tsubst, tsubst_copy, + tsubst_expr, instantiate_template, + maybe_adjust_types_for_deduction, type_unification_real, + resolve_overloaded_unification, template_decl_level, + type_dependent_expression_p): Likewise. + * search.c (lookup_base_r): Likewise. + * semantics.c (finish_stmt_expr, simplify_aggr_init_expr): Likewise. + * tree.c (lvalue_p_1, count_functions, cxx_printable_name, + verify_stmt_tree_r, get_type_decl, stabilize_call): Likewise. + * typeck.c (common_type, get_member_function_from_ptrfunc, + build_binary_op, build_unary_op, expand_ptrmemfunc_cst): Likewise. + * typeck2.c (cxx_incomplete_type_diagnostic, + split_nonconstant_init_1, store_init_value, + process_init_constructor): Likewise. + +2004-08-30 Nathan Sidwell + + * call.c (check_dtor_name): Replace abort with gcc_assert or + gcc_unreachable. + (build_call, add_builtin_candidate, build_new_op, + convert_like_real, build_over_call, in_charge_arg_for_name, + source_type, joust): Likewise. + * class.c (build_simple_base_path, get_vcall_index, + finish_struct_1, instantiate_type, get_enclosing_class, + add_vcall_offset_vtbl_entries_1, cp_fold_obj_type_ref): Likewise. + * cp-gimplify.c (cp_genericize): Likewise. + * cp-lang.c (cp_expr_size, cp_tree_size): Likewise. + * cvt.c (cp_convert_to_pointer, ocp_convert): Likewise. + * decl.c (poplevel, make_unbound_class_template, reshape_init, + check_special_function_return_type, grokdeclarator, + grok_op_properties, tag_name, xref_tag, start_preparsed_function, + finish_function): Likewise. + * decl2.c (grokfield, maybe_emit_vtables):Likewise. + * error.c (dump_global_iord, dump_decl, dump_template_decl, + language_to_string): Likewise. + * except.c (choose_personality_routine): Likewise. + * friend.c (do_friend): Likewise. + * g++spec.c (lang_specific_driver): Likewise. + * init.c (build_zero_init, expand_default_init, build_new_1, + build_vec_delete_1, build_vec_init, build_dtor_call): Likewise. + * lex.c (retrofit_lang_decl, cp_type_qual_from_rid): Likewise. + * mangle.c (add_substitution, write_unscoped_name, + write_template_prefix, write_identifier, + write_special_name_destructor, write_type, write_builtin_type, + write_expression, write_template_param, + write_java_integer_type_codes): Likewise. + * method.c (implicitly_declare_fn): Likewise. + +2004-08-30 Nathan Sidwell + + * cp-tree.h (BINFO_PRIMARY_P): Use a binfo flag. + (BINFO_INDIRECT_PRIMARY_P): Remove. + * class.c (determine_primary_base): Rename to ... + (determine_primary_bases): ... here. Set all primary bases. + (set_primary_base): Remove. + (mark_primary_bases): Remove. + (build_simple_base_path, walk_subobject_offsets, + propagate_binfo_offsets, end_of_class): Adjust. + (layout_class_type): Rename determine_primary_base call. + (dump_class_hierarchy_r, dump_vtable): Adjust. Don't pass a binfo + to type_as_string. + (dfs_build_secondary_vptr_vtt_inits, dfs_accumulate_vtbl_inits, + build_rtti_vtbl_entries): Adjust. + * init.c (build_vtbl_address): Adjust. + + * cp-tree.h (SET_BINFO_NEW_VTABLE_MARKED): Use gcc_assert. + +2004-08-28 Ziemowit Laski + + * Make-lang.in (CXX_OBJS): Split up into CXX_OBJS and + CXX_AND_OBJCXX_OBJS. + (CXX_C_OBJS): Include in CXX_AND_OBJCXX_OBJS instead of listing + separately on the link line. + +2004-08-28 Jason Merrill + + * decl.c (expand_static_init): Avoid bogus warnings. + +2004-08-27 Jason Merrill + + PR c++/16851 + * tree.c (stabilize_init): See through a COMPOUND_EXPR. + + PR c++/13684 + * decl.c (expand_static_init): Use thread-safety API. + (register_dtor_fn): Return the call, don't expand it. + * tree.c (add_stmt_to_compound): New fn. + (stabilize_call): Use it. + +2004-08-27 Richard Henderson + + * cp-tree.def (OFFSETOF_EXPR): New. + * parser.c (cp_parser_builtin_offsetof): Either built an + OFFSETOF_EXPR, or call fold_offsetof immediately. + * pt.c (tsubst_expr): Handle OFFSETOF_EXPR. + +2004-08-27 Nathan Sidwell + + * call.c (validate_conversion_obstack): Replace + my_friendly_assert with gcc_assert or gcc_unreachable. + (direct_reference_binding, merge_conversion_sequences, + build_user_type_conversion_1, perform_overload_resolution, + build_op_delete_call, enforce_access, call_builtin_trap, + build_over_call, build_special_member_call, build_new_method_call, + initialize_reference): Likewise. + * class.c (build_base_path, build_primary_vtable, alter_access, + check_bases, update_vtable_entry_for_fn, layout_empty_base, + clone_function_decl, adjust_clone_args, + type_requires_array_cookie, include_empty_classes, + finish_struct_1, resolve_address_of_overloaded_function, + instantiate_type, get_vtbl_decl_for_binfo, build_vtt_inits, + dfs_build_secondary_vptr_vtt_inits, build_ctor_vtbl_group, + accumulate_vtbl_inits, build_vtbl_initializer, + build_vbase_offset_vtbl_entries, build_rtti_vtbl_entries): Likewise. + * cvt.c (build_up_reference, convert_to_reference): Likewise. + * decl.c (poplevel, duplicate_decls, make_typename_type, + cxx_init_decl_processing, reshape_init, check_initializer, + make_rtl_for_nonlocal_decl, initialize_local_var, cp_finish_decl, + expand_static_init, grokfndecl, grokvardecl, build_ptrmem_type, + grokdeclarator, copy_fn_p, grok_op_properties, xref_tag, + xref_basetypes, start_preparsed_function, save_function_data, + finish_function, finish_method, maybe_register_incomplete_var, + complete_vars): Likewise. + * decl2.c (grok_array_decl, check_member_template, + check_classfn, finish_static_data_member_decl, coerce_new_type, + coerce_delete_type, import_export_class, decl_needed_p, + determine_visibility, import_export_decl, build_cleanup, + start_static_initialization_or_destructi, do_static_destruction, + prune_vars_needing_no_initialization, + build_offset_ref_call_from_tree): Likewise. + * error.c (dump_decl, dump_expr): Likewise. + * init.c (finish_init_stmts, build_zero_init, + expand_virtual_init, expand_default_init, expand_aggr_init_1, + build_offset_ref, build_new_1, build_delete, build_vbase_delete): + Likewise. + * mangle.c (write_method_parms, write_template_args, + write_expression, write_template_arg): Likewise. + * method.c (make_thunk, finish_thunk, use_thunk): Likewise. + * name-lookup.c (pop_binding, begin_scope, leave_scope, + resume_scope, push_using_decl, validate_nonmember_using_decl, + is_ancestor, poplevel_class, set_inherited_value_binding_p, + push_class_level_binding, do_class_using_decl, push_namespace, + pop_namespace, add_using_namespace, ambiguous_decl, + lookup_namespace_name, lookup_type_current_level, + maybe_process_template_type_declaration): Likewise. + * parser.c (cp_lexer_peek_nth_token, + cp_parser_parse_and_diagnose_invalid_typ, + cp_parser_translation_unit, cp_parser_template_id, + cp_parser_lookup_name, cp_parser_late_parsing_for_member): Likewise. + * pt.c (push_access_scope, finish_member_template_decl, + push_inline_template_parms_recursive, add_outermost_template_args, + get_innermost_template_args, begin_explicit_instantiation, + end_explicit_instantiation, retrieve_specialization, + is_specialization_of, is_specialization_of_friend, + register_specialization, check_explicit_specialization, + comp_template_parms, process_template_parm, + process_partial_specialization, convert_nontype_argument, + coerce_template_template_parms, coerce_template_parms, + mangle_class_name_for_template, lookup_template_function, + lookup_template_class, instantiate_class_template, tsubst_decl, + tsubst_function_type, tsubst, tsubst_qualified_id, tsubst_copy, + instantiate_template, fn_type_unification, type_unification_real, + get_template_base, regenerate_decl_from_template, + template_for_substitution, instantiate_decl, + get_mostly_instantiated_function_type, dependent_scope_ref_p, + value_dependent_expression_p, resolve_typename_type): Likewise. + * repo.c (repo_emit_p): Likewise. + * rtti.c (build_headof, get_tinfo_decl, get_pseudo_ti_init, + create_tinfo_types, emit_tinfo_decl): Likewise. + * search.c (lookup_base_r, lookup_base, lookup_field_1, + dfs_access_in_type, build_baselink, lookup_member, + adjust_result_of_qualified_name_lookup, copied_binfo): Likewise. + * semantics.c (perform_or_defer_access_check, + finish_non_static_data_member, finish_stmt_expr_expr, + finish_stmt_expr, finish_call_expr, finish_pseudo_destructor_expr, + finish_template_template_parm, finish_member_declaration, + emit_associated_thunks): Likewise. + * tree.c (build_target_expr_with_type, force_target_expr, + copy_binfo, get_first_fn, cp_tree_equal): Likewise. + * typeck.c (type_after_usual_arithmetic_conversions, comptypes, + cxx_sizeof_or_alignof_type, perform_integral_promotions, + build_class_member_access_expr, finish_class_member_access_expr, + build_ptrmemfunc_access_expr, build_unary_op, + unary_complex_lvalue, cxx_mark_addressable, build_modify_expr, + build_ptrmemfunc, expand_ptrmemfunc_cst, check_return_expr + * typeck2.c (complete_type_check_abstract, + abstract_virtuals_error, process_init_constructor, + add_exception_specifier): Likewise. + +2004-08-27 Nathan Sidwell + + * class.c (build_vtbl_initializer): Use ssize_int. + * decl.c (complete_array_type): Likewise. + * method.c (finish_thunk): Likewise. + * search.c (get_dynamic_base_type): Likewise. + +2004-08-26 Richard Henderson + + * cp-tree.h (DECL_FIELD_IS_BASE): New. + * class.c (build_base_field): Set it. + (build_simple_base_path): Use it. + (fixed_type_or_null): Don't consider base fields definitive. + +2004-08-25 Roger Sayle + + PR middle-end/16693 + PR tree-optimization/16372 + * decl.c (finish_enum): Make the precision of the enumerated type + the same width as the underlying integer type. + +2004-08-25 Mark Mitchell + + PR c++/17155 + * lex.c (build_lang_decl): Set DECL_NO_STATIC_CHAIN for all C++ + functions. + + * mangle.c (get_identifier_nocopy): Add cast. + + * cp-tree.h (mangle_type): Remove. + * mangle.c (globals): GTY it. + (mangle_obstack): New variable. + (name_obstack): Likewise. + (name_base): Likewise. + (write_char): Adjust accordingly. + (write_chars): Likewise. + (write_string): Likewise. + (start_mangling): Initialize G.substitutions only one. Add + ident_p parameter. + (finish_mangling): Use VARRAY_CLEAR to reclaim + storage in G.substitutions. Use obstack_finish. + (init_mangle): Adjust for changes to variable names above. + Initialize G.substitutions. + (mangle_decl_string): Adjust call to start_mangling. + (get_identifier_nocopy): New function. + (mangle_decl): Use it. + (mangle_type_string): Adjust call to start_mangling. + (mangle_special_for_type): Likewise. + (mangle_vtt_for_type): Likewise. + (mangle_ctor_vtbl_for_type): Likewise. + (mangle_thunk): Likewise. + (mangle_guard_variable): Likewise. + (mangle_ref_init_variable): Likewise. + +2004-08-25 Kriang Lerdsuwanakij + + PR c++/14428 + * pt.c (redeclare_class_template): Check the type of non-type and + template template parameter. + +2004-08-25 Nathan Sidwell + + * call.c (convert_class_to_reference): Adjust build_int_cst calls. + (build_user_type_conversion_1, convert_like_real, + build_java_interface_fn_ref, build_special_member_call): Likewise. + * class.c (finish_struct_1, build_vtbl_initializer): Likewise. + * cp-gimplify.c (cp_gimplify_expr): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + * decl.c (cxx_init_decl_processing, complete_array_type): Likewise. + * decl2.c (start_static_initialization_or_destruction, + generate_ctor_or_dtor_function): Likewise. + * except.c (build_throw): Likewise. + * mangle.c (write_integer_cst): Likewise. + * method.c (finish_thunk): Likewise. + * rtti.c (build_headof, get_tinfo_decl_dynamic, + build_dynamic_cast_1, ptr_initializer, ptm_initializer, + get_pseudo_ti_init): Likewise. + * search.c (get_dynamic_cast_base_type): Likewise. + +2004-08-25 Zack Weinberg + + * class.c, search.c: Remove references to DWARF_DEBUG. + +2004-08-25 Adam Nemet + + * repo.c (extract_string): Reset backquote after one character. + (get_base_filename): Fix indentation. + +2004-08-24 Nathan Sidwell + + * decl.c (cxx_init_decl_processing): Adjust + build_common_tree_nodes call. + +2004-08-24 Nathan Sidwell + + PR c++/16889 + * (is_subobject_of_p): Resurrect & optimize. + (lookup_field_r): Use it. + +2004-08-24 Kriang Lerdsuwanakij + + PR c++/16706 + * search.c (friend_accessible_p): Increment processing_template_decl + when deal with TEMPLATE_DECL of SCOPE. + +2004-08-24 Nathan Sidwell + + PR c++/17149 + * semantics.c (check_accessibility_of_qualified_id): Defer check + if qualifying_type is a template parameter. + +2004-08-23 Mark Mitchell + + PR c++/17163 + * pt.c (instantiate_decl): Do not try to apply + DECL_DECLARED_INLINED_P to a VAR_DECL. + + * search.c (build_baselink): Fix typo in comment. + +2004-08-22 Andrew Pinski + + Revert: + 2004-08-22 Andrew Pinski + PR c++/14029 + * typeck.c (build_unary_op): Use &a.b if the folded lowered + expression is not constant. + +2004-08-23 Nathan Sidwell + + * name-lookup.c (pushdecl): Rename build_type_copy call. + * tree.c (cp_build_qualified_type_real, + build_exception_variant, handle_java_interface_attribute): Likewise. + +2004-08-22 Andrew Pinski + + PR c++/14029 + * typeck.c (build_unary_op): Use &a.b if the folded lowered + expression is not constant. + +2004-08-20 Mark Mitchell + + PR c++/17121 + * decl.c (expand_static_init): Use DECL_FUNCTION_SCOPE_P. + +2004-08-21 Joseph S. Myers + + PR c++/17120 + * pt.c (tsubst_copy_and_build): Avoid clearing TREE_NO_WARNING for + MODOP_EXPR. + +2004-08-20 Kriang Lerdsuwanakij + + * pt.c (register_specialization): Check DECL_TEMPLATE_SPECIALIZATION + before calling comp_template_args. + +2004-08-20 Nathan Sidwell + + * class.c (build_vtbl_initializer): Use build_int_cst for + negative size types. + * decl.c (complete_array_type): Likewise. + * method.c (finish_thunk): Likewise. + +2004-08-20 Andreas Tobler + + * tree.c: Remove unused mark_local_for_remap_r. + +2004-08-19 Eric Christopher + + * cp-tree.h (cxx_unsave_expr_now): Delete prototype. + * tree.c (cxx_unsave_expr_now): Delete. + (cp_unsave_r): Ditto. + +2004-08-19 Mark Mitchell + + PR c++/15890 + * pt.c (push_template_decl_real): Disallow template allocation + functions with fewer than two parameters. + +2004-08-19 Nathan Sidwell + + * cp-tree.h (build_shared_int_cst): Remove. + * tree.c (shared_int_cache): Remove. + (build_shared_int_cst): Remove. + * class.c (finish_struct_1): Use build_int_cst. + +2004-08-19 Nathan Sidwell + + * decl.c (finish_enum): Do not copy value node early, copy + later. + * lex.c (cxx_init): Force null_node to be unique. + +2004-08-19 Joseph S. Myers + + PR c++/17041 + * pt.c (tsubst_copy, tsubst_copy_and_build): Copy TREE_NO_WARNING + from input for MODOP_EXPR. + +2004-08-18 Mark Mitchell + + * pt.c (dependent_template_p): Fix typo in commment. + + PR c++/17068 + * pt.c (dependent_template_p): Treat IDENTIFIER_NODEs as + dependent. + +2004-08-17 Mark Mitchell + + PR c++/16246 + * pt.c (unify): Tidy ARRAY_TYPE handling. Make sure that non-type + arguments have the same type as the corresponding parameter. + + PR c++/16215 + * parser.c (cp_parser_name_lookup_error): If parser->object_scope + is set use it for diagnostic purposes. + (cp_parser_pseudo_destructor_name): Remove special-case error + message. + + PR c++/15871 + * semantics.c (expand_or_defer_fn): Honor -fkeep-inline-functions. + + PR c++/16965 + * cp-tree.h (qualified_name_lookup_error): Add parameter. + * name-lookup.c (do_class_using_decl): Restrict set of entities + passed to cp_emit_debug_info_for_using more carefully. + (lookup_qualified_name): Allow lookup_member to return sets of + ambiguous entries. + * parser.c (cp_parser_lookup_name): Add ambiguous_p parameter. + (cp_parser_primary_expression): Handle ambiguous lookups. + (cp_parser_template_name): Adjust use of cp_parser_lookup_name. + (cp_parser_template_argument): Likewise. + (cp_parser_elaborate_type_specifier): Likewise. + (cp_parser_namespace_name): Likewise. + (cp_parser_class_name): Likewise. + (cp_parser_lookup_name_simple): Likewise. + * pt.c (tsubst_qualified_id): Handle ambiguous results. + (tsubst_expr): Likewise. + * semantics.c (qualified_name_lookup_error): Add decl paramter. + For ambiguous lookups, print candidates. + +2004-08-16 Kriang Lerdsuwanakij + + PR c++/6749 + * pt.c (instantiate_pending_templates): Add int parameter. Don't + return anything. + * cp-tree.h (instantiate_pending_templates): Adjust prototype. + * decl2.c (finish_file): Adjust call to + instantiate_pending_templates. + +2004-08-15 Roger Sayle + + * call.c (build_vfield_ref, build_call, build_conditional_expr, + convert_arg_to_ellipsis, build_x_va_arg, build_over_call, + build_java_interface_fn_ref, build_special_member_call, + build_new_method_call, initialize_reference): Replace calls to + build with calls to buildN. + * class.c (build_base_path, convert_to_base_statically, + build_vfn_ref, instantiate_type, dfs_accumulate_vtbl_inits, + build_vtbl_initializer): Likewise. + * cp-gimplify.c (genericize_try_block, genericize_catch_block, + gimplify_if_stmt, cp_genericize_r): Likewise. + * cvt.c (convert_to_void): Likewise. + * decl.c (check_initializer, finish_constructor_body, + finish_destructor_body): Likewise. + * error.c (dump_expr): Likewise. + * except.c (build_exc_ptr, expand_start_catch_block, build_throw): + Likewise. + * init.c (perform_member_init, expand_virtual_init, + expand_cleanup_for_base, build_init, expand_default_init, + build_offset_ref, decl_constant_value, build_new, build_new_1, + build_vec_delete_1, build_vec_init, build_delete, + push_base_cleanups, build_vec_delete): Likewise. + * mangle.c (write_integer_cst): Likewise. + * method.c (thunk_adjust, do_build_copy_constructor, + do_build_assign_ref): Likewise. + * pt.c (lookup_template_function, tsubst, tsubst_copy_and_build, + unify, build_non_dependent_expr): Likewise. + * rtti.c (build_headof, build_typeid, ifnonnull, + build_dyanmic_cast_1, tinfo_base_init): Likewise. + * semantics.c (begin_compound_stmt, finish_call_expr, + finish_pseudo_destructor_expr, finish_id_expression, + simplify_aggr_init_expr, finalize_nrv_r): Likewise. + * tree.c (build_target_expr, build_cplus_new, array_type_nelts_top, + array_type_nelts_total, stabilize_call): Likewise. + * typeck.c (decay_conversion, build_class_member_access_expr, + lookup_destructor, build_ptrmemfunc_access_expr, build_array_ref, + get_member_function_from_ptrfunc, build_binary_op, pointer_diff, + build_x_unary_op, build_unary_op, unary_complex_lvalue, + build_compound_expr, build_modify_expr, expand_ptrmemfunc_cst, + check_return_expr): Likewise. + * typeck2.c (split_nonconstant_1, split_nonconstant_init_1, + split_nonconstant_init, store_init_value, build_m_component_ref): + Likewise. + +2004-08-15 Nathan Sidwell + + * call.c (convert_class_to_reference, + build_user_type_conversion_1, convert_like_real, + build_java_interface_fn_ref, build_special_member_call): Use + build_int_cst. + * class.c (build_vtbl_initializer): Likewise. + * cp-gimplify.c (cp_gimplify_expr): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + * decl.c (cxx_init_decl_processing, complete_array_type): Likewise. + * decl2.c (start_static_initialization_or_destruction, + generate_ctor_or_dtor_function): Likewise. + * except.c (build_throw): Likewise. + * lex.c (cxx_init): Likewise. + * mangle.c (write_integer_cst): Likewise. + * rtti.c (build_headof, get_tinfo_decl_dynamic, + build_dynamic_cast_1, ptr_initializer, ptm_initializer, + get_pseudo_ti_init): Likewise. + * search.c (get_dynamic_cast_base_type): Likewise. + * tree.c (build_shared_int_cst): Likewise. + +2004-08-12 Mark Mitchell + + PR c++/16273 + * class.c (count_depth_data): New type. + (dfs_depth_post): New function. + (dfs_depth_q): Likewise. + (find_final_overrider_data_s): Change type of vpath. + Add vpath_list. + (dfs_find_final_overrider_1): New function. + (dfs_find_final_overrider): Use it. + (dfs_find_final_overrider_q): Adjust use of vpath. + (dfs_find_final_overrider_post): Likewise. + (find_final_overrider): Use dfs_depth. Allocate and deallocate + vpath_list. + +2004-08-12 Jan Beulich + + * parser.c (cp_parser_asm_definition): Properly consume scope operator + tokens preceding the clobbers. Don't check for scope operator + following inputs. Simplify inputs handling to match that now used for + clobbers. + +2004-08-11 Mark Mitchell + + PR c++/16698 + * except.c (build_throw): Allocate cleanup_type and the function + for __cxa_throw separately. + + PR c++/16853 + * call.c (standard_conversion): Do not accept conversions between + pointers to members if the class types are unrelated. + + PR c++/16618 + * parser.c (cp_parser_builtin_offsetof): Cast to "const volatile + char &" instead of just "char &". + + PR c++/16870 + * pt.c (tsubst): Just return the unknown_type_node. + +2004-08-11 Mark Mitchell + + PR c++/16964 + * parser.c (cp_parser_class_specifier): Robustify. + + PR c++/16904 + * pt.c (tsubst_copy_and_build): Complain about invalid + qualification. + + PR c++/16929 + * pt.c (tsubst_default_argument): Clear out current_class_ptr and + current_class_ref while tsubsting. + +2004-08-10 Mark Mitchell + + PR c++/16971 + * parser.c (cp_parser_init_declarator): Robustify. + +2004-08-06 Richard Sandiford + + * typeck2.c (process_init_constructor): Guard the missing field warning + with warn_missing_field_initializers rather than extra_warnings. + +2004-08-06 Paolo Bonzini + + * class.c (instantiate_type) : Do not handle. + +2004-08-05 Mark Mitchell + + * decl.c (start_preparsed_function): Move determine_visibility + call. + * decl2.c (determine_visibility): Incorporate dllexport testing. + +2004-08-05 Geoffrey Keating + + * g++spec.c (lang_specific_driver): An -Xlinker or -Wl, option + means that libstdc++ is needed. + +2004-08-05 Nathan Sidwell + + * cvt.c (cp_convert_to_pointer): Adjust force_fit_type call. + +2004-08-04 Geoffrey Keating + + * decl.c (make_rtl_for_nonlocal_decl): Set DECL_ASSEMBLER_NAME rather + than passing it as a parameter to rest_of_decl_compilation. + * decl2.c (grokfield): Use set_user_assembler_name. + +2004-08-04 Nathan Sidwell + + * decl.c (complete_array_type): Don't gratuitously copy + maxindex. Its type is always set. + +2004-08-04 Paul Brook + + * Make-lang.in (cp/semantics.o, cp/optimize.o): Depend on TARGET_H. + * cp-tree.h (struct language_function): Rename x_dtor_label to + x_cdtor_label. + (dtor_label): Rename ... + (cdtor_label): ... to this. + * decl.c (begin_constructor_body): Remove. + (check_special_function_return_type): Maybe change the return type. + (grokdeclarator): Pass the class type. + (start_preparsed_function): Constructors may need a return label. + (finish_constructor_body, finish_destructor_body): Set the return + value. + (begin_function_body): Don't call begin_constructor_body. + (finish_function): Don't warn for constructors or destructors. + (implicitly_declare_fn): Maybe change the return type. + * optimize.c: Include target.h. + (maybe_clone_body): Remap the function result. + * semantics.c: Include target.h. + (finish_return_stmt): Maybe jump to return label for constructors. + +2004-08-03 Mark Mitchell + + * class.c (build_vtable): Do not set DECL_VISIBILITY here. + (check_field_decls): Or here. + (check_methods): Or here. + (initialize_array): Don't mess with DECL_CONTEXT. + * cp-tree.h (start_decl): Adjust prototype. + (determine_visibility): New function. + * decl.c (duplicate_decls): Remove checks for hidden "operator + new". + (build_library_fn_1): Give all library functions default + visibility. + (start_decl): Add pop_scope_p parameter. Tidy. + (cp_finish_decl): Do not pop scopes here. Call + determine_visibility for variable definitions. + (start_preparsed_function): Call determine_visibility. + * decl2.c (determine_visibility): New function. + * method.c (use_thunk): Fix formatting. + * parser.c (cp_parser_condition): Adjust calls to start_decl. + (cp_parser_init_declarator): Likewise. + * pt.c (instantiate_decl): Always call pop_nested_class. + * rtti.c (get_tinfo_decl): Do not set DECL_VISIBILITY. + (tinfo_base_init): Likewise. + +2004-08-02 Mark Mitchell + + PR c++/16707 + * name-lookup.c (validate_nonmember_using_decl): Robustify. + +2004-08-01 Mark Mitchell + + PR c++/16224 + * name-lookup.c (decl_namespace): Remove. + (current_decl_namespace): Use decl_namespace_context instead of + decl_namespace. + (push_decl_namespace): Likewise. + (arg_assoc_class): Likewise. + (arg_assoc_type): Likewise. + * pt.c (check_specialization_namespace): New function. + (maybe_process_partial_specialization): Use it. + (register_specialization): Likewise. + + PR c++/16489 + * cp-tree.h (DECL_INTEGRAL_CONSTANT_VAR_P): New macro. + * call.c (null_ptr_cst_p): Handle variables with constant + initializers. + * pt.c (convert_nontype_argument): Use + DECL_INTEGRAL_CONSTANT_VAR_P. + * semantics.c (finish_id_expression): Likewise. + + PR c++/16529 + * decl.c (duplicate_decls): Reject duplicate namespace + declarations. + + PR c++/16810 + * typeck.c (build_ptrmemfunc): Loosen assertion. + +2004-08-01 Gabriel Dos Reis + + * call.c (z_candidate::template_decl): Rename from template. + (add_template_candidate_real): Adjust member reference. + (joust): Likewise. + +2004-07-29 Mark Mitchell + + * cp-tree.h (IDENTIFIER_REPO_CHOSEN): Define. + (lang_decl_flags): Narrow the width of "languages". Add + repo_available_p. + (DECL_NEEDED_P): Remove. + (FOR_EACH_CLONE): New macro. + (DECL_REPO_AVAILABLE_P): Likewise. + (DECL_TINFO_P): Likewise. + (set_linkage_according_to_type): Declare. + (import_export_vtable): Remove. + (import_export_tinfo): Likewise. + (mark_needed): New function. + (decl_needed_p): Likewise. + (note_vauge_linkage_fn): Likewise. + (init_repo): Change prototype. + (repo_template_used): Remove. + (repo_template_instantiated): Likewise. + (repo_emit_p): New function. + (repo_export_class_p): Likewise. + (no_linkage_check): Change prototype. + * class.c (set_linkage_according_to_type): New function. + (build_vtable): Use it. Do not call import_export_vtable. Set + DECL_IGNORED_P if appropriate. + * decl.c (duplicate_decls): Preserve DECL_REPO_AVAILABLE_P. + (make_rtL_for_nonlocal_decls): Check for template instantiations + explicitly. + (grokfndecl): Adjust call to no_linkage_check. + (set_linkage_for_static_data_member): New function. + (grokvardecl): Use it. Adjust call to no_linkage_check. + (grokdeclarator): Use set_linkage_for_static_data_member. + * decl2.c (note_vague_linkage_fn): New function. + (note_vague_linkage_var): Likewise. + (finish_static_data_member_decl): Use it. + (import_export_vtable): Remove. + (import_export_class): Use repo_export_class_p. + (var_finalized_p): Simplify. + (maybe_emit_vtables): Simplify. + (mark_needed): New function. + (decl_needed_p): Likewise. + (import_export_decl): Add documentation and consistency checks. + Use repo_emit_p. Handle virtual tables and RTTI information + here. + (import_export_tinfo): Remove. + (write_out_vars): Call import_export_decl. + (cxx_callgraph_analyze_expr): Ensure that all vtables are emitted + whenever one is. + (finish_file): Use decl_needed_p. Do not call import_export_decl + for undefined static data members. Do not warn about undefined + inlines when using a repository. + (mark_used): Use note_vague_linkage_fn. Always defer template + instantiations. + * lex.c (cxx_init): Adjust call to init_repo. Always set + flag_unit_at_a-time. + * method.c (synthesize_method): Remove unncessary + import_export_decl call. + (implicitly_declare_fn): Use set_linkage_according_to_type. + * optimize.c (maybe_clone_body): Use FOR_EACH_CLONE. + * pt.c (instantiate_class_template): Don't redundantly add classes + to keyed_classes. Don't call repo_template_used. + (tsubst_decl): Set DECL_INTERFACE_KNOWN for instantiations of + templates with internal linkage. + (check_instantiated_args): Adjust call to no_linkage_check. + (instantiate_template): Use FOR_EACH_CLONE. + (mark_definable): New function. + (mark_decl_instantiated): Use it. + (do_decl_instantiation): Adjust tests for explicit instantiation + after "extern template". + (instantiate_class_member): Do not use repo_template_instantiated. + (do_type_instantiation): Simplify. + (instantiate_decl): Use mark_definable. Check repo_emit_p. + Simplify. + * repo.c (repo_get_id): Remove. + (original_repo): Remove. + (IDENTIFIER_REPO_USED): Remove. + (IDENTIFIER_REPO_CHOSEN): Remove. + Remove all #if 0'd code. + (repo_template_used): Remove. + (repo_template_instantiated): Remove. + (temporary_obstack_initialized_p): New variable. + (init_repo): Register with lang_post_pch_load. Avoid creating + identifiers unnecessarily. Don't use original_repo. Close the + file here. + (reopen_repo_file_for_write): Not here. + (finish_repo): Always write out a new repository file. + (repo_emit_p): New function. + (repo_export_class_p): Likewise. + * rtti.c (get_tinfo_decl): Use set_linkage_according_to_type. + (involves_incomplete_p): New function. + (tinfo_base_init): Use it. + (ptr_initializer): Remove non_public_ptr parameter. + (ptm_initializer): Likewise. + (get_pseudo_ti_init): Likewise. + (unemitted_tinfo_decl_p): Remove. + (emit_tinfo_decl): Use import_export_decl. + * semantics.c (expand_body): Move updates of static_ctors and + static_dtors to ... + (expand_or_defer_fn): ... here. + * tree.c (no_linkage_check): Add relaxed_p parameter. + +2004-07-28 Eric Christopher + + * cp-lang.c (LANG_HOOKS_UNSAFE_FOR_REEVAL): Delete. + +2004-07-28 Nathan Sidwell + + * cp-tree.h (struct tree_pair_s): New. + (typedef tree_pair_p): New. + (DEF_VEC_O(tree_pair_s)): New. + (struct lang_type_class): Make vcall_indices a VEC(tree_pair_s). + (CLASSTYPE_VCALL_INDICES): Update documentation. + * class.c (get_vcall_index): Adjust. + (add_vcall_offset): Adjust. + +2004-07-27 Kelley Cook + + * pt.c, typeck.c: Remove spurious carriage returns. + +2004-07-27 Kriang Lerdsuwanakij + + PR c++/14429 + * pt.c (coerce_template_template_parms) : Only check + when the type of ARG is not dependent. + +2004-07-26 Geoffrey Keating + + * g++spec.c (LIBSTDCXX_PROFILE): Default to LIBSTDCXX. + (lang_specific_driver): If the C++ or math library options don't + start with '-l', don't count them as added libraries. + +2004-07-26 Nathan Sidwell + + * decl.c (xref_basetypes): Adjust base access vector creation. + * rtti.c (get_pseudo_ti_init, get_pseudo_ti_desc): Adjust base + access accesses. + * search.c (dynamic_cast_base_recurse, dfs_access_in_type): Likewise. + +2004-07-26 Niall Douglas + Brian Ryner + + PR c++/15000 + PR c++/9283 + * class.c (check_field_decls): Apply hidden visibility if + -fvisibility-inlines-hidden and inlined unless otherwise specified + (build_vtable): Set vtable visibility to class visibility. + (check_field_decls): Default static member visibility to class + visibility. + (check_methods): Default method visibility to class visibility. + * cp-tree.h: Added CLASSTYPE_VISIBILITY and + CLASSTYPE_VISIBILITY_SPECIFIED macro. + * decl.c (duplicate_decls): New logic for merging definition decls + with declaration decls. Added ignore & warning when non default + applied to global operator new or delete. + * method.c, optimize.c, rtti.c: Added setting of VISIBILITY_SPECIFIED + wherever VISIBILITY was changed + * rtti.c (get_tinfo_decl): Set typeinfo visibility to class + visibility. + (tinfo_base_init): Set typeinfo name visibility to class visibility. + +2004-07-25 Bernardo Innocenti + + * decl.c: Rename all identifiers named `class' to `cl'. + * cp-tree.h: Likewise. + +2004-07-25 Gabriel Dos Reis + + * cp-tree.h (TYPE_SET_PTRMEMFUNC_TYPE): Use GGC_CNEW. + * typeck2.c (abstract_virtuals_error): Use GGC_NEW. + * name-lookup.c (binding_entry_make): Use GGC_NEW. + (binding_table_construct): Use GGC_CNEWVEC. + (binding_table_new): Use GGC_NEW. + (cxx_binding_make): Likewise. + (begin_scope): Likewise. + (push_to_top_level): Use GCC_CNEW. + * parser.c (cp_token_cache_new): Likewise. + (cp_token_cache_push_token): Likewise. + (cp_lexer_new_main): Likewise. + (cp_lexer_new_from_tokens): Likewise. + (cp_parser_context_new): Likewise. + (cp_parser_new): Likewise. + (cp_lexer_new_from_tokens): Use GGC_NEWVEC. + * lex.c (cxx_make_type): Use GGC_CNEW. + (retrofit_lang_decl): Use GGC_NEWVAR. + (cxx_dup_lang_specific_decl): Likewise. + (copy_lang_type): Likewise. + * decl.c (use_label): Use GGC_NEW instead of ggc_alloc. + (save_function_data): Likewise. + (lookup_label): Use GGC_CNEW instead of ggc_alloc_cleared. + (cxx_push_function_context): Likewise. + +2004-07-25 Richard Henderson + + * decl.c (start_preparsed_function): Set DECL_ARTIFICIAL and + DECL_IGNORED_P on RESULT_DECL. + * semantics.c (finalize_nrv): Copy them too. + +2004-07-23 Nathan Sidwell + + * search.c (lookup_conversion_operator): Avoid two loops. + (add_conversions): Remove. + (check_hidden_convs, split_conversions, + lookup_conversions_r): New. + (lookup_conversions): Use lookup_conversions_r. + +2004-07-22 Nathan Sidwell + + * pt.c (get_template_base): Check type is completable. + +2004-07-21 Eric Christopher + + * decl.c (poplevel): Inline unused variable checking. + Change formatting. + +2004-07-21 Paolo Bonzini + + * typeck.c (build_binary_op): Do not use RDIV_EXPR for + integer vectors. + +2004-07-21 Giovanni Bajo + + PR c++/14497 + * pt.c (check_explicit_specialization): Remove extension to accept + specializations without template headers. Fall-through to normal + processing. + +2004-07-21 Giovanni Bajo + + PR c++/509 + * pt.c (determine_specialization): New parameter template_count. + Disambiguate between member templates and member functions counting + the template headers. + (check_explicit_specialization): Update caller. + (tsubst_friend_function): Likewise. + +2004-07-20 Steven Bosscher + + * cp-tree.def (TINST_LEVEL): Make it an 'x' node. + * cp-tree.h (tinst_level_t): New tree type. + (union lang_tree_node): Handle it. + (TINST_LOCATION): New accessor macro. + (make_tinst_level): New prototype. + * cp-lang.c (cp_tree_size): Handle TINST_LEVEL. + * decl.c (cp_tree_node_structure): Likewise. + * error.c (print_instantiation_full_context): Use TINST_LOCATION. + (print_instantiation_partial_context): Likewise. + * pt.c (pop_tinst_level): Likewise. + (push_tinst_level): Use make_tinst_level. + * tree.c (make_tinst_level): New function. + (cp_walk_subtrees): Walk TINST_DECL for a TINST_LEVEL node. + +2004-07-20 Mark Mitchell + + * parser.c (cp_parser_simple_type_specifier): Fix typo. + + PR c++/16637 + * parser.c (cp_parser_simple_type_specifier): Do not record usage + of globally-qualified names. + +2004-07-20 Kriang Lerdsuwanakij + + PR c++/16175 + * error.c (dump_type) : Output + cv qualifier. + +2004-07-19 Mark Mitchell + + PR c++/16623 + * cp-tree.h (lang_type_class): Add lazy_assignment_op. + (CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro. + * class.c (add_implicitly_declared_members): Use + CLASSTYPE_LAZY_ASSIGNMENT_OP. + * method.c (lazily_declare_fn): Clear + CLASSTYPE_LAZY_ASSIGNMENT_OP. + * search.c (lookup_fnfields_1): Check it. + +2004-07-20 Nathan Sidwell + + * cp-tree.h (vec_binfo_member): Remove. + * tree.c (vec_binfo_member): Remove. + + * cp-tree.h (struct lang_type_class): Remove vfields field. + (CLASSTYPE_VFIELDS): Remove. + (SET_BINFO_NEW_VTABLE_MARKED): Adjust. + * class.c (determine_primary_base): Remove CLASSTYPE_VFIELDS + handling. + (dfs_modify_vtables): Use TYPE_CONTAINS_VPTR_P. + (finish_struct_1): Remove CLASSTYPE_VFIELDS handling. + * init.c (dfs_initialize_vtbl_ptrs): Use TYPE_CONTAINS_VPTR_P. + +2004-07-20 Nathan Sidwell + + * cp-tree.h (DEF_VEC_P(tree)): Remove here. + (BINFO_SUBVTT_INDEX, BINFO_VPTR_INDEX, BINFO_PRIMARY_BASE_OF): + Moved to common. + (BINFO_LANG_SLOTS): Remove. + * tree.c (copy_binfo): Adjust BINFO creation and accessors. + * decl.c (xref_basetypes): Adjust BINFO creation and accessors. + * class.c (check_bases): Adjust BINFO accessors. + (determine_primary_base, finish_struct_bits, + maybe_warn_about_overly_private_class, warn_hidden, + walk_subobject_offsets, propagate_binfo_offsets, end_of_class, + warn_about_ambiguous_bases, get_vfield_name, + dump_class_hierarchy_r, build_vtt_inits, accumulate_vtbl_inits, + add_vcall_offset_vtbl_entries_r): Likewise. + * dump.c (cp_dump_tree): Likewise. + * init.c (sort_mem_initializers, expand_member_init, build_delete, + push_base_cleanups): Likewise. + * method.c (do_build_copy_constructor, do_build_assign_ref, + synthesize_exception_spec): Likewise. + name-lookup.c (arg_assoc_class): Likewise. + * pt.c (instantiate_class_template, + get_template_base_recursive): Likewise. + * rtti.c (get_pseudo_ti_init, get_pseudo_ti_desc): Likewise. + * typeck2.c (process_init_constructor): Likewise. + * search.c (lookup_base_r, dynamic_cast_base_recurse, + dfs_access_in_type, dfs_walk_real, look_for_overrides, + types_overlap_p, copied_binfo, original_binfo): Likewise. + (binfo_for_vtable): Remove + +2004-07-20 Steven Bosscher + + * cp-tree.h (struct lang_decl_flags): Unify the template_info and + thunk_alias, and the access and virtual_offset fields. + (THUNK_VIRTUAL_OFFSET, THUNK_ALIAS): Adjust. + * decl.c (finish_case_label): Update c_add_case_node call. + +2004-07-19 Mark Mitchell + + Revert patch for PR c++/16623. + +2004-07-19 Kelley Cook + + * except.c: Remove two spurious carriage returns. + +2004-07-19 Mark Mitchell + + PR c++/16623 + * cp-tree.h (lang_type_class): Add lazy_assignment_op. + (CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro. + * class.c (add_implicitly_declared_members): Use + CLASSTYPE_LAZY_ASSIGNMENT_OP. + * method.c (lazily_declare_fn): Clear + CLASSTYPE_LAZY_ASSIGNMENT_OP. + * search.c (lookup_fnfields_1): Check it. + +2004-07-19 Nathan Sidwell + + * class.c (add_method): Delay adding the slot until the end. + (determine_primary_base): Adjust VEC_iterate invokation. + (resort_type_method_vec, finish_struct_methods, warn_hidden, + walk_subobject_offsets, end_of_class, warn_about_ambiguous_bases, + build_vtbl_initializer): Likewise. + * init.c (sort_mem_initializers, build_delete, push_base_cleanups, + build_vbase_delete): Likewise. + * method.c (do_build_copy_constructor): Likewise. + * name-lookup.c (new_class_binding, print_binding_level, + poplevel_class, store_class_bindings, push_to_top_level, + pop_from_top_level): Likewise. + * pt.c (check_explicit_specialization): Likewise. + * search.c (lookup_conversion_operator, lookup_fnfields_1, + get_pure_virtuals, add_conversions, dfs_check_overlap, + binfo_for_vbase): Likewise. + +2004-07-19 Kriang Lerdsuwanakij + + PR c++/12170 + * pt.c (unify) : Use only + innermost set of template arguments during deduction. Simplify. + +2004-07-19 Joseph S. Myers + + * typeck.c (build_modify_expr, build_x_modify_expr): Set + TREE_NO_WARNING on assignments with an operator other than '='. + +2004-07-10 Steven Bosscher + Joseph S. Myers + + * cp-tree.h (C_SET_EXP_ORIGINAL_CODE): Remove. + * decl2.c (grokfield): Don't check current_class_depth via + unused TREE_COMPLEXITY. + * semantics.c (finish_parenthesized_expr): Set TREE_NO_WARNING + to avoid the missing parentheses warning. + Don't set C_SET_EXP_ORIGINAL_CODE. + +2004-07-18 Mark Mitchell + + * tree.c (no_linkage_helper): Remove. + (no_linkage_check): Don't use walk_tree_without_duplicates. + + * mangle.c (write_expression): Issue a sorry for zero-operand + functional casts. + +2004-07-18 Kriang Lerdsuwanakij + + PR c++/13092 + * init.c (build_offset_ref): Build SCOPE_REF with non-null + TREE_TYPE for non-dependent names. + * typeck.c (build_x_unary_op): Handle non-dependent SCOPE_REF. + * pt.c (type_dependent_expression_p): Handle SCOPE_REF with + unknown_type_node as its TREE_TYPE. + * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. + * error.c (dump_decl) : Use pp_expression. + (dump_expr) : Likewise. + +2004-07-17 Jason Merrill + + PR c++/16115 + * call.c (type_passed_as): Make the invisible reference type + __restrict. + * cp-gimplify.c (gimplify_cleanup_stmt): Rename to + cp_genericize_r. Handle invisible reference lowering. + (is_invisiref_parm): New fn. + (cp_genericize): Adjust the types of invisible reference parms. + Don't repeat the walk for clones. + * decl.c (store_parm_decls): Don't generate any code for clones. + +2004-07-17 Joseph S. Myers + + * cp-tree.h (builtin_function): Declare. + +2004-07-16 Mark Mitchell + + * class.c (finish_struct_methods): Remove unncessary code. + (add_implicitly_declared_members): Create declarations for default + constructors and copy constructors lazily. + * cp-tree.h (lang_type_class): Remove lazy_default_ctor and + lazy_copy_ctor. + (CLASSTYPE_LAZY_DEFAULT_CTOR): New macro. + (CLASSTYPE_LAZY_COPY_CTOR): Likewise. + * decl2.c (check_classfn): Robustify. + (locate_dtor): Handle empty CLASSTYPE_METHOD_VEC. + (locate_ctor): Handle lazy default constructors. + (locate_copy): Handle lazy copy constructors. + (implicitly_declare_fn): Make sure we're looking at the + TYPE_MAIN_VARIANT for a class before creating functions. Don't + set TYPE_HAS_CONSTRUCTOR. + (lazily_declare_fn): New function. + * name-lookup.c (constructor_name_full): Simplify. + * search.c (lookup_fnfields_1): Lazily create methods, as + necessary. + (lookup_for_overrides): Handle empty CLASSTYPE_METHOD_VEC. + +2004-07-16 Steven Bosscher + + * cp-tree.h (struct lang_type): Don't have three GTY options on a + single bit GTY desc. + +2004-07-16 Richard Henderson + + * cp-lang.c (LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING): Die. + * cp-tree.h (cp_copy_res_decl_for_inlining): Remove. + * tree.c (cp_copy_res_decl_for_inlining): Remove. + +2004-07-16 Nathan Sidwell + + * class.c (finish_struct_bits): Use for loop. + (propagate_binfo_offsets): Do primary binfo outside of loop. + + PR c++/16583 + * dump.c (cp_dump_tree): Don't dump the bases if there's no + binfo. + + * pt.c (tsubst) : We should never get here. + +2004-07-15 Mark Mitchell + + * cp-tree.h (lang_type_class): Remove has_real_assign_ref and + has_abstract_assign_ref. Make methods a VEC(tree) *. + (TYPE_HAS_CONST_ASSIGN_REF): Add documentation. + (CLASSTYPE_CONSTRUCTORS): Adjust for changes to CLASSTYPE_METHOD_VEC. + (CLASSTYPE_DESTRUCTORS): Likewise. + (TYPE_HAS_REAL_ASSIGN_REF): Remove. + (TYPE_HAS_ABSTRACT_ASSIGN_REF): Likewise. + (add_method): Change prototoype. + * class.c (add_method): Remove error_p parameter. Adjust for + changes to CLASSTYPE_METHOD_VEC. + (handle_using_decl): Adjust call to add_method. + (maybe_warn_about_overly_private_class): Adjust for + changes to CLASSTYPE_METHOD_VEC. + (resort_type_method_vec): Likewise. + (finish_struct_methods): Likewise. + (check_for_override): Likewise. + (warn_hidden): Likewise. + (add_implicitly_declared_members): Defer creation of assignment + operators. Adjust call to add_method. + (clone_function_decl): Adjust call to add_method. + (check_bases_and_members): Don't set TYPE_HAS_REAL_ASSIGN_REF. + (finish_struct_1): Use CLASSTYPE_DESTRUCTORS. + * decl.c (grok_special_member_properties): Don't set + TYPE_HAS_ABSTRACT_ASSIGN_REF. + * decl2.c (check_classfn): Adjust for + changes to CLASSTYPE_METHOD_VEC. + * method.c (locate_dtor): Use CLASSTYPE_DESTRUCTORS. + (locate_ctor): Use CLASSTYPE_CONSTRUCTORS. + (locate_copy): Adjust for changes to CLASSTYPE_METHOD_VEC. + (implicitly_declare_fn): Set DECL_SOURCE_LOCATION. Do not call + cp_finish_decl. + * pt.c (check_explicit_specialization): Adjust for + changes to CLASSTYPE_METHOD_VEC. + (instantiate_class_template): Do not set + TYPE_HAS_ABSTRACT_ASSIGN_REF. + * ptree.c (cxx_print_type): Don't try to print + CLASSTYPE_METHOD_VEC. + * rtti.c (emit_support_tinfos): Use CLASSTYPE_DESTRUCTORS. + * search.c (lookup_field_r): Adjust for + changes to CLASSTYPE_METHOD_VEC. + (lookup_fnfields): Likewise. + (lookup_conversion_operator): Likewise. + (lookup_fnfields_1): Likewise. Create assignment operators + lazily. + (look_for_overrides_here): Adjust for + changes to CLASSTYPE_METHOD_VEC. + (add_conversions): Likewise. + * semantics.c (finish_member_declaration): Adjust call to add_method. + +2004-07-15 Jason Merrill + + * cp-lang.c (cxx_types_compatible_p): To the middle-end, + references and pointers are compatible. + +2004-07-15 Nathan Sidwell + + * decl.c (xref_basetypes): Refactor. + * tree.c (copy_base_binfos): Replace with ... + (copy_binfo): ... this. Deep copy the given binfo, (not the just + bases of the given base). + * cp-tree.h (copy_base_binfo): Remove. + (copy_binfo): Declare. + +2004-07-15 Mark Mitchell + + * name-lookup.c (set_inherited_value_binding_p): Add class_type + parameter. + (get_class_binding): Adjust. + (push_class_level_binding): Don't use set_inherited_value_binding_p. + +2004-07-15 Nathan Sidwell + + * class.c (finish_struct_bits): Don't set TYPE_HAS_CONVERSION here. + * decl.c (xref_basetypes): Set it here. + + * class.c (check_bases): Don't set CLASSTYPE_NON_AGGREGATE here. + Don't check for incomplete base. + (get_vfield_name): Simplify while loop. + * decl.c (xref_basetypes): Set CLASSTYPE_NON_AGGREGATE here. + +2004-07-14 Mark Mitchell + + * lex.c (cxx_make_type): Remove call to get_pointer_type. + + * cp-tree.h (IDENTIFIER_VALUE): Remove. + (BINFO_PUSHDECLS_MARKED): Likewise. + (maybe_inject_for_scope_var): Likewise. + (push_class_decls): Likewise. + * name-lookup.h (push_class_binding): Remove. + (innermost_non_namespace_value): New function. + (outer_binding): Likewise. + * class.c (add_method): Push bindings before adding to + TYPE_METHODS. + (restore_class_cache): Do not restore class_shadowed. + (pushclass): Do not add USING_DECLs. Do not call + push_class_decls. + * config-lang.in (gtfiles): Remove $(srcdir)/cp/search.c. + * decl.c (pushdecl): Use outer_binding. + (poplevel): Set the scope for an out-of-scope for-loop declaration + appropriately. + (cp_finish_decl): Don't call maybe_inject_for_scope_var. + * name-lookup.c (new_class_binding): New function. + (push_binding): Use it. + (pushdecl): Use innermost_non_namespace_value. + (maybe_inject_for_scope_var): Remove. + (push_class_binding): Remove. + (set_inherited_value_binding_p): New function. + (get_class_binding): New function. + (push_class_level_binding): Assert that the current_class_type is + being defined. + (outer_binding): New function. + (innermost_non_namespace_value): Likewise. + (lookup_name_real): Use outer_binding. + (lookup_name_current_level): Ignore out-of-scope variables. + * pt.c (check_template_shadow): Use innermost_non_namespace_value. + (lookup_template_class): Likewise. + * search.c (dfs_push_type_decls): Remove. + (dfs_push_decls): Likewise. + (setup_class_bindings): Likewise. + (lookup_field_1): Handle USING_DECLs from dependent scopes. + (marked_pushdecls_p): Remove. + (unmarked_pushdecls_p): Remove. + (marked_identifiers): Remove. + (setup_class_bindings): Remove. + (dfs_push_type_decls): Remove. + (dfs_push_decls): Remove. + (push_class_decls): Remove. + +2004-07-13 Mark Mitchell + + PR c++/16518 + PR c++/16337 + * decl.c (grokvardecl): Make declspecs parameter const. + (grokdeclarator): Likewise. Adjust accordingly. + * decl.h (grokdeclarator): Adjust declaration. + * parser.c (cp_parser_init_declarator): Do not clear + decl_specifiers->attributes. + + * cp-tree.h (lang_identifier): Remove class_value. + (IDENTIFIER_CLASS_VALUE): Remove. + (pop_class_decls): Likewise. + (init_search_processing): Likewise. + * class.c (handle_using_decl): Use lookup_member, not + IDENTIFIER_CLASS_VALUE. + (restore_class_cache): New function, split out from ... + (pushclass): ... here. Do not call clear_identifier_class_values. + (invalidate_class_lookup_cache): Do not clear + IDENTIFIER_CLASS_VALUE. + (popclass): Do not call pop_class_decls. + (maybe_note_name_used_in_class): Do not save names looked up after + the class is complete. Use lookup_member, not + IDENTIFIER_CLASS_VALUE. + * config-lang.in (gtfiles): Add $(srcdir)/cp/search.c. + * decl.c (cxx_init_decl_processing): Do not call + init_search_processing. + * method.c (do_build_copy_constructor): Remove unnecessary code. + (do_build_assign_ref): Likewise. + * name-lookup.c (pushdecl): Use lookup_member, not + IDENTIFIER_CLASS_VALUE. + (set_identifier_type_value_with_scope): Set TREE_TYPE on the + type_shadowed list. + (poplevel_class): Do not restore IDENTIFIER_CLASS_VALUE. + (push_class_binding): Do not set it. + (clear_identifier_class_values): Remove. + (push_class_level_binding): Do not set IDENTIFIER_CLASS_VALUE. + (store_binding): Do not save it. + (pop_from_top_level): Do not restore it. + * name-lookup.h (cxx_saved_binding): Remove class_value. + (clear_identifier_class_values): Remove. + * ptree.c (cxx_print_identifier): Do not print + IDENTIFIER_CLASS_VALUE. + * search.c (search_obstack): Remove. + (push_stack_level): Remove. + (pop_stack_level): Remove. + (search_level): Remove. + (search_stack): Remove. + (lookup_member): Don't check IDENTIFIER_CLASS_VALUE. + (setup_class_bindings): Use IDENTIFIER_MARKED, not + IDENTIFIER_CLASS_VALUE. + (marked_identifiers): New variable. + (push_class_decls): Clear IDENTIFIER_MARKED. + (pop_class_decls): Don't call pop_search_level. + (init_search_processing): Remove. + +2004-07-12 Mark Mitchell + + * cp-tree.h (get_aggr_typedef): Remove. + * init.c (get_aggr_typedef): Likewise. + + * name-lookup.c (push_class_level_binding): Simplify. + +2004-07-12 Andrew Pinski + + PR c++/16475 + Revert: + 2004-07-07 H.J. Lu + PR c++/16276 + * rtti.c (emit_tinfo_decl): Turn off DECL_ONE_ONLY if typeinfo + is not public. + +2004-07-12 Eric Christopher + + * parser.c (cp_parser_class_head): Remove unused variable. + +2004-07-12 Giovanni Bajo + + * decl.c (grok_op_properties): Reject [de-]allocation functions + declared in a namespace, or declared as static. + +2004-07-12 Nathan Sidwell + + * cp-tree.h (make_binfo): Remove. + * decl.c (xref_basetypes): Use make_tree_binfo directly. + * tree.h (copy_base_binfos): Likewise. + (make_binfo): Remove. + + * call.c (build_user_type_conversion_1, build_new_op, + check_constructor_callable, build_temp, + perform_direct_initialization_of_possible): Pass type directly to + lookup_fnfields & build_special_member_call. + (build_special_member_call): Accept a type, and complete it. + * class.c (finish_stuct_bits): Copy the BINFOs here. + * cvt.c (ocp_convert): Pass type directly to + build_special_member_call. + * decl.c (build_ptrmemfunc_type): Call xref_bastypes here. + (xref_basetypes): Allocate the binfo here. Adjust. + * init.c (build_init, build_new_1): Pass type directly to + build_special_member_call. + * lex.c (cxx_make_type): Do not allocate binfo here. + * name-lookup.c (arg_assoc_class): Incomplete types have no binfo. + * parser.c (cp_parser_class_head): Always call xref_basetypes. + * pt.c (instantiate_class_template): Likewise. Inhibit access + checking for template friends. + * ptree.c (cxx_print_type): Adjust record printing. + * search.c (lookup_base): When taking a type, complete it before + looking for a binfo. + (lookup_member): Delay completing a type. + (push_class_decls): Don't walk an incomplete type. + (lookup_conversions): Likewise. + * semantics.c (finish_stmt_expr_expr): Pass type directly to + build_special_member_call. + * tree.c (copy_base_binfos): Adjust. + (make_binfo): Likewise. + * typeck.c (build_modify_expr): Pass type directly to + build_special_member_call. + * typeck2.c (process_init_constructor): Check a binfo exists. + (build_m_component_ref): Allow accessing an incomplete type. + (build_functional_cast): Pass type directly to + build_special_member_call. + +2004-07-12 Giovanni Bajo + + PR c++/2204 + * config-lang.in (gtfiles): Add typeck2.c. + * Make-lang.in: Tweak typeck2.c dependencies, and add rule for + gt-cp-typeck2.h. + * cp-tree.h: Declare complete_type_check_abstract. + * typeck2.c (pat_calc_hash, pat_compare, + complete_type_check_abstract): New functions. + (abstract_virtuals_error): If the type is abstract, register the + declaration within abstract_pending_vars for further checks. + Inspect also dependent types. Handle IDENTIFIER_NODEs as decl. + * decl.c (cp_finish_decl): Do not strip array types. + (create_array_type_for_decl): Check for abstractness of the element + type. + (complete_vars): Call complete_type_check_abstract. + * class.c (finish_struct): Prepare a list of virtual functions for + template types, and call complete_vars on it to check for abstractness. + +2004-07-12 Paolo Bonzini + + PR tree-optimization/14107 + * decl.c (finish_function): Remove temporary band-aid. + +2004-07-11 Mark Mitchell + + * call.c (build_operator_new_call): Avoid using push_to_top_level. + (build_new_op): Adjust call to lookup_function_nonclass. + * name-lookup.c (identifier_type_value): Adjust call to + lookup_name_real. + (lookup_name_real): Add block_p parameter. + (lookup_name_nonclass): Adjust call to lookup_name_real. + (lookup_function_nonclass): Likewise. + (lookup_name): Likewise. + * name-lookup.h (lookup_name_real): Change prototype. + (lookup_name_nonclass): Likewise. + * parser.c (cp_parser_lookup_name): Likewise. + + * cp-tree.h (saved_scope): Make old_bindings a vector. + (unuse_fields): Remove. + * name-lookup.h (cxx_saved_binding): Define it. + * class.c (pushclass): Don't use unuse_fields. + * name-lookup.c (cxx_saved_binding_make): Remove. + (store_binding): Add new bindings to a vector, using an + accumulator style, rather than adding them to a list. + (store_bindings): Adjust accordingly. + (store_class_bindings): Likewise. + (push_to_top_level): Likewise. + (pop_from_top_level): Likewise. + * optimize.c (maybe_clone_body): Must push_to_top_level and + pop_from_top_level calls outside of loop. + * parser.c (cp_parser_class_specifier): Move push_scope/pop_scope + calls here from cp_parser_late_parsing_default_args. + (cp_parser_save_default_args): Record the class type in which the + function is declared. + (cp_parser_late_parsing_default_args): Do not call + push_nested_class/pop_nested_class. + * search.c (dfs_unuse_fields): Remove. + (unuse_fields): Remove. + +2004-07-11 Joseph S. Myers + + * cp-lang.c (LANG_HOOKS_MAYBE_BUILD_CLEANUP, LANG_HOOKS_PUSHLEVEL, + LANG_HOOKS_POPLEVEL, LANG_HOOKS_UPDATE_DECL_AFTER_SAVING): Remove. + * cp-tree.h (poplevel): Declare. + (set_block): Remove. + * decl.c (set_block): Remove. + +2004-07-10 Mike Stump + + * decl2.c (import_export_class): Never export/import vtables + with inline key functions. + +2004-07-09 Steven Bosscher + + * typeck.c (c_expand_asm_operands): Remove. + +2004-07-09 Mike Stump + + * typeck.c (build_class_member_access_expr): Skip null deref + warning when we don't dereference it. + +2004-07-09 Giovanni Bajo + + PR c++/8211 + PR c++/16165 + * class.c (check_field_decls): Improve -Weffc++ warning: do not + warn for pointers to functions/members, or for classes without + destructors. + +2004-07-08 Mark Mitchell + + * name-lookup.h (struct cp_binding_level): Update documentation + for class_shadowed. + +2004-07-08 Giovanni Bajo + + PR c++/16169 + * typeck.c (check_return_expr): Improve -Weffc++ warning: handle + returning CALL_EXPR, and non-reference return type. + +2004-07-08 Nathan Sidwell + + * name-lookup.c (push_binding): Use VEC_reserve. + +2004-07-08 Richard Henderson + + * cp-tree.h (expand_eh_spec_block): Remove. + +2004-07-07 Mark Mitchell + + * cp-tree.h (saved_scope): Remove x_previous_class_type and + x_previous_class_values; add x_previous_class_level. + (previous_class_type): Remove. + (previous_class_values): Remove. + (previous_class_level): New macro. + * class.c (pushclass): Restore the identifier cache more + expeditiously. + (invalidate_class_lookup_cache): Use vector for class_shadowed and + previous_class_values. + * decl.c (poplevel): Likewise. + * name-lookup.c (cxx_binding_init): New function. + (cxx_binding_make): Use it. + (push_binding): For a binding in a class level, use a vector of + cp_class_binding nodes. + (push_binding_level): New function. + (begin_scope): Use it. + (leave_scope): Do not put class binding levels on the free list. + (print_binding_level): Adjust for the fact that class_shadowed is + a vector. + (poplevel_class): Likewise. + (clear_identifier_class_values): Likewise. + (push_class_level_binding): Likewise. + (set_class_shadows): Remove. + (store_binding): New function. + (store_class_bindings): New function. + (push_to_top_level): Use store_class_bindings as appropriate. + (pop_from_top_level): Use previous_class_level, not + previous_class_type. + * name-lookup.h (cp_class_binding): New type. + (cp_binding_level): Use a vector object for class_shadowed. + (push_binding_level): Declare. + (set_class_shadows): Remove. + +2004-07-07 Andrew Pinski + + * class.c (instantiate_type): BUFFER_REF is dead. + * lex.c (init_operators): IN_EXPR is dead. + +2004-07-07 Jason Merrill + + PR c++/16334 + * call.c (build_new_op): Give overload warnings for built-in + candidates. + +2004-07-07 H.J. Lu + + PR c++/16276 + * rtti.c (emit_tinfo_decl): Turn off DECL_ONE_ONLY if typeinfo + is not public. + +2004-07-07 Nathan Sidwell + + * cp-tree.h (CLASSTYPE_N_BASECLASSES): Remove. + * class.c (build_primary_vtable, check_bases, + determine_primary_base, finish_struct_bits, + maybe_warn_about_overly_private_class, dfs_find_final_overrider_q, + get_basefndecls, warn_hidden, walk_subobject_offsets, + build_base_fields, create_vtable_ptr, propagate_binfo_offsets, + layout_virtual_bases, end_of_class, warn_about_ambiguous_bases, + finish_struct_1, get_vfield_name, contains_empty_class_p, + dump_class_hierarchy_r, finish_vtbls, build_vtt_inits, + dfs_ctor_vtable_bases_queue_p, accumulate_vtbl_inits, + add_vcall_offset_vtbl_entries_r, cp_fold_obj_type_ref): Adjust + BINFO macros. + * decl.c (xref_basetypes): Likewise. + * dump.c (cp_dump_tree): Likewise. + * error.c (dump_expr): Likewise. + * init.c (sort_mem_initializers, expand_member_init, + push_base_cleanups): Likewise. + * method.c (do_build_copy_constructor, do_build_assign_reg, + synthesize_exception_spec): Likewise. + * name-lookup.c (arg_assoc_class): Likewise. + * pt.c (instantiate_class_template, tsubst, + get_template_base_recursive): Likewise. + * ptree.c (cxx_print_type): Likewise. + * rtti.c (get_psuedo_ti_init, get_pseudo_ti_desc): Likewise. + * search.c (lookup_base_r, dynamic_cast_base_recurse, + dfs_access_in_type, access_in_type, lookup_field_queue_p, + bfs_walk, dfs_walk_real, look_for_overrides, markedp, unmarkedp, + marked_pushdecls_p, unmarked_pushdecls_p, dfs_debug_markedp, + dfs_debug_unmarkedp, dfs_check_overlap, dfs_no_overlap_yet, + binfo_for_vtable, copied_binfo, original_binfo): Likewise + * tree.c (copy_base_binfos, make_binfo): Likewise. + * typeck.c (commmon_base_type): Likewise + * typeck2.c (process_init_constructor): Likewise + +2004-07-06 Joseph S. Myers + + * decl.c (check_tag_decl): Name redeclared type in diagnostic. + +2004-07-06 Giovanni Bajo + + PR c++/3671 + * pt.c (convert_nontype_argument): Disallow conversions between + different enumeration types. + +2004-07-06 Nathan Sidwell + + * cp-tree.h (BINFO_MARKED): Remove. + (BINFO_VTABLE_PATH_MARKED, BINFO_NEW_VTABLE_MARKED, + BINFO_DEPENDENT_BASE_P, BINFO_LOST_PRIMARY_P, + BINFO_INDIRECT_PRIMARY_P): Use appropriate BINFO_FLAG_n. + (SET_BINFO_NEW_VTABLE_MARKED): Use BINFO_VIRTUAL_P. + * class.c (build_base_path): Use BINFO_VIRTUAL_P. + (mark_primary_bases, determine_primary_base, base_derived_from, + dfs_find_final_overrider, dfs_find_final_overrider_q, + dfs_find_inal_overrider_post, update_vtable_entry_for_fn, + dfs_modify_vtables, walk_subobject_offsets, + layout_nonempty_base_or_field, build_base_field, + build_base_fields, propagate_binfo_offsets, layout_virtual_bases, + end_of_class, get_vfield_name, dump_class_hierarchy, dump_vtable, + finish_vtbls, build_vtt_inits, dfs_build_secondary_vptr_vtt_inits, + build_ctor_vtbl_group, accumulate_vtble_inits, + dfs_accumulate_vtbls_inits, build_vbase_offset_vtbl_entries, + build_vcall_offset_vtbl_entries, add_vcall_offset_vtbl_entries_r, + add_vcall_offset_vtbl_entries_1): Likewise. + * decl.c (xref_basetypes): Incoming virtual base indicated by + TREE_TYPE. Adjust. + * dump.c (cp_dump_tree): Use BINFO_VIRTUAL_P. + * init.c (finish_init_stmts, sort_mem_initializers, + emit_mem_initializers, build_vtble_address, expand_member_init, + push_base_cleanups): Likewise. + * method.c (do_build_copy_constructor): Likewise. + * pt.c (instantiate_class_template, + get_template_base_recursive): Likewise. + * rtti.c (dfs_class_hint_mark, get_pseudo_ti_init, + get_pseudo_ti_desc): Likewise. + * search.c (lookup_base_r, dynamic_cast_base_recurse, + binfo_from_vbase, binfo_via_virtual, copied_binfo, + original_binfo): Likewise. + * semantics.c (finish_base_specifier): Virtualness is indicated + by TREE_TYPE. + * tree.c (copy_base_binfos): Use BINFO_VIRTUAL_P. + +2004-07-06 Mark Mitchell + + Revert: + 2004-06-24 Jason Merrill + PR c++/16115 + * decl.c (grokparms): Give the PARM_DECL reference type if the + parameter is passed by invisible reference. + +2004-07-05 Richard Kenner + + * cp-lang.c (cp_var_mod_type_p): Add extra arg. + * decl.c (grokdeclarator): Extra arg to variably_modified_type_p. + * pt.c (check_instantiated_args, unify): Likewise. + +2004-07-05 Phil Edwards + + * Make-lang.in (check-c++, lang_checks): Add some comments. + +2004-07-05 Zack Weinberg + + * cp-mudflap.c: Delete file. + * Makefile.in: Remove all references to cp-mudflap.o. + +2004-07-05 Zack Weinberg + + * decl.c (cxx_init_decl_processing): Call + build_common_tree_nodes before creating the global NAMESPACE_DECL. + +2004-07-05 Giovanni Bajo + + PR c++/2518 + * call.c (build_operator_new_call): Look only at global scope. + +2004-07-05 Nathan Sidwell + + * call.c (enforce_access): Expect TREE_BINFO. + * class.c (binfo_ctor_vtable): Check TREE_BINFO. + * cp-tree.h (RECORD_OR_UNION_TYPE_CHECK): Remove. + (BINFO_SUBVTT_INDEX, BINFO_VPTR_INDEX, BINFO_PRIMARY_BASE_OF): + Adjust. + (BINFO_LANG_ELTS): Remove. + (BINFO_LANG_SLOTS): New. + (TYPE_RAISES_EXCEPTIONS, ENUM_TEMPLATE_INFO): Use TYPE_LANG_SLOT_1. + (CLASSTYPE_TEMPLATE_INFO): Adjust. + * pt.c (tsubst): Split TREE_BINFO case from TREE_VEC case. + * search.c (lookup_member): Check TREE_BINFO. + * semantics.c (perform_or_defer_access_check): Likewise. + (check_accessibility_of_qualified_id): Check + deferred_access_no_check. + * tree.c (make_binfo): Use make_tree_binfo. + +2004-07-04 Mark Mitchell + + * method.c (implicitly_declare_fn): Set linkage of generated + functions. + +2004-07-04 Richard Henderson + + * typeck.c (cxx_mark_addressable): Don't put_var_into_stack. + +2004-07-03 Scott Brumbaugh + + PR c++/3761 + * name-lookup.c (push_class_level_binding): Don't pass a + TREE_LIST of ambiguous names to check_template_shadow as it + only handles declarations. Instead, pull the declaration + out and pass that. + +2004-07-03 Giovanni Bajo + + PR c++/14971 + * pt.c (check_explicit_specialization): Clarify error message. + +2004-07-02 Richard Henderson + + * tree.c (cp_unsave_r): Update remap_save_expr call. + +2004-07-02 Mark Mitchell + + PR c++/16240 + * mangle.c (write_template_arg): Correct mangling. + + PR c++/16297 + * decl.c (grokdeclarator): Robustify. + +2004-07-01 Richard Henderson + + * class.c (fixed_type_or_null): Don't handle RTL_EXPR. + * method.c (synthesize_method): Don't clear_last_expr. + * name-lookup.c (maybe_push_cleanup_level): Likewise. + +2004-07-01 Nick Clifton + + * decl2.c (import_export_class): Invoke the + import_export_class field in the gcc_target structure if it is not + empty. + +2004-06-30 Richard Henderson (rth@redhat.com> + + * decl.c (start_preparsed_function): Don't set immediate_size_expand. + * method.c (use_thunk): Likewise. + +2004-06-30 Joseph S. Myers + + * call.c (build_over_call), typeck.c (build_function_call): Call + check_function_arguments instead of check_function_format. + +2004-06-30 Joseph S. Myers + + * call.c (build_over_call), typeck.c (build_function_call): Update + calls to check_function_format. + +2004-06-30 Richard Henderson + + * call.c (build_over_call): Use __builtin_memcpy for copying + CLASS_AS_BASE rather than funny casting. + +2004-06-30 Richard Henderson + + * init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and + TYPE_SIZE_UNIT of full_type. + +2004-06-30 Per Bothner + + Conditionally compile support for --enable-mapped_location. + * decl.c (pop_label): Handle (imperfectly) USE_MAPPED_LOCATION case. + * decl2.c: If USE_MAPPED_LOCATION, don't do some line number + adjustments - which I don't understand. + * error.c (dump_decl): Rename "" to "". + * error.c: Use LOCATION_FILE and EXPR_LOCATION macros. + (print_instantiation_partial_context): Use expand_location. + * decl.c (duplicate_decl): Use new DECL_IS_BUILTIN macro. + * name-lookup.c: Likewise. + * lex.c (cxx_init): Likewise. Also use BUILTINS_LOCATION. + * name-lookup.c: Use input_line macro. + * parser.c (cp_lexer_get_preprocessor_token): Use UNKNOWN_LOCATION. + (cp_parser_statement): Rename locaal variable statement_locus to + statement_location and use SET_EXPR_LOCATION macro. + * pt.c: Handle USE_MAPPED_LOCATION case. Use new macros. + * tree.c (cp_walk_subtrees): Likewise. + +2004-06-29 Per Bothner + + * tree.c (build_min_nt, build_min, build_min_non_dep): + Don't set TREE_COMPLEXITY from input_line. + +2004-06-29 Paul Brook + + * init.c: Include target.h. + (get_cookie_size): Remove and replace with target hook. + Update callers. + (build_new_1): Store the element size in the cookie. + +2004-06-29 Nathan Sidwell + + PR c++/16260 + * parser.c (cp_parser_template_declaration_after_export): Disable + access checks here ... + (cp_parser_class_specifier): ... not here. + +2004-06-28 Nathan Sidwell + + * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK, + VAR_FUNCTION_OR_PARM_DECL_CHECK, RECORD_OR_UNION_TYPE_CHECK, + BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK): Use appropriate + TREE_CHECK macro. + +2004-06-28 Nathan Sidwell + + * cp-tree.h (struct deferred_access): Move to ... + * semantics.c (struct deferred_access): ... here. Adjust. + (deferred_access_stack): Make a VEC(deferred_access), + (deferred_access_free_list): Remove. + (deferred_access_no_check): New. + (push_deferring_access_checks, resume_deferring_access_checks, + stop_deferring_access_checks, pop_deferring_access_checks, + get_deferred_access_checks, pop_to_parent_deferring_access_checks, + perform_deferred_access_checks, perform_or_defer_access_check): Adjust. + +2004-06-28 Nathan Sidwell + + PR c++/16174 + * call.c (build_temp): Declare. + (check_constructor_callable): New. + (reference_binding): Only set CHECK_COPY_CONSTRUCTOR if not for + CONSTRUCTOR_CALLABLE. + (convert_like_real, initialize_reference): Use + check_constructor_callable. + * cp-tree.h (LOOKUP_CONSTRUCTOR_CALLABLE): New. + (LOOKUP_*): Renumber. + +2004-06-28 Nathan Sidwell + + * friend.c (add_friend): Only perform access checks when context + is a class. + * lex.c (cxx_make_type): Only create a binfo for aggregate types. + * parser.c (cp_parser_class_specifier): Disable access checks here + when parsing the body of a templated class. + * semantics.c (perform_or_defer_access_checks): Reorder to allow + NULL binfos when not checking access. + +2004-06-28 Nathan Sidwell + + Use vector API for vbase list. + * cp-tree.h: Include vec.h + (DEF_VEC_P (tree)): New type. + (struct lang_type_class): Change vbase's member type. + (binfo_for_vbase): Declare. + * class.c (determine_primary_base, base_derived_from, + update_vtable_entry_for_fn, walk_subobject_offsets, end_of_class, + warn_about_ambiguous_bases, dfs_accumulate_vtbl_inits, + build_vtbl_initializer): Adjust. + * decl.c (xref_basetypes): Adjust, accumulate upper bound of + vbases. + * init.c (sort_mem_initializers, expand_member_init, + push_base_cleanups): Adjust. + * method.c (do_build_copy_constructor): Adjust. + * search.c (get_pure_virtuals, copied_binfo, original_binfo): Adjust. + (binfo_for_vbase): New. + * tree.c (copy_base_binfos): Adjust. + +2004-06-28 Mark Mitchell + + * parser.c (cp_parser_set_decl_spec_type): Fix thinko. + +2004-06-27 Gabriel Dos Reis + + PR c++/14123 + * cxx-pretty-print.c (pp_cxx_ptr_operator): Properly put + paranthesis in case of pointers to array members. + * error.c (dump_type_prefix): Likewise. + (dump_type_suffix): Maybe issue a whitespace when printing + ARRAY_TYPE. + +2004-06-27 Mark Mitchell + + PR c++/16193 + * parser.c (cp_parser_set_decl_spec_type): Refine test for + redefinition of built-in types. + +2004-06-27 Gabriel Dos Reis + + * error.c (pp_template_argument_list_start): Remove. + (pp_template_argument_list_end): Likewise. + (pp_separate_with_comma): Use pp_cxx_separate_with. + (reinit_global_formatting_buffer): Remove. + (pp_non_consecutive_character): Likewise. + (dump_scope): Use pp_cxx_colon_colon. + (dump_template_parameter): Use pp_cxx_identifier, + pp_cxx_tree_identifier and pp_cxx_whitespace. + (dump_templat_bindings): Replace use of pp_string with sequence + of pp_cxx_whitespace and pp_equal. + (dump_type): Use pp_cxx_identifier, pp_cxx_tree_identifier, + pp_cxx_colon_colon, pp_cxx_whitespace throughout. Don't set + padding here. + (dump_aggr_type): Use pp_cxx_identifier amd pp_cxx_tree_identifier. + (dump_type_prefix): Don't set padding. Use pp_cxx_whitespace, + pp_cxx_left_parent, pp_cxx_colon_colon and pp_cxx_star troughout. + (dump_type_suffix): Use pp_cxx_right_paren, pp_cxx_left_bracket, + pp_cxx_right_bracket, pp_cxx_identifier throughout, + (dump_decl): Likewise. + (dump_template_decl): Likewise. + (dump_function_decl): Likewise. Set padding as appropriate. + (dump_parameters): Use pp_cxx_left_paren, pp_cxx_identifier and + pp_cxx_right_paren. + (dump_exception_spec): Likewise. + (dump_function_name): Use pp_cxx_tree_identifier and + pp_cxx_identifier. + (dump_template_parms): Use pp_cxx_begin_template_argument_list and + pp_cxx_end_template_argument_list. + (dump_expr): Use pp_cxx_left_paren, pp_cxx_right_paren, + pp_cxx_colon_colon, pp_cxx_identifier, pp_cxx_tree_identifier and + pp_cxx_whitespace throughout. + (dump_binary_op): Use pp_cxx_whitespace, pp_cxx_left_paren and + pp_cxx_right_paren. + (dump_unary_op): Likewise. + (reinit_cxx_pp): New function. + (type_as_string); Use it. + (expr_as_string): Likewise. + (decl_as_string); Likewise. + (context_as_string): Likewise. + (lang_decl_name): Likewise. + (decl_to_string): Likewise. + (expr_to_string): Likewise. + (parm_to_string): Likewise. + (type_to_string): Likewise. + (args_to_string): Likewise. + (cv_to_string): Likewise. + +2004-06-26 Mark Mitchell + + * cp-tree.h (cp_cv_quals): New type. + (cp_declarator): Use it instead of "tree" as appropriate. + (grok_method_quals): Adjust prototype. + (grokclassfn): Likewise. + (do_friend): Likewise. + * decl.c (grokfndecl): Use cp_cv_quals, not tree. + (grokdeclarator): Likewise. + * decl2.c (grok_method_quals): Likewise. + (grokclassfn): Likewise. + * friend.c (do_friend): Likewise. + * method.c (implicitly_declare_fn): Adjust call to grokclassfn. + * parser.c (make_call_declarator): Use cp_cv_quals, not tree. + (make_pointer_declarator): Likewise. + (make_reference_declarator): Likewise. + (make_ptrmem_declarator): Likewise. + (cp_parser_ptr_operator): Likewise. + (cp_parser_cv_qualifier_seq_opt): Likewise. + (cp_parser_cv_qualifier_opt): Remove. + (cp_parser_new_declarator_opt): Adjust call to + cp_parser_ptr_operator. + (cp_parser_conversion_declaration_opt): Likewise. + (cp_parser_declarator): Use cp_cv_quals, not tree. + (cp_parser_direct_declarator): Likewise. + +2004-06-26 Richard Kenner + + * call.c, cp-tree.h, cxx-pretty-print.c, decl.c, decl2.c: + Rename DECL_STMT to DECL_EXPR. + * init.c, name-lookup.c, parser.c, pt.c, semantics.c: Likewise. + * cp-lang.c (LANG_HOOKS_SAFE_FROM_P): Deleted. + * tree.c (cp_walk_subtrees): Don't call c_walk_subtrees. + +2004-06-26 Jan Hubicka + + PR C++/14865 + * decl2.c (maybe_emit_vtables): Always import_export_vtable for the + reachability analysis. + +2004-06-25 Mark Mitchell + + * cp-mudflap.c (mflang_flush_calls): Fix thinkos resulting from + 2004-06-23 change. + +2004-06-25 Paul Brook + + * decl2.c (get_guard): Call targetm.cxx.guard_type. + (get_guard_bits, get_guard_cond): Call targetm.cxx.guard_mask_bit. + +2004-06-24 Mark Mitchell + + * decl.c (grokdeclarator): Restore error messages about __thread. + * parser.c (cp_parser_decl_specifier_seq): Likewise. + +2004-06-24 Jason Merrill + + PR c++/16115 + * decl.c (grokparms): Give the PARM_DECL reference type if the + parameter is passed by invisible reference. + +2004-06-24 Andreas Schwab + + * cp-tree.h (enum cp_storage_class): Remove trailing comma. + +2004-06-23 Mark Mitchell + + * Make-lang.in (cp/lex.o): Do not depend on cp/lex.h. + (cp/decl.o): Likewise. + (cp/decl2.o): Likewise. + (cp/pt.o): Likewise. + (cp/semantics.o): Likewise. + * config-lang.in (gtfiles): Do not reference cp/lex.h. + * class.c: Do not include lex.h. + (add_implicitly_declared_members): Do not use + adding_implicit_members. + (check_bases_and_members): Do not talk about grok_x_components. + * cp/cp-tree.h (adding_implicit_members): Remove. + (cp_storage_class): New type. + (cp_decl_spec): Likewise. + (cp_decl_specifier_seq): Likewise. + (cp_parameter_declarator): Use it for the decl_specifiers field. + (check_tag_decl): Adjust prototype. + (shadow_tag): Likewise. + (groktypename): Likewise. + (start_decl): Likewise. + (start_function): Likewise. + (start_method): Likewise. + (grok_x_components): Remove. + (grokfield): Adjust prototype. + (grokbitfield): Likewise. + (finish_member_class_template): Remove. + * decl.c: Do not include lex.h. + (adding_implicit_members): Do not define. + (check_tag_decl): Do not use trees to represent decl-specifiers. + (shadow_tag): Likewise. + (groktypename): Likewise. + (start_decl): Likewise. + (grokvardecl): Likewise. + (grokdeclarator): Likewise. + (grokparms): Likewise. + (start_function): Likewise. + (start_method): Likewise. + * decl.h (grokdeclarator): Adjust prototype. + * decl2.c: Do not include lex.h. + (grok_x_components): Remove. + (grokfield): Do not use trees to represent decl-specifiers. + (grokbitfield): Likewise. + * lex.c: Do not include lex.h. + * lex.h: Remove. + * parser.c: Include target.h. + (clear_decl_specs): New function. + (cp_parser_translation_unit): Do not use trees to represent + decl-specifiers. + (cp_parser_postfix_expression): Likewise. + (cp_parser_new_type_id): Likewise. + (cp_parser_condition): Likewise. + (cp_parser_simple_declaration): Likewise. + (cp_parser_decl_specifier_seq): Likewise. + (cp_parser_function_specifier_opt): Likewise. + (cp_parser_conversion_type_id): Likewise. + (cp_parser_template_parameter): Likewise. + (cp_parser_explicit_instantiation): Likewise. + (cp_parser_type_specifier): Likewise. + (cp_parser_simple_type_specifier): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_type_id): Likewise. + (cp_parser_type_specifier_seq): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_exception_declaration): Likewise. + (cp_parser_function_definition_from_specifiers_and_declarator): + Likewise. + (cp_parser_single_declaration): Likewise. + (cp_parser_save_member_function_body): Likewise. + (cp_parser_friend_p): Likewise. + (cp_parser_set_storage_class): New function. + (cp_parser_set_decl_spec_type): Likewise. + * pt.c: Do not include lex.h. + * semantics.c: Likewise. + (finish_member_class_template): Remove. + +2004-06-23 Roger Sayle + + * call.c (build_cxx_call): Don't call expand_tree_builtin. No + longer take both "args" and "convert_args" as arguments. + (build_op_delete_call): Update call to build_cxx_call. + (build_over_call): Likewise, update call to build_cxx_call. + * cp-tree.h (build_cxx_call): Update funtion prototype. + * typeck.c (build_function_call): Don't call expand_tree_builtin. + * rtti.c (throw_bad_cast): Update call to build_cxx_call. + (throw_bad_typeid): Likewise. + (build_dynamic_cast_1): Likewise. + +2004-06-22 Richard Henderson + + * class.c (build_vfn_ref): Take a pointer not object. Build + an OBJ_TYPE_REF. + (cp_fold_obj_type_ref): New. + * call.c (build_over_call): Update build_vfn_ref call. + * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): New. + * cp-tree.h (cp_fold_obj_type_ref): Declare. + +2004-06-21 Jason Merrill + + PR c++/16112 + * cp-gimplify.c (cp_gimplify_init_expr): Look through + CLEANUP_POINT_EXPR. + +2004-06-21 Mark Mitchell + + * cp-tree.def (NEW_EXPR): Add a fourth slot. + * cp-tree.h (PARMLIST_ELLIPSIS_P): Remove. + (TREE_PARMLIST): Likewise. + (CALL_DECLARATOR_PARMS): Likewise. + (CALL_DECLARATOR_QUALS): Likewise. + (CALL_DECLARATOR_EXCEPTION_SPEC): Likewise. + (cp_declarator_kind): New type. + (cp_parameter_declarator): Likewise. + (cp_declarator): Likewise. + (cp_error_declarator): Likewise. + (no_parameters): Likewise. + (groktypename): Change prototype. + (start_decl): Likewise. + (start_handler_parms): Likewise. + (get_scope_of_declarator): Likewise. + (start_function): Likewise. + (start_preparsed_function): New function. + (start_function): Change prototype. + (start_method): Likewise. + (grokfield): Likewise. + (grokbitfield): Likewise. + (build_new): Likewise. + (make_pointer_declarator): Remove. + (make_reference_declarator): Likewise. + (make_call_declarator): Likewise. + (set_quals_and_spec): Likewise. + (process_template_parm): Change prototype. + (begin_function_definition): Remove. + (finish_parmlist): Remove. + * decl.c (groktypename): Do not use trees to represent + declarators. + (start_decl): Likewise. + (start_handler_parms): Remove. + (get_scope_of_declarator): Reimplement. + (grokdeclarator): Do not use trees to represent declarators. + (grokparms): Likewise. + (start_function): Likewise. + (start_method): Likewise. + (build_void_list_mode): Do not use TREE_PARMLIST. + * decl.h (grokdeclarator): Change prototype. + * decl2.c (grok_method_quals): Robustify. + (grok_x_components): Do not use trees to represent declarators. + (grokfield): Likewise. + (grokbitfield): Likewise. + (start_objects): Build FUNCTION_DECLs, not declarators. + (start_static_storage_duration_function): Likewise. + * init.c (build_new): Simplify. + * lex.c (make_pointer_declarator): Remove. + (make_reference_declarator): Likewise. + (make_call_declarator): Likewise. + (set_quals_and_spec): Likewise. + * method.c (use_thunk): Use start_preparsed_function. + (synthesize_method): Likewise. + (implicitly_declare_fn): Build FUNCTION_DECLs, not declarators. + * optimize.c (maybe_clone_body): Use start_preparsed_function. + * parser.c (cp_error_declarator): New variable. + (declarator_obstack): Likewise. + (alloc_declarator): New function. + (make_declarator): Likewise. + (make_id_declarator): Likewise. + (make_pointer_declarator): Likewise. + (make_reference_declarator): Likewise. + (make_ptrmem_declarator): Likewise. + (make_call_declarator): Likewise. + (make_array_declarator): Likewise. + (no_parameters): New variable. + (make_parameter_declarator): Likewise. + (cp_parser_check_for_definition_in_return_type): Do not use trees + to represent declarators. + (cp_parser_translation_unit): Likewise. + (cp_parser_new_expression): Likewise. + (cp_parser_new_type_id): Likewise. + (cp_parser_new_declarator_opt): Likewise. + (cp_parser_direct_new_declarator): Likewise. + (cp_parser_condition): Likewise. + (cp_parser_declaration_statement): Likewise. + (cp_parser_declaration): Likewise. + (cp_parser_conversion_type_id): Likewise. + (cp_parser_conversion_declarator_opt): Likewise. + (cp_parser_template_parameter_list): Likewise. + (cp_parser_template_parameter): Likewise. + (cp_parser_explicit_instantiation): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_declarator): Likewise. + (cp_parser_direct_declarator): Likewise. + (cp_parser_type_id): Likewise. + (cp_parser_parameter_declaration_clause): Likewise. + (cp_parser_parameter_declaration_list): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_exception_declaration): Likewise. + (cp_parser_check_declarator_template_parameters): Likewise. + (cp_parser_function_definition_from_specifiers_and_declarator): + Likewise. + (cp_parser_save_member_function_body): Likewise. + * pt.c (process_template_parm): Add is_non_type parameter. + (convert_template_argument): Adjust call to groktypename. + (tsubst_call_declarator_parms): Remove use of TREE_PARMLIST. + (tsubst): Do not expect declarators. + (tsubst_copy_and_build): Adjust NEW_EXPR case to handle additional + argument. + (instantiate_decl): Use start_preparsed_function. + * semantics.c (begin_function_definition): Remove. + (finish_parmlist): Remove. + * cp-mudflap.c (mflang_flush_calls): Build FUNCTION_DECLs, not + declarators. + +2004-06-21 Richard Kenner + + * call.c (build_vfield_ref): Add new operand for COMPONENT_REF. + (build_new_method_call): Likewise. + * decl.c (local_variable_p_walkfn): Don't walk into types. + * decl2.c (grok_array_decl): Add new operands for ARRAY_REF. + (build_anon_union_vars): Add new operand for COMPONENT_REF. + * init.c (buld_new): Add new operand for ARRAY_REF. + * method.c (do_build_copy_constructor): New op for COMPONENT_REF. + (do_build_assign_ref): Likewise. + * parser.c (cp_parser_direct_new_declarator): Add new operands + for ARRAY_REF. + (cp_parser_direct_declarator): Likewise. + * pt.c (tsubst): Likewise. + (tsubst_copy, tsubst_copy_and_build): Likewise; also add new operand + for COMPONENT_REF. + * semantics.c (finish_non_static_data_member): Add new operand + for COMPONENT_REF. + * typeck.c (build_class_member_access_expr): Likewise. + (build_class_member_access_expr, finish_class_member_access_expr): + Likewise. + (build_ptrmemfunc_access_expr): Likewise. + (build_array_ref): Add new operands for ARRAY_REF. + * typeck2.c (split_nonconstant_init_1): Likewise; COMPONENT_REF too. + * tree.c (count_trees_r, no_linkage_helper): Don't walk in types. + +2004-06-21 Richard Henderson + + * dump.c (cp_dump_tree): Don't use dump_next_stmt. + * parser.c (cp_parser_jump_statement): Update commentary. + * pt.c (tsubst_expr): Use RETURN_EXPR. + * semantics.c (finish_return_stmt): Likewise. + (finalize_nrv_r): Likewise. + * typeck.c, typeck2.c: Update file start commentary. + +2004-06-21 Richard Henderson + + * semantics.c (finish_expr_stmt): Call verify_sequence_points. + +2004-06-20 Richard Henderson + + * cp-tree.h (add_decl_stmt): Declare. + * pt.c (tsubst_copy): Abort for CLEANUP_POINT_EXPR. + * semantics.c (maybe_cleanup_point_expr): New. + (add_decl_stmt, finish_expr_stmt, finish_return_stmt, + finish_for_expr, finish_switch_cond): Use it. + (finalize_nrv_r): Don't build an EXPR_STMT. Don't frob TREE_CHAIN. + +2004-06-20 Richard Henderson + + * cp-tree.def (CLEANUP_STMT, IF_STMT): Move from c-common.def. + * cp-gimplify.c (gimplify_if_stmt): Move from c-gimplify.c. + (cp_gimplify_expr): Call it. + (gimplify_cleanup_stmt): Move from c-gimplify.c. + (cp_genericize): New. + * decl.c (finish_function): Call it. + * cp-tree.h (cp_stmt_codes): Add CLEANUP_STMT, IF_STMT. + (CLEANUP_BODY, CLEANUP_EXPR, CLEANUP_DECL): Move from c-common.h. + (IF_COND, THEN_CLAUSE, ELSE_CLAUSE): Likewise. + (cp_genericize): Declare. + * cxx-pretty-print.c (pp_cxx_statement): Add CLEANUP_STMT, IF_STMT. + * dump.c (cp_dump_tree): Likewise. + * semantics.c (push_cleanup): Move from c-semantics.c. + +2004-06-20 Zack Weinberg + + * cp-lang.c (has_c_linkage): Implement. + + * cp-tree.h (set_mangled_name_for_decl): Don't prototype. + * decl.c (duplicate_decls): Use COPY_DECL_RTL. + (builtin_function_1): Don't call make_decl_rtl. + (build_cp_library_fn): Don't call set_mangled_name_for_decl. + (grokvardecl): Don't call mangle_decl. + * except.c (nothrow_libfn_p): Look at DECL_NAME, not + DECL_ASSEMBLER_NAME. + * method.c (set_mangled_name_for_decl): Delete. + * name-lookup.c (pushdecl): When a local extern shadows a + file-scope declaration of the same object, give both DECLs the + same DECL_UID. + * typeck.c (cxx_mark_addressable): Don't set TREE_ADDRESSABLE + on DECL_ASSEMBLER_NAME. + +2004-06-19 Richard Henderson + + * cp-gimplify.c: Remove unnecessary prototypes. + (cp_gimplify_stmt): Merge into ... + (cp_gimplify_expr): ... here. Move to end of file. Handle + stmts_are_full_exprs_p frobbing. + * cp-tree.h (cp_gimplify_stmt): Remove. + * pt.c (tsubst_expr): Merge prep_stmt and unify. + * tree.c (init_tree): Don't set lang_gimplify_stmt. + +2004-06-18 Richard Henderson + + PR c++/16034 + * semantics.c (begin_cond): New. + (finish_cond): Rewrite to handle template DECL_STMTs specially. + Assume that non-template decls go land before the conditional. + (simplify_loop_decl_cond): Likewise. + (begin_if_stmt, finish_if_stmt_cond, begin_while_stmt, + finish_while_stmt_cond, finish_for_init_stmt, finish_for_cond, + begin_switch_stmt, finish_switch_cond): Update to match. + +2004-06-17 Jason Merrill + + PR c++/16015 + * semantics.c (simplify_aggr_init_expr): Don't return the slot. + (finish_stmt_expr_expr): Update type after conversions. + (finish_stmt_expr): Wrap initializer in CLEANUP_POINT_EXPR. + Handle void initializer. + * tree.c (build_cplus_new): Make AGGR_INIT_EXPRs void. + +2004-06-17 Geoffrey Keating + + * class.c (build_clone): Don't call defer_fn, let mark_used do it. + * cp-tree.h (defer_fn): Delete. + * decl2.c (defer_fn): Delete. + (finish_file): Simplify deferred_fns loops; check that + only used inline functions get into deferred_fns. + (mark_used): Inline previous contents of defer_fn. + +2004-06-16 Richard Henderson + + * cp-tree.h (COMPOUND_STMT_TRY_BLOCK, COMPOUND_STMT_BODY_BLOCK): Kill. + (BIND_EXPR_TRY_BLOCK, BIND_EXPR_BODY_BLOCK): New. + * cxx-pretty-print.c (pp_cxx_function_definition): Move handling + of CTOR_INITIALIZER ... + (pp_cxx_statement): ... here. + * decl.c (begin_function_body): Don't set COMPOUND_STMT_BODY_BLOCK. + (finish_function): Use alloc_stmt_list to zap entire function. + * parser.c (cp_parser_compound_statement): Update commentary. + * pt.c (tsubst_expr): Use BIND_EXPR instead of COMPOUND_STMT. + * semantics.c (begin_compound_stmt, finish_compound_stmt): Likewise. + (finish_stmt_expr): Don't look through COMPOUND_STMT. + +2004-06-16 Geoffrey Keating + + * pt.c (mark_decl_instantiated): Don't call defer_fn. + +2004-06-16 Richard Henderson + + * parser.c (cp_parser_labeled_statement): Update commentary. + * pt.c (tsubst_expr): Use CASE_LABEL_EXPR. + * tree.c (mark_local_for_remap_r): Likewise. + +2004-06-16 Richard Henderson + + * parser.c (cp_parser_asm_definition): Update commentary. + * pt.c (tsubst_expr): Use ASM_EXPR. + * semantics.c (finish_asm_stmt): Likewise. + +2004-06-16 Richard Henderson + + * decl.c (finish_destructor_body): Use LABEL_EXPR. + * parser.c (cp_parser_statement): Update commentary. + * pt.c (tsubst_expr): Use LABEL_EXPR, GOTO_EXPR. + * semantics.c (finish_goto_stmt, finish_label_stmt): Likewise. + * tree.c (mark_local_for_remap_r): Likewise. + +2004-06-16 Richard Henderson + + PR c++/16012 + * semantics.c (begin_for_stmt, begin_for_stmt): Do put the init + statement in FOR_INIT_STMT for templates. + +2004-06-15 Richard Henderson + + * call.c (initialize_reference): Don't build CLEANUP_STMT here. + * cp-gimplify.c (cp_gimplify_stmt): Remove next_p argument. + (genericize_try_block): Use gimplify_stmt. + (genericize_catch_block, genericize_eh_spec_block): Likewise. + (cp_gimplify_init_expr): Remove STMT_EXPR special case. + (gimplify_must_not_throw_expr): Update voidify_wrapper_expr call. + * cp-lang.c (LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P): Remove. + (cp_tree_chain_matters_p): Remove. + * cp-tree.h (COMPOUND_STMT_TRY_BLOCK): New. + (COMPOUND_STMT_BODY_BLOCK): New. + (STATEMENT_LIST_NO_SCOPE, STATEMENT_LIST_TRY_BLOCK): New. + (EXPR_STMT_STMT_EXPR_RESULT): New. + (building_stmt_tree): Check cur_stmt_list. + (tf_stmt_expr_cmpd, tf_stmt_expr_body): Remove. + (BCS_NO_SCOPE, BCS_TRY_BLOCK, BCS_FN_BODY): New. + * decl.c (poplevel): Use pop_stmt_list for minding cleanups. + (cp_finish_decl): Use push_cleanup. + (start_function, finish_function): Use statement lists. + (finish_stmt): Do nothing. + * except.c (begin_eh_spec_block): Use statement lists. + (check_handlers_1, check_handlers): Likewise. + * init.c (construct_virtual_base): Don't add extra compound stmts. + (build_vec_init): Likewise. + * name-lookup.c (maybe_push_cleanup_level): Use statement lists. + * name-lookup.h (struct cp_binding_level): Add statement_list. + * parser.c (cp_parser_statement): Take the STMT_EXPR node, not a bool. + (cp_parser_labeled_statement, cp_parser_expression_statement, + cp_parser_statement_seq_opt): Likewise. + (cp_parser_compound_statement): Likewise. Take bool for try block. + (cp_parser_selection_statement): Tidy if processing. + (cp_parser_already_scoped_statement): Rewrite to do what it says. + * pt.c (tsubst_copy): Move STMT_EXPR to tsubst_expr. + (tsubst_expr): Rewrite STMT_EXPR processing. Handle STATEMENT_LIST. + Mind COMPOUND_STMT_TRY_BLOCK, EXPR_STMT_STMT_EXPR_RESULT. + * semantics.c (do_poplevel, do_pushlevel): Use statement lists. + (finish_cond): New, rewritten from FINISH_COND. + (simplify_loop_decl_cond): New. + (finish_expr_stmt): Avoid nested EXPR_STMTs. + (begin_if_stmt, finish_if_stmt_cond, finish_then_clause, + begin_else_clause, finish_else_clause, finish_if_stmt, + begin_while_stmt, finish_while_stmt_cond, finish_while_stmt, + begin_do_stmt, finish_do_body, begin_for_stmt, finish_for_init_stmt, + finish_for_cond, finish_for_stmt, begin_switch_stmt, + finish_switch_cond, finish_switch_stmt, begin_try_block, + finish_try_block, finish_cleanup_try_block, finish_function_try_block, + finish_handler_sequence, finish_function_handler_sequence, + begin_handler, finish_handler_parms, finish_handler, + begin_stmt_expr, finish_stmt_expr_expr, finish_stmt_expr): Rewrite + using statement lists. + (begin_compound_stmt): Replace has_no_scope argument with flags. + Update all callers. Use statement lists. + (finish_compound_stmt): Likewise. + (finish_decl_cleanup, finish_eh_cleanup): Use push_cleanup. + (current_scope_stmt_stack): Remove. + (simplify_aggr_init_expr): Don't muck with TREE_CHAIN. + * typeck2.c (split_nonconstant_init_1, split_nonconstant_init): + Rewrite with statement lists. + +2004-06-15 Alexandre Oliva + + * parser.c: Change all assignments of c_lex_string_translate + to true and false to 1 and 0. + (cp_lexer_read_token): Convert type of the translated string. + (cp_parser_skip_to_closing_parentheses): Preserve original + value of c_lex_string_translate, and set it to -1 while + running. + (cp_parser_cache_group): Likewise. + (cp_parser_cache_group_1): Renamed. + (cp_parser_asm_operand_list): Remove redundant setting of + c_lex_string_translate. + (cp_parser_primary_expression) [CPP_STRING, CPP_WSTRING]: + Handle chained strings. + +2004-06-12 Andrew Pinski + + PR c++/14639 + Revert: + 2004-06-02 Andrew Pinski + + * cp-tree.h: Fix typo. + + * cp-tree.h: Include cgraph.h + (DECL_NEEDED_P): Use cgraph_*node on the decl instead of + TREE_SYMBOL_REFERENCED on the DECL_ASSEMBLER_NAME of the decl. + +2004-06-12 Jason Merrill + + PR tree-optimization/14107 + * decl.c (finish_function): Warn about no return in all functions. + +2004-06-15 Paolo Bonzini + + * cp-tree.h (struct language_function): Remove cannot_inline. + * decl.c (save_function_data): cannot_inline is no more. + (cxx_push_function_context): Likewise. + * decl2.c (start_objects, start_static_storage_duration_function): + Reset DECL_INLINE, set DECL_UNINLINABLE. + +2004-06-14 Giovanni Bajo + + PR c++/15967 + * search.c (lookup_field): Propagate the ambiguity list. + (lookup_fnfields): Likewise. + +2004-06-14 Giovanni Bajo + + PR c++/15947 + * parser.c (cp_parser_template_name): Ctors/dtors never need a + template keyword to disambiguate. + +2004-06-14 Mark Mitchell + + PR c++/15096 + * decl.c (grokdeclarator): Ignore pointer-to-members when + computing template depth. + + PR c++/14930 + * name-lookup.c (pushtag): Do not try to put class declarations in + explicit specialization scopes. + +2004-06-11 Andrew Pinski + + * decl.c (grokdeclarator): Do not depend on C99's _Bool's behavior. + +2004-06-11 Mark Mitchell + + PR c++/15862 + * name-lookup.c (unqualified_namespace_lookup): Do not ignore type + bindings for undeclared built-ins. + +2004-06-11 Giovanni Bajo + + * typeck2.c (abstract_virtual_errors): Reword diagnostics, make them + appear at the correct location. + +2004-06-10 Jason Merrill + + PR c++/15875 + Revert: + 2004-06-01 Kriang Lerdsuwanakij + * init.c (build_offset_ref): Build SCOPE_REF with non-null + TREE_TYPE for non-dependent names. + * pt.c (type_dependent_expression_p): Handle SCOPE_REF with + unknown_type_node as its TREE_TYPE. + * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. + * error.c (dump_decl) : Use pp_expression. + (dump_expr) : Likewise. + +2004-06-10 Mark Mitchell + + PR c++/15227 + * parser.c (cp_parser_direct_declarator): Robustify. + + PR c++/15877 + * pt.c (tsubst_copy): Use decl_constant_value on enumeration + constants in non-dependent contexts. + + PR c++/14211 + PR c++/15076 + * typeck.c (build_static_cast): Wrap casts in NON_LVALUE_EXPR when + necessary. + +2004-06-10 Jakub Jelinek + + PR c++/14791 + * decl.c (duplicate_decls): Handle fileptr_type_node arguments + specially. + +2004-06-09 Mark Mitchell + + Revert: + PR c++/15815 + 2004-06-07 Mark Mitchell + * lex.c (handle_pragma_interface): Deprecate. + (handle_pragma_implementation): Likewise. + +2004-06-09 Andrew Pinski + + * g++spec.c (lang_specific_driver): Remove check for -lm + and -lmath when check it see if it was the math library. + +2004-06-08 Giovanni Bajo + + PR c++/7841 + * parser.c (cp_parser_direct_declarator): Reject constructor named + as qualified template-id. + +2004-06-07 Mark Mitchell + + PR c++/15815 + * lex.c (handle_pragma_interface): Deprecate. + (handle_pragma_implementation): Likewise. + +2004-06-07 Mark Mitchell + + PR c++/15766 + * parser.c (cp_parser_iteration_statement): Fix typo in error + message. + + PR c++/14777 + * pt.c (tsubst_default_argument): Do not defer access checks + while substituting into the default argument. + + PR c++/15554 + * pt.c (tsubst_copy): Do not try to substitute for an enumeration + constant in a non-dependent context. + + PR c++/15057 + * except.c (build_throw): Ensure that temp_expr has been + initialized. + +2004-06-06 Roger Sayle + + * cp/cp-tree.h (lvalue_or_else): Add function prototype. + +2004-06-06 Giovanni Bajo + + PR c++/15503 + * parser.c (cp_parser_mem_initializer_id): Gracefully reject + 'typename', and accept 'template'. + +2004-06-03 Andrew Pinski + Jan Hubicka + + PR c++/14639 + * method.c (use_think): Do not mark thunk as referenced. + +2004-06-03 Matt Austern + + PR c++/15428 + * decl2.c (maybe_emit_vtables): If TARGET_WEAK_NOT_IN_ARCHIVE_TOC + is nonzero, and if we see a noninline definition of a key method, + make the vtables nonweak. + +2004-06-02 Matt Austern + + * cp-tree.h (instantiate_decl): new boolean parameter, + undefined_ok. Current behavior is equivalent to its being 0. + * decl2.c (mark_used): Add new argument when calling instantiate_decl + * pt.c (mark_decl_instantiated): Unconditionally make + instantiations explicit unconditionally + (do_decl_instantiation): Don't call SET_DECL_EXPLICIT_INSTANTIATION, + since mark_decl_instantiated now does it. + (instantiate_class_member): New. Instantiate a member of an + explicitly instantiated class template. + (do_type_instantiation): Explicitly instantiate members of an + explicitly instantiated class template. + (instantiate_decl): if undefined_ok is nonzero, and if we're + trying to explicitly instantiated a template with no definition, + change it to an implicit instantiation. + (instantiate_pending_templates): Add new argument to instantiate_decl. + * tree.c (cp_cannot_inline_tree_fn): Likewise. + +2004-06-02 Andrew Pinski + + * cp-tree.h: Fix typo. + + * cp-tree.h: Include cgraph.h + (DECL_NEEDED_P): Use cgraph_*node on the decl instead of + TREE_SYMBOL_REFERENCED on the DECL_ASSEMBLER_NAME of the decl. + +2004-06-01 Jason Merrill + + PR c++/15142 + * call.c (call_builtin_trap): Remove type parm. + (convert_arg_to_ellipsis): Change a non-POD argument to integer type. + (build_x_va_arg): Dereference a null pointer for a non-POD argument. + +2004-06-01 Kriang Lerdsuwanakij + + PR c++/13092 + * init.c (build_offset_ref): Build SCOPE_REF with non-null + TREE_TYPE for non-dependent names. + * pt.c (type_dependent_expression_p): Handle SCOPE_REF with + unknown_type_node as its TREE_TYPE. + * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. + * error.c (dump_decl) : Use pp_expression. + (dump_expr) : Likewise. + +2004-06-01 Richard Henderson + Andrew Pinski + + * lex.c (reswords): Rename "__offsetof" to "__builtin_offsetof". + * parser.c (struct cp_parser): Remove in_offsetof. + (cp_parser_new): Don't set it. + (cp_parser_unary_expression): Don't check it. + (cp_parser_postfix_open_square_expression): Split out from ... + (cp_parser_postfix_expression): ... here. + (cp_parser_postfix_dot_deref_expression): Likewise. + (cp_parser_builtin_offsetof): New. + (cp_parser_primary_expression): Use it. + +2004-06-01 Giovanni Bajo + + PR c++/14932 + * parser.c (cp_parser_postfix_expression): Allow subscript + operator in offsetof. + +2004-05-31 Mark Mitchell + + PR c++/15701 + * friend.c (add_friend): Do not try to perform access checks for + functions from dependent classes. + +2004-05-31 Gabriel Dos Reis + + * cxx-pretty-print.c (pp_cxx_colon_colon): Expor. + (pp_cxx_begin_template_argument_list): Turn into a function. + (pp_cxx_end_template_argument_list): Likewise. + (pp_cxx_separate_with): Define. + (pp_cxx_unqualified_id): Tidy. + (pp_cxx_primary_expression): Likewise. + (pp_cxx_postfix_expression): Likewise. + (pp_cxx_expression): Likewise. + (pp_cxx_simple_type_specifier): Likewise. + (pp_cxx_type_specifier_seq): Likewise. + (pp_cxx_parameter_declaration_clause): Likewise. + (pp_cxx_exception_specification): Likewise. + (pp_cxx_direct_declarator): Likewise. + (pp_cxx_type_id): Likewise. + * cxx-pretty-print.h (pp_cxx_whitespace): Export from + cxx-pretty-print.c. + (pp_cxx_left_paren): Likewise. + (pp_cxx_right_paren): Likewise. + (pp_cxx_left_brace): Likewise. + (pp_cxx_right_brace): Likewise. + (pp_cxx_left_bracket): Likewise. + (pp_cxx_right_bracket): Likewise. + (pp_cxx_dot): Likewise. + (pp_cxx_identifier): Likewise. + (pp_cxx_tree_identifier): Likewise. + (pp_cxx_ampersand): New macro. + (pp_cxx_star): Likewise. + (pp_cxx_arrow): Likewise. + (pp_cxx_semicolon): Likewise. + (pp_cxx_complement): Likewise. + (pp_cxx_begin_template_argument_list): Declaree. + (pp_cxx_end_template_argument_list): Likewise. + (pp_cxx_colon_colon): likewise. + +2004-05-31 Eric Botcazou + + * parser.c (cp_parser_simple_type_specifier): Explicitly test + against NULL_TREE. + +2004-05-31 Kazu Hirata + + * call.c, class.c, cp-tree.def, decl2.c, name-lookup.c, pt.c, + typeck.c: Fix comment formatting. + +2004-05-30 Andrew Pinski + + * cp-lang.c (cp_expand_decl): Remove. + (LANG_HOOKS_EXPAND_DECL): Use c_expand_decl. + +2004-05-30 Andreas Jaeger + + * lang-specs.h: Add missing initializers for .ii. + +2004-05-28 Aldy Hernandez + + * decl.c (cp_make_fname_decl): Free return value from + fname_as_string. + +2004-05-28 Mark Mitchell + + PR c++/15083 + * decl2.c (delete_sanity): Set TREE_SIDE_EFFECTS on a DELETE_EXPR, + even in a templat.e + * init.c (build_new): Likewise. + + PR c++/15640 + * name-lookup.c (arg_assoc): Robustify. + + PR c++/15471 + * typeck.c (unary_complex_lvalue): Use context_for_name_lookup + when determining the scope to use for a pointer to member. + (lookup_anon_field): Give it external linkage. + * cp-tree.h (lookup_anon_field): Declare it. + * expr.c (cplus_expand_constant): Use it. + +2004-05-28 Mark Mitchell + + PR c++/14668 + * parser.c (cp_parser_simple_type_specifier): Call + maybe_note_name_used_in_class. + +2004-05-28 Tom Marshall + + PR c++/15214 + * class.c (finish_struct_1): Warn only if the dtor is non-private or + the class has friends. + +2004-05-27 Adam Nemet + + PR c++/12883 + * decl.c (complete_array_type): Set TYPE_NEEDS_CONSTRUCTING and + TYPE_HAS_NONTRIVIAL_DESTRUCTOR based on the underlying type. + +2004-05-24 Geoffrey Keating + + * method.c (implicitly_declare_fn): Don't call defer_fn; abort + if it might be needed. + * pt.c (mark_decl_instantiated): Only call defer_fn if + the function actually needs processing in finish_file. + * decl2.c (finish_file): Add check that elements in + deferred_fns_used are really needed there. Remove unnecessary + test of DECL_SAVED_TREE. + +2004-05-23 Paolo Bonzini + + * Make-lang.in: No need to specify $(LIBCPP). + +2004-05-23 Mark Mitchell + + PR c++/15044 + * parser.c (cp_parser_class_head): Robustify. + + PR c++/15317 + * parser.c (cp_parser_decl_specifier_seq): Correct error in + comment. + (cp_parser_constructor_declarator_p): Treat attributes + as decl-specifiers. + + PR c++/15329 + * typeck.c (build_unary_op): Do not attempt to resolve casts to + base classes in templates. + +2004-05-23 Mark Mitchell + + PR c++/15165 + * pt.c (instantiate_template): Robustify. + +2004-05-23 Mark Mitchell + + PR c++/15025 + * decl.c (xref_tag): Issue errors about redeclaring template + classes as non-template classes. + +2004-05-23 Mark Mitchell + + PR c++/14821 + * name-lookup.c (supplement_binding): Allow redefinitions of + namespace aliases. + + PR c++/14883 + * parser.c (cp_parser_template_argument): Robustify. + +2004-05-23 Gabriel Dos Reis + + * class.c (alter_access): Use %E format specifier to print an + identifier node. Avoid looking at the IDENTIFIER_POINTER. + (push_lang_context): Likewise. + * decl.c (lookup_label): Likewise. + (grokdeclarator): Likewise. + * parser.c (cp_parser_check_for_invalid_template_id): Likewise. + * pt.c (do_type_instantiation): Likewise. + * tree.c (handle_java_interface_attribute): Likewise. + (handle_com_interface_attribute): Likewise. + (handle_init_priority_attribute): Likewise. + +2004-05-22 Mark Mitchell + + PR c++/15285 + PR c++/15299 + * pt.c (build_non_dependent_expr): Expand the set of tree nodes + recognized as overloaded functions. + +2004-05-22 Mark Mitchell + + PR c++/15507 + * class.c (layout_nonempty_base_or_field): Do not try to avoid + layout conflicts for unions. + + PR c++/15542 + * typeck.c (build_x_unary_op): Instantiate template class + specializations before looking for "operator &". + + PR c++/15427 + * typeck.c (complete_type): Layout non-dependent array types, even + in templates. + + PR c++/15287 + * typeck.c (build_unary_op): Do not optimize "&x[y]" when in a + template. + +2004-05-22 Roger Sayle + + * name-lookup.c (check_for_out_of_scope_variable): Avoid ICE by + returning when TREE_TYPE is error_mark_node. + * typeck.c (require_complete_type): Return error_mark_node if + value's type is an error_mark_node. + +2004-05-20 Andrew Pinski + + * optimize.c (calls_setjmp_r): Remove. + (calls_setjmp_p): Remove. + * cp-tree.c (calls_setjmp_p): Remove. + * decl.c (finish_function): Do not call calls_setjmp_p. + +2004-05-18 Zack Weinberg + + * decl.c (cp_finish_decl): Use mark_decl_referenced. + * decl2.c (maybe_make_one_only): Likewise. + * method.c (use_thunk): Likewise. + +2004-05-18 Jason Merrill + + * class.c (build_base_path): Tidy a bit. + +2004-05-14 Geoffrey Keating + + * name-lookup.c (struct scope_binding): New. + (EMPTY_SCOPE_BINDING): New. + (lookup_using_namespace): Take a scope_binding instead of a + cxx_binding. + (qualified_lookup_using_namespace): Likewise. + (cxx_binding_clear): Delete. + (do_nonmember_using_decl): Use a scope_binding instead of a + cxx_binding. + (lookup_tag): Don't call select_decl. + (ambiguous_decl): Don't return anything (and change callers to match). + Take a scope_binding as the second parameter. + (lookup_namespace_name): Use a scope_binding instead of a + cxx_binding. + (unqualified_namespace_lookup): Likewise. + (lookup_qualified_name): Likewise. + (select_decl): Take a scope_binding instead of a cxx_binding. + Use macros rather than hand-coding tests for type-ness. + +2004-05-13 Diego Novillo + + * cp-gimplify.c: Rename from cp-simplify.c. + * Make-lang.in, optimize.c: Update. + +2004-05-13 Diego Novillo + + Merge from tree-ssa-20020619-branch. See + ChangeLog.tree-ssa for details. + + * Make-lang.in, call.c, class.c, cp-lang.c, cp-tree.def, + cp-tree.h, cvt.c, decl.c, decl2.c, error.c, except.c, + expr.c, init.c, name-lookup.h, optimize.c, parser.c, + pt.c, rtti.c, semantics.c, tree.c, typeck.c, typeck2.c: + Merged. + * cp-mudflap.c: New file. + * cp-simplify.c:: New file. + +2004-05-03 Giovanni Bajo + + PR c++/14389 + * decl2.c (check_classfn): For member templates, compare also the + template parameters to match the declaration. + * cp-tree.h: Adjust declaration of check_classfn. + * decl.c (start_decl, grokfndecl): Adjust callers of check_classfn. + * friend.c (do_friend): Likewise. + * pt.c (tsubst_friend_function): Likewise. + +2004-05-01 Zack Weinberg + + * decl.c (reshape_init): Do not apply TYPE_DOMAIN to a VECTOR_TYPE. + Instead, dig into the representation type to find the array bound. + +2004-04-30 Jason Merrill + + Refer to base members using COMPONENT_REFs where possible. + * class.c (build_simple_base_path): New fn. + (build_base_path): Use it for non-virtual base references. + (layout_class_type): Change base fields to their real type + after layout is done. + * cp-tree.h (IS_FAKE_BASE_TYPE): New macro. + * cp-lang.c (cxx_get_alias_set): Use it. + +2004-04-30 Kazu Hirata + + * class.c, cp-tree.h, decl.c, decl2.c, pt.c, rtti.c: Fix + comment typos. + +2004-04-23 Giovanni Bajo + + PR c++/15064 + * parser.c (cp_parser_postfix_expression): typeid operator cannot be + used in integral constant expressions. + +2004-04-22 Mark Mitchell + + * init.c (build_aggr_init): Fix accidental use of C99 construct in + previous change. + + * class.c (initialize_array): Don't set TREE_HAS_CONSTRUCTOR on + braced initializer. + * cp-tree.h (BRACE_ENCLOSED_INITIALIZER_P): New macro. + * decl.c (reshape_init): Use it. + * init.c (perform_member_init): Remove redundant condition. + (build_aggr_init): Adjust to handle brace-enclosed initializers + correctly. + (expand_default_init): Use BRACE_ENCLOSED_INITIALIZER_P. + + * parser.c (cp_parser_initializer_clause): Do not set + TREE_HAS_CONSTRUCTOR on the initializer. + * rtti.c (tinfo_base_init): Likewise. + (generic_initializer): Likewise. + (ptr_initializer): Likewise. + (ptm_initializer): Likewise. + (class_initializer): Likewise. + (get_pseudo_ti_init): Likewise. + * typeck2.c (digest_init): Use BRACE_ENCLOSED_INITIALIZER_P. + +2004-04-22 Alan Modra + + * name-lookup.c (anonymous_namespace_name): Make static. + +2004-04-19 Roger Sayle + + PR middle-end/14531 + * class.c (build_base_path): Call fold whilst building the NULL + pointer check expression trees. + +2004-04-15 Bryce McKinlay + + * init.c (build_new_1): Don't use type size argument for Java + _Jv_AllocObject call. + +2004-04-09 Danny Smith + + * method.c (make_alias_for_thunk): Remove preprocessor guard on + declaration and definition. + +2004-04-08 Danny Smith + + PR c++/14808 + * method.c (use_thunk): Test TARGET_USE_LOCAL_THUNK_ALIAS_P rather + than ASM_OUTPUT_DEF. + +2004-04-08 Jakub Jelinek + + * decl2.c (mark_used): Don't segfault if cfun != NULL but + current_function_decl == NULL. + +2004-04-05 Nathan Sidwell + + PR c++/3518 + * pt.c (check_cv_quals_for_unify): Ignore bogus CV quals at outer + level. + +2004-04-05 Richard Kenner + + * init.c (decl_constant_value): Don't look at DECL_INITIAL + of PARM_DECL. + * tree.c (bot_manip, build_min): Don't look at TREE_CONSTANT + or TREE_SIDE_EFFECTS of a type. + +2004-04-02 Nathan Sidwell + + PR c++/14007 + * pt.c (check_cv_quals_for_unify): Correct logic for disallowed + cv-qualifier unification. + * tree.c (cp_build_qualified_type_real): Renable DR295 logic. + +2004-04-02 Jan Hubicka + + * cp-lang. (LANG_HOOKS_UPDATE_DECL_AFTER_SAVING): Define. + * cp-tree.h (cp_update_decl_after_saving): Declare. + * tree.c (cp_update_decl_after_saving): Define. + +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-04-01 Richard Kenner + + * class.c (VTT_TOP_LEVEL_P): Use unsigned_flag directly. + +2004-03-31 Richard Kenner + + * call.c (joust): Use TYPE_UNSIGNED, not TREE_UNSIGNED. + * class.c (check_bitfield_decl): Likewise. + * cvt.c (type_promotes_to): Likewise. + * decl.c (finish_enum): Likewise. + * mangle.c (write_builtin_type): Likewise. + * semantics.c (finish_switch_cond, finish_unary_op_expr): Likewise. + * typeck.c (type_after_usual_arithmetic_conversions): Likewise. + (build_binary_op): Likewise. + +2004-03-31 Jan Hubicka + + * tree.h (optimize_function): Kill prototype. + * optimize.c (dump_function, optimize_function, dump_finction): Kill. + * semantics.c (expand_body): Kill. + +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-30 Zack Weinberg + + * name-lookup.c, parser.c: Use new shorter form of GTY markers. + +2004-03-29 Zack Weinberg + + * error.c (dump_function_name): If T's DECL_LANG_SPECIFIC + is null, just print the literal name and return. + +2004-03-25 Kazu Hirata + + * cxx-pretty-print.c: Fix comment typos. + +2004-03-24 Kazu Hirata + + * cxx-pretty-print.c, cxx-pretty-print.h, decl.h, friend.c: + Update copyright. + +2004-03-23 Ziemowit Laski + + * Make-lang.in (cp/mangle.o): Depend on $(TARGET_H). + * mangle.c (write_type): Add call to 'mangle_fundamental_type' + target hook. + +2004-03-23 Zack Weinberg + + PR 12267, 12391, 12560, 13129, 14114, 14133 + * cp-lang.c (c_reset_state): Delete. + (push_file_scope, pop_file_scope): New stubs. + * parser.c (c_parse_file): Call sorry() here if called more than once. + +2004-03-23 Richard Kenner + + * typeck.c (build_c_cast): Only look at TREE_CONSTANT_OVERFLOW + for INTEGER_CST. + +2004-03-22 Gabriel Dos Reis + + * cxx-pretty-print.c (pp_cxx_parameter_declaration_clause): Declare. + +2004-03-21 Gabriel Dos Reis + + * error.c (enum pad): Remove. + (dump_qualifiers): Likewise. + (dump_type): Replace dump_qualifiers with pp_cxx_cv_qualifier_seq. + (dump_aggr_type): Likewise. + (dump_type_suffix): Likewise. + (dump_simple_decl): Likewise. + (dump_function_decl): Likewise. + (cv_to_string): Likewise. + (dump_type_prefix): Likewise. Adjust return void. + * cxx-pretty-print.c (pp_cxx_cv_qualifier_seq): Move to + cxx_pretty_print.h. + (pp_cxx_template_keyword_if_needed): Document. + (pp_cxx_qualified_id): Document case FUNCTION_DECL. Tidy. + (pp_cxx_expression): Handle NON_DEPENDENT_EXPR and + MUST_NOT_THROW_EXPR. + +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 Richard Kenner + + * cxx-pretty-print.c (pp_cxx_unqualified_id): Use + TEMPLATE_TYPE_PARM_INDEX instead of TYPE_FIELDS. + * search.c (dfs_unuse_fields): Add two more TREE_CODES that mean + the field is named TEMPLATE_TYPE_PARM_INDEX. + +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. + +2004-03-18 Mark Mitchell + + * 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-18 Richard Kenner + + * cp-tree.def (TEMPLATE_TYPE_PARM, TYPEOF_TYPE): Update comments. + * cp-tree.h (NEW_EXPR_USE_GLOBAL, DELETE_EXPR_USE_GLOBAL): Add check. + (DELETE_EXPR_USE_VEC, COMPOUND_EXPR_OVERLOADED): Likewise. + (KOENIG_LOOKUP_P, PTRMEM_OK_P, TEMPLATE_TYPE_PARM_INDEX): Likewise. + (TYPENAME_TYPE_FULLNAME): Add check and use type.values. + (TYPEOF_TYPE_EXPR): New macro. + * class.c (finish_struct_bits): Use TYPE_VFIELD and TYPE_METHODS. + * error.c (dump_type): Use TYPEOF_TYPE_EXPR. + * pt.c (tsubst): Likewise. + * semantics.c (finish_typeof): Likewise. + * search.c (dfs_unuse_fields): Handle TYPENAME_TYPE, TYPEOF_TYPE, + and TEMPLATE_TYPE_PARM. + * typeck.c (comptypes): Use TYPE_ORIG_SIZE_TYPE, not TYPE_DOMAIN. + (build_array_ref): Use TYPE_DOMAIN, not TYPE_VALUES. + +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-15 Kazu Hirata + + * cp-lang.c, ptree.c: Update copyright. + +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-12 Matt Austern + + * decl2.c (maybe_make_one_only): Look at + TARGET_EXPLICIT_INSTANTIATION_ONE_ONLY when deciding whether + to make an explicit instantiation weak. + * method.c (use_thunk): Make sure we call comdat_linkage + when appropriate. + * pt.c (do_type_instantiation): On systems where weak symbols + don't go in a static archive's TOC, explicit instantiation of a + class must imply *explicit* instantiation of its memeber. + +2004-03-11 Kazu Hirata + + * call.c, cp-tree.h, pt.c: Fix comment typos. + +2004-03-10 Mark Mitchell + + PR c++/14510 + * decl.c (xref_tag): Disregard non-type declarations when + looking up a tagged type. + +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. + +2004-03-09 Mark Mitchell + + 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 Mark Mitchell + + * class.c (check_methods): Don't use IDENTIFIER_ERROR_LOCUS. + * cp-tree.h (DECL_INVALID_OVERRIDER_P): New macro. + (lang_identifier): Remove implicit_decl and error_locus. + (IDENTIFIER_IMPLICIT_DECL): Remove. + (SET_IDENTIFIER_IMPLICTI_DECL): Likewise. + (IDENTIFIER_ERROR_LOCUS): Likewise. + (SET_IDENTIFIER_ERROR_LOCUS): Likewise. + (TYPE_ASSEMBLER_NAME_STRING): Likewise. + (TYPE_ASSEMBLER_NAME_LENGTH): Likewise. + (implicitly_declare): Remove. + * decl.c (warn_extern_redeclared_static): Remove check of + IDENTIFIER_IMPLICIT_DECL. + (duplicate_decls): Don't check IDENTIFIER_ERROR_LOCUS. + (implicitly_declare): Remove. + (grok_ctor_properties): Don't set IDENTIFIER_ERROR_LOCUS. + (start_function): Don't check IDENTIFIER_IMPLICIT_DECL. + (start_method): Don't check IDENTIFIER_ERROR_LOCUS. + * lex.c (unqualified_name_lookup_error): Create a dummy VAR_DECL + in the innermost scope, rather than at namespace scope. + * name-lookup.c (push_local_binding): Give it external linkage. + (pushdecl): Remove dead code. + * name-lookup.h (push_local_binding): Declare it. + * ptree.c (cxx_print_identifier): Don't print + IDENTIFIER_IMPLICIT_DECL or IDENTIFIER_ERROR_LOCUS. + * search.c (check_final_overrider): Use DECL_INVALID_OVERRIDER_P, + not IDENTIFIER_ERROR_LOCUS. + * typeck.c (build_function_call): Remove dead code. + +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-05 Jason Merrill + + * tree.c (list_hash_pieces): s/TYPE_HASH/TREE_HASH/. + +2004-03-04 Geoffrey Keating + + * decl.c (grokfndecl): Update old incorrect comment. + (grokvardecl): Diagnose C++ variables of type with no linkage. + +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. + +2004-03-01 Gabriel Dos Reis + + PR c++/14369 + * error.c (dump_expr): Handle THROW_EXPR. + +2004-03-01 Mark Mitchell + + 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. + +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 Jeff Law + + * init.c (build_vec_delete_1): Convert 2nd argument to NE_EXPR to + the proper type. + +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-29 Mark Mitchell + + PR c++/14267 + * typeck.c (build_modify_expr): Remove more of the cast-as-lvalue + extension. + + 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-29 Kazu Hirata + + * call.c: Fix a comment typo. + +2004-02-27 Ziemowit Laski + + * tree.c (pod_type_p): Treat VECTOR_TYPEs as PODs. + +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++/14284 + * pt.c (dependent_type_p_r): A template template parameter is a + dependent type. + +2004-02-26 Giovanni Bajo + + PR c++/14246 + * mangle.c (write_template_arg_literal): Don't rely on identity for + boolean constants. + +2004-02-24 Jason Merrill + + * tree.c (build_exception_variant): Use check_qualified_type. + +2004-02-23 Zack Weinberg + Kazu Hirata + + * decl.c (cxx_init_decl_processing): Don't check + flag_writable_strings. + +2004-02-23 Andrew Pinski + + PR c++/14156 + * typeck.c (maybe_warn_about_returning_address_of_location): + Change check for VAR_DECL to use DECL_P instead. + +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-23 Giovanni Bajo + + PR c++/14143 + * name-lookup.c (arg_assoc_class): Don't look into template + arguments if it is not a primary template. + +2004-02-20 John David Anglin + + PR c++/12007 + * method.c (use_thunk): Always clone function argument tree. + +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++/13927 + * decl.c (duplicate_decls): Return error_mark_node for invalid + redeclarations. + * name-lookup.c (push_namespace): Ignore the return value from + pushdecl. + * pt.c (push_template_decl_real): Robustify. + + 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-18 Kazu Hirata + + * cp-tree.def, cvt.c: Update copyright. + +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 Giovanni Bajo + + PR c++/13927 + * error.c (dump_decl) : Dump as simple declarations. + +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. + + 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-12 Mark Mitchell + + * call.c (conversion_kind): New type. + (conversion_rank): Likewise. + (conversion): Likewise. + (CONVERSION_RANK): New macro. + (conversion_obstack): New variable. + (obstack_initialized): Likewise. + (z_candidate): Change type of convs and second_conv. + (candidate_warning): New type. + (IDENTITY_RANK): Remove. + (EXACT_RANK): Likewise. + (PROMO_RANK): Likewise. + (STD_RANK): Likewise. + (PBOOL_RANK): Likewise. + (USER_RANK): Likewise. + (ELLIPSIS_RANK): Likewise. + (BAD_RANK): Likewise. + (ICS_RANK): Likewise. + (ICS_STD_RANK): Likewise. + (ICS_USER_FLAG): Likewise. + (ICS_ELLIPSIS_FLAG): Likewise. + (ICS_THIS_FLAG): Likewise. + (ICS_BAD_FLAG): Likewise. + (NEED_TEMPORARY_P): Likewise. + (CHECK_COPY_CONSTRUCTOR_P): Likewise. + (USER_CONV_CAND): Likewise. + (USER_CONV_FN): Likewise. + (conversion_obstack_alloc): New function. + (alloc_conversion): Likewise. + (validate_conversion_obstack): Likewise. + (alloc_conversions): Likewise. + (build_conv): Adjust to deal with new conversion data structures. + (build_identity_conv): New function. + (build_ambiguous_conv): Likewise. + (standard_conversion): Adjust to deal with new conversion data + structures. + (convert_class_to_reference): Likewise. + (direct_reference_binding): Likewise. + (reference_binding): Likewise. + (implicit_conversion): Likewise. + (add_candidate): Likewise. + (add_function_candidate): Likewise. + (add_conv_candidate): Likewise. + (build_builtin_candidate): Likewise. + (print_z_candidate): Likewise. + (merge_conversion_sequences): Likewise. + (build_user_type_conversion_1): Likewise. + (build_user_type_conversion): Likewise. + (build_new_function_call): Likewise. + (build_object_call): Likewise. + (conditional_conversion): Likewise. + (build_conditional_expr): Likewise. + (build_new_op): Likewise. + (build_op_delete_call): Likewise. + (convert_like_real): Likewise. + (build_over_call): Likewise. + (build_new_method_call): Likewise. + (is_subseq): Likewise. + (maybe_handle_implicit_object): Likewise. + (maybe_handle_ref_bind): Likewise. + (compare_ics): Likewise. + (source_type): Likewise. + (add_warning): Likewise. + (joust): Likewise. + (can_convert_arg): Likewise. + (can_convert_arg_bad): Likewise. + (perform_implicit_conversion): Likewise. + (perform_direct_initialization_if_possible): Likewise. + (initialize_reference): Likewise. + * cp-lang.c (cp_tree_size): Do not handle WRAPPER. + * cp-tree.def (WRAPPER): Likewise. + (IDENTITY_CONV): Remove. + (LVALUE_CONV): Likewise. + (QUAL_CONV): Likewise. + (STD_CONV): Likewise. + (PTR_CONV): Likewise. + (PMEM_CONV): Likewise. + (BASE_CONV): Likewise. + (REF_BIND): Likewise. + (USER_CONV): Likewise. + (AMBIG_CONV): Likewise. + (RVALUE_CONV): Likewise. + * cp-tree.h (tree_wrapper): Remove. + (WRAPPER_ZC): Remove. + (lang_tree_node): Remove wrapper. + (LOOKUP_SPECULATIVELY): Remove. + (build_op_delete_call): Adjust prototype. + (validate_conversion_obstack): Declare. + (build_zc_wrapper): Remove. + * cvt.c (convert_to_reference): Remove dead code. + (ocp_convert): Likewise. + * decl.c (redeclaration_error_message): Correct handling of + templates. + (finish_destructor_body): Do not use LOOKUP_SPECULATIVELY. + (cp_tree_node_structure): Remove WRAPPER case. + * decl2.c (finish_file): Call validate_conversion_obstack. + * init.c (build_new_1): Remove use of LOOKUP_SPECULATIVELY. + (build_op_delete_call): Likewise. + (build_x_delete): Likewise. + (build_delete): Adjust call to build_op_delete_call. + * 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. + * tree.c (build_zc_wrapper): Remove. + +2004-02-12 Zack Weinberg + + * cp-lang.c: Don't define LANG_HOOKS_BUILTIN_TYPE_DECLS. + * cp-tree.h: Don't declare cxx_builtin_type_decls. + * decl.c (builtin_type_decls, cxx_builtin_type_decls): Delete. + (record_builtin_type): Call debug_hooks->type_decl on the TYPE_DECL. + +2004-02-10 Mark Mitchell + + * typeck.c (lookup_destructor): Fix typo in error message. + +2004-02-09 Kazu Hirata + + * call.c, parser.c, tree.c: Fix comment typos. + +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: Update copyright. + +2004-02-06 Giovanni Bajo + + PR c++/14033 + * decl.c (require_complete_types_for_parms): Do not insert + error_mark_node in the parameter list. + +2004-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 Kazu Hirata + + * call.c (type_passed_as): Replace PROMOTE_PROTOTYPES with + targetm.calls.promote_prototypes. + +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 Jan Hubicka + + * tree.c (cp_cannot_inline_tree_fn): Allow inlining of comdat + functions. + +2004-02-05 Giovanni Bajo + + PR c++/14008 + * parser.c (cp_parser_diagnose_invalid_typename): Removed parsing + code, only emits the diagnostic now. Added lookup of the identifier + and support for qualified ids. + (cp_parser_parse_and_diagnose_invalid_type_name): New function. + Parse an (invalid) type name as id-expression within a declarator. + (cp_parser_simple_declaration): Use it. + (cp_parser_member_declaration): Likewise. + (cp_parser_make_typename_type): New function. Handle errors through + cp_parser_diagnose_invalid_typename. + (cp_parser_elaborated_type_specifier): Use it. + +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 Kazu Hirata + + * error.c, search.c: Update copyright. + +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. + +2004-02-04 Mark Mitchell + + 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. + +2004-02-04 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 Giovanni Bajo + + PR c++/13997 + * pt.c (more_specialized_class): Increase processing_template_decl + while partial ordering. + +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. + +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. + + PR c++/14002 + * semantics.c (finish_id_expression): Do not return an + IDENTIFIER_NODE when lookup finds a PARM_DECL. + +2004-02-03 Mark Mitchell + + 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 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-01 Giovanni Bajo + + PR c++/13957 + * pt.c (tsubst_qualified_id): Improved error message when a type + is expected but not found. + +2004-01-31 Kazu Hirata + + * class.c: Fix comment typos. + * decl.c: Likewise. + * error.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * search.c: Likewise. + * typeck.c: Likewise. + +2004-01-30 Richard Henderson + + PR c++/13693 + * method.c (use_thunk): Don't force_target_expr for void thunks. + * tree.c (build_target_expr_with_type): Assert non-void type. + (force_target_expr): Likewise. + +2004-01-30 Michael Matz + + * parser.c (cp_parser_labeled_statement): Accept case ranges. + +2004-01-30 Giovanni Bajo + + DR206 + PR c++/13813 + * decl.c (grokdeclarator): Check immediatly type completeness for + non-dependent types. + +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 Mark Mitchell + + PR c++/13883 + * mangle.c (write_encoding): Correct encoding of member template + constructors. + +2004-01-28 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-28 Mark Mitchell + + PR c++/13791 + * typeck.c (merge_types): Do not merge attributes into + TYPENAME_TYPEs. + + 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-28 Jan Hubicka + + * semantics.c (expand_body) Do emit_associated_thunks before + expansion. + +2004-01-27 Devang Patel + + * name-lookup.c: Include "debug.h" + (do_namespace_alias): Invoke debug_hooks to emit debug info + for namespace alias. + (do_local_using_decl): Invoke debug_hooks to emit debug info + for using decl. + (do_class_using_decl): Same. + (do_toplevel_using_decl): Same. + (do_using_directive): Same. + (cp_emit_debug_info_for_using): New function. + * Make-lang.in (cp/parser.o): Depend on debug.h + (cp/name-lookup.o): Same. + +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. + + * 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-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 Kazu Hirata + + * optimize.c, typeck2.c: Update copyright. + +2004-01-21 Kazu Hirata + + * Make-lang.in, call.c, class.c, decl2.c, except.c, expr.c, + init.c, mangle.c, typeck.c: Update copyright. + +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-20 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. + + 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. + +2004-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. + + +Copyright (C) 2004 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2005 b/gcc/cp/ChangeLog-2005 new file mode 100644 index 000000000..3269fa7f4 --- /dev/null +++ b/gcc/cp/ChangeLog-2005 @@ -0,0 +1,3528 @@ +2005-12-30 Gabriel Dos Reis + + * cxx-pretty-print.c (pp_cxx_constant): New. Print + string-literal in parens if input program says so. + (pp_cxx_primary_expression): Hand off constant printing to + pp_cxx_constant. + (pp_cxx_pretty_printer_init): Set pp->c_base.constant. + (pp_cxx_expression): Use pp_cxx_constant for literals. + * error.c (dump_expr): Use pp_constant for literals. + +2005-12-29 Nathan Sidwell + + * method.c (make_thunk): Don't set comdat_linkage here. + (use_thunk): Make thunk one only here, if thunk target is + DECL_ONE_ONLY. + +2005-12-26 Mark Mitchell + + PR c++/25439 + * decl.c (grokdeclarator): Remove dead code. + * ptree.c (cxx_print_xnode): Handle BASELINK. + * parser.c (make_id_declarator): Add sfk parameter. + (cp_parser_direct_declarator): Do not pass TYPE_DECLs to + make_id_declarator. + (cp_parser_declarator_id): Simplify BASELINKs here. + (cp_parser_member_declaration): Adjust calls to + make_id_declarator. + +2005-12-26 Mark Mitchell + + PR c++/23171, c++/23172, c++/25417. + * typeck.c (build_unary_op): Create temporary variables for + compound literals whose addresses are taken. + * init.c (expand_aggr_init_1): Use COMPOUND_LITERAL_P. + * decl.c (reshape_init_vector): Likewise. + (reshape_init): Give it external linkage. + (check_initializer): Use COMPOUND_LITERAL_P. + (initialize_artificial_var): Allow the initializer to be a + CONSTRUCTOR. + * call.c (make_temporary_var_for_ref_to_temp): Use + create_temporary_var. + * cp-tree.h (COMPOUND_LITERAL_P): New macro. + (rehape_init): Declare. + * typeck2.c (digest_init): Use COMPOUND_LITERAL_P. + * semantics.c (finish_compound_literal): Use reshape_init. + +2005-12-23 Mark Mitchell + + PR c++/24671 + * pt.c (instantiate_template): Handle SFINAE. + +2005-12-23 Volker Reichelt + + * decl.c (grokdeclarator): Improve diagnostic for friend + declarations of class members. + +2005-12-22 Mark Mitchell + + PR c++/25369 + * tree.c (really_overloaded_fn): Tweak comment. + * pt.c (tsubst_call_declarator_parms): Remove. + (tsubst_copy): Call mark_used on the member referenced by an + OFFSET_REF. + * semantics.c (finish_qualified_id_expr): Simplify. + * decl2.c (mark_used): Accept BASELINKs. + + PR c++/25364 + * typeck.c (build_unary_op): Pass DECLs not names to + build_offset_refs. + * init.c (build_offset_ref): Do not do name lookup. Do not call + mark_used. + * call.c (build_call): Simplify and tidy. + * semantics.c (finish_qualified_id_expr): Call mark_used. + +2005-12-22 Volker Reichelt + + PR c++/23333 + * parser.c (cp_parser_pure_specifier): Check for PURE_ZERO to + identify a single '0'. + +2005-12-20 Mark Mitchell + + PR c++/21228 + * decl.c (use_eh_spec_block): New function. + (store_parm_decls): Use it. + (finish_function): Likewise. + +2005-12-19 Mark Mitchell + + PR c++/24278 + * init.c (expand_member_init): Print messages about baseclasses + using %T rather than %D. + + PR c++/24915 + * class.c (add_method): Do not treat templates as identical unless + their return types are the same. + +2005-12-12 Mark Mitchell + + PR c++/25300 + * tree.c (build_qualified_name): Return error_mark_node for + erroneous input. + +2005-12-10 Mark Mitchell + + PR c++/25337 + * pt.c (tsubst_copy_and_build): Permit dependent types for the + object in a class member access expression. + +2005-12-10 Terry Laurenzo + + PR java/9861 + * mangle.c (write_bare_function_type): Mangle return type for + methods of Java classes + +2005-12-08 ThĂ©odore Papadopoulo + + * call.c (build_conditional_expr): Print types in error messages. + +2005-12-07 Volker Reichelt + + * expr.c (cxx_expand_expr): Call gcc_unreachable instead of abort. + +2005-12-07 Volker Reichelt + + * cp-gimplify.c (gimplify_cp_loop): Use fold_build3. + +2005-12-07 Rafael Ávila de EspĂ­ndola + + * Make-lang.in (c++.all.build, c++.install-normal): Remove. + +2005-12-07 Rafael Ávila de EspĂ­ndola + + * Make-lang.in: Remove all dependencies on s-gtype. + +2005-12-06 Aldy Hernandez + + PR C++/24138 + * decl.c (reshape_init_array_1): Handle max_index of -1. + +2005-12-06 Roger Sayle + + * typeck.c (build_binary_op): Issue warning if either operand of a + comparison operator is a string literal, except for testing equality + or inequality against NULL. + +2005-12-06 Roger Sayle + + PR c++/25263 + * decl.c (compute_array_index_type): Check that itype is an + INTEGER_CST node before testing/clearing TREE_OVERFLOW. + +2005-12-05 Daniel Berlin + + * ptree.c (cxx_print_decl): Update to check for decl_common + structure. + +2005-12-02 Mark Mitchell + + PR c++/24173 + * decl.c (duplicate_decls): Don't rely on DECL_TEMPLATE_INFO after + clobbering newdecl. + +2005-12-02 Richard Guenther + + * semantics.c (simplify_aggr_init_expr): Use buildN instead + of build. + +2005-12-02 Gabriel Dos Reis + + * parser.c (cp_lexer_new_main): Usr GGC_RESIZEVEC instead of + ggc_realloc. + (cp_parser_template_argument_list): Use XRESIZEVEC instead of + xrealloc. + * class.c (pushclass): Likewise. + +2005-12-02 Gabriel Dos Reis + + * decl2.c (get_priority_info): Use XNEW, not xmalloc. + * decl.c (push_switch): Likewise. + * lex.c (handle_pragma_implementation): Likewise. + * cp-objcp-common.c (decl_shadowed_for_var_insert): Use GGC_NEW, + not ggc_alloc. + (cxx_initialize_diagnostics): Use XNEW, not xmalloc. + * class.c (init_class_processing): Use XNEWVEC, not xmalloc. + * g++spec.c (lang_specific_driver): Likewise. + * mangle.c (save_partially_mangled_name): Likewise. + * parser.c (cp_lexer_new_main): Use GGC_NEWVEC, not ggc_alloc. + (cp_parser_template_argument_list): Use XNEWVEC, nto xmalloc. + (cp_parser_sizeof_operand): Likewise. + * repo.c (open_repo_file, open_repo_file): Likewise. + +2005-12-01 Gabriel Dos Reis + + * parser.c (cp_parser_make_typename_type): Call make_typename_type + with tf_none instead of magic value 0. + (cp_parser_explicit_instantiation): Call do_type_instantiation + with tf_error instead of magic value 1. + (cp_parser_elaborated_type_specifier): Call make_typename_type + with tf_error instead of magic value 1. + (cp_parser_class_name): Likewise. + (cp_parser_lookup_name): Likewise. + +2005-12-01 Gabriel Dos Reis + + * parser.c (cp_parser_declaration): Set token2.type to CPP_EOF, + not RID_MAX. + +2005-11-30 Jason Merrill + + PR c++/21123 + * cp-gimplify.c (cp_genericize_r): Don't dereference invisible reference + parms in a thunk. + +2005-11-30 Ben Elliston + + * typeck.c (build_x_unary_op): Correct spelling in error message. + +2005-11-28 Nathan Sidwell + + PR c++/21166 + * class.c (check_field_decls): Only set DECL_PACKED on a field + when its natural alignment is > BITS_PER_UNIT. + +2005-11-27 Volker Reichelt + + PR c++/24979 + * cp-tree.h (DECL_MAIN_P): Remove duplicate definition. + +2005-11-26 Richard Henderson + + * lex.c: Update for pragma_lex rename. + * parser.c: Likewise. + +2005-11-25 Volker Reichelt + + PR c++/9278 + * decl.c (grokparms): Do not allow typedef-names in a '(void)' + parmlist. + +2005-11-25 Volker Reichelt + + * typeck2.c (process_init_constructor_union): Remove check for + unnamed union members. + +2005-11-25 Volker Reichelt + + * name-lookup.c (lookup_name_real): Merge two if's. + +2005-11-25 Volker Reichelt + + * pt.c (instantiate_class_template): Clean-up. + +2005-11-25 Volker Reichelt + + * pt.c (template_class_depth_real): Remove. Move functionality to ... + (template_class_depth): ... here, replacing count_specializations + with 0. Adjust comment. + +2005-11-24 Richard Guenther + Dirk Mueller + + PR c++/14024 + * typeck.c (build_reinterpret_cast_1): Use + strict_aliasing_warning. + +2005-11-23 Gabriel Dos Reis + + PR c++/24235 + * pt.c (check_instantiated_args): Reword diagnostic message about + template argument involving local types. + +2005-11-23 Gabriel Dos Reis + + PR c++/21667 + * typeck.c (build_array_ref): Avoid code duplicate. Use common + C/C++ diagnostic function warn_array_subscript_with_type_char. + +2005-11-21 Gabriel Dos Reis + + PR c++/22238 + * error.c (resolve_virtual_fun_from_obj_type_ref): New. + (dump_expr): Use it in . + +2005-11-21 Richard Henderson + + * cp-objcp-common.h, name-lookup.c, name-lookup.h: Revert 11-18 patch. + + * name-lookup.c (lookup_name): Remove prefer_type argument. + (lookup_name_prefer_type): New. + * decl.c (lookup_and_check_tag): Use them. + * pt.c (tsubst_friend_class): Likewise. + (lookup_template_class): Likewise. + (tsubst_copy_and_build): Likewise. + * name-lookup.h (lookup_name_prefer_type): New. + (lookup_name): Remove declaration. + +2005-11-18 Mark Mitchell + + PR c++/8355 + * decl.c (grokfndecl): Set up DECL_TEMPLATE_INFO before calling + set_decl_namespace. + * name-lookup.c (set_decl_namespace): + +2005-11-18 Mike Stump + + * cp-objcp-common.h (LANG_HOOKS_LOOKUP_NAME): Add. + * name-lookup.c (lookup_name_two): Remove. + (lookup_name_one): Add. + * name-lookup.h (lookup_name_two): Remove. + (lookup_name_one): Add. + +2005-11-15 Jason Merrill + + PR c++/24580 + * method.c (locate_copy): Also use skip_artificial_parms here. + (synthesize_exception_spec): Use CLASS_TYPE_P rather than checking + for RECORD_TYPE. + (locate_ctor): Abort if we fail to find a default constructor. + +2005-11-15 Mike Stump + + * name-lookup.c (lookup_name_two): Add. + * name-lookup.h: Likewise. + +2005-11-15 Mark Mitchell + + PR c++/24667 + * typeck.c (check_for_casting_away_constness): Use the diag_fn. + (build_const_cast_1): Call it, for C-style casts. + +2005-11-14 Mark Mitchell + + PR c++/24687 + * pt.c (check_explicit_specialization): Don't check for C linkage. + (push_template_decl_real): Likewise. + * parser.c (cp_parser_explicit_specialization): Check here. + (cp_parser_template_declaration_after_export): And here. + + * parser.c (cp_lexer_get_preprocessor_token): Initialize keyword + field. + +2005-11-14 Jason Merrill + + PR c++/24580 + * method.c (locate_ctor): Skip all artificial parms, not just + 'this'. + +2005-11-14 Mark Mitchell + + * parser.c (eof_token): Add initializer for ambiguous_p. + +2005-11-13 Mark Mitchell + + PR c++/24817 + * decl.c (check_redeclaration_exception_specification): New + function. + (duplicate_decls): Use it. + * error.c (fndecl_to_string): Print the template parameter list. + + PR c++/20293 + * cxx-pretty-print.c (pp_cxx_statement): Print qualifying scopes + for namespaces. + (pp_cxx_original_namespace_definition): Likewise. + * name-lookup.c (ambiguous_decl): Don't issue error messages; + instead return lists of ambiguous candidates. + (select_decl): Handle ambiguous namespace lookups. + * parser.c (cp_token): Add ambiguous_p. + (cp_lexer_get_preprocessor_token): Set it. + (cp_parser_diagnose_invalid_type_name): Avoid duplicate messages + when a qualified name uses an invalid scope. + (cp_parser_primary_expression): Print ambiguous candidates. + (cp_parser_type_parameter): Adjust comment to reflect new + parameter name for cp_parser_lookup_name. + (cp_parser_template_argument): Likewise. + (cp_parser_elaborated_type_specifier): Likewise. + (cp_parser_namespace_name): Likewise. + (cp_parser_class_name): Print ambiguous candidates. + (cp_parser_lookup_name): Rename ambiguous_p parameter to + ambiguous_decls. Use it to return a list of ambiguous candiates + when a lookup is ambiguous. + (cp_parser_lookup_name_simple): Adjust comment to reflect new + parameter name for cp_parser_lookup_name. + +2005-11-12 Jakub Jelinek + + PR c++/24780 + * typeck.c (complete_type): Set TYPE_NEEDS_CONSTRUCTING + and TYPE_HAS_NONTRIVIAL_DESTRUCTOR flags for all variants + of array type. + + PR c++/24761 + * pt.c (tsubst_copy_asm_operands): New function. + (tsubst_expr) : Use it. + +2005-11-08 Jakub Jelinek + + PR c++/19450 + * decl.c (redeclaration_error_message): Issue diagnostics about + olddecl and newdecl disagreement on __thread property. + (grokdeclarator): Set DECL_TLS_MODEL on class static variables. + +2005-11-08 Jason Merrill + + PR c++/21123 + * method.c (use_thunk): Use build_cplus_new instead of + force_target_expr. + +2005-11-06 Jason Merrill + James A. Morrison + + PR c++/17256 + * decl2.c (cp_finish_file): Fix conditions for undefined warning. + Set TREE_NO_WARNING instead of TREE_PUBLIC. + * pt.c (instantiate_pending_templates): Set DECL_INITIAL to avoid + a warning on a function we didn't instantiate because of excessive + recursion. + +2005-11-06 Mark Mitchell + + * class.c (record_subobject_offsets): Don't record offsets past + biggest empty class for non-empty base classes. + (layout_class_type): Use TYPE_SIZE_UNIT, not TYPE_SIZE, when + keeping track of the size of emptyclasses. + + PR c++/21308 + * class.c (sizeof_biggest_empty_class): New variable. + (record_subobject_offsets): Don't record offsets past biggest + empty class for data members. Replace vbases_p parameter with + is_data_member parameter. + (build_base_field): Adjust call. + (layout_class_type): Likewise. Maintain + sizeof_biggest_empty_class. + +2005-11-05 Kazu Hirata + + * decl2.c, init.c, typeck.c: Fix comment typos. + +2005-11-04 Richard Guenther + + PR c++/22487 + * init.c (build_vec_init): Build comparison of matching + types. + +2005-11-03 Josh Conner + + PR c++/19989 + pt.c (tsubst): Accept zero-length array if tf_error is set + in complain flags. Change error message for negative- + length array. + +2005-11-04 Joseph S. Myers + + * cp-tree.h (cp_cpp_error), error.c (cp_cpp_error): Take va_list* + parameter. + +2005-11-03 Joseph S. Myers + + PR c++/17964 + * error.c (cp_cpp_error): New function. + * cp-tree.h (cp_cpp_error): Declare. + * parser.c (cp_lexer_new_main): Set CPP option client_diagnostic + and error callback after lexing. + +2005-11-03 Mark Mitchell + + PR c++/21627 + * pt.c (register_specialization): Update inline flags on clones.y + +2005-11-03 Andrew Pinski + + PR c++/24582 + * decl.c (declare_local_label): Return 0 for variables + with error_mark_node as their types. + +2005-11-02 Mark Mitchell + + PR c++/22434 + * call.c (build_conditional_expr): Do bad conversions, if there's + no other choice. + + PR c++/24560 + * parser.c (cp_parser_postfix_dot_deref_expression): Improve error + message for use of overloaded functions on LHS of "." operator. + + PR c++/19253 + * parser.c (cp_parser_postfix_expression): Use + cp_parser_elaborated_type_specifier to handle typename-types in + functional casts. + (cp_parser_enclosed_argument_list): Skip ahead to the end of the + template argument list if the closing ">" is not found. + + PR c++/24569 + * pt.c (instantiate_decl): Use cp_finish_decl, not + finish_static_data_member_decl. + +2005-10-28 Andrew Pinski + + * decl.c (grokfndecl): Remove the setting + of the return type of the function type + of main after erroring about must returning + int. + +2005-10-28 Andrew Pinski + + PR C++/23229 + * decl.c (grokfndecl): Create a new function type + after erroring out about main not returning int. + +2005-10-28 Josh Conner + + PR c++/22153 + * parser.c (cp_parser_member_declaration): Detect and handle + a template specialization. + +2005-10-28 Andrew Pinski + + PR C++/23426 + * decl.c (start_decl): Check that the decl is an + error_mark_node before getting the type. + Remove the check for the decl's type being an + error_mark_node. + +2005-10-21 Mark Mitchell + + PR c++/24260 + * parser.c (cp_parser_init_declarator): Pass attributes to + grokfield. + +2005-10-20 Mark Mitchell + + PR c++/22618 + * search.c (accessible_p): Check access in the outermost set of + template parameters. + +2005-10-20 Richard Guenther + + * decl.c (grokdeclarator): Fix ambiguous pedwarn message. + +2005-10-18 Volker Reichelt + + PR c++/22293 + * decl.c (grokdeclarator): Reject unqualified destructors in + friend declarations. + +2005-10-18 Mark Mitchell + + PR c++/23293 + * pt.c (convert_template_argument): Use canonical type variants in + template specializations. + +2005-10-18 Nathan Sidwell + + PR c++/21383 + * name-lookup.c (arg_assoc): Template args can be null in a + template-id-expr. + + PR c++/22604 + * class.c (update_vtable_entry_for_fn): Don't process invalid + covariant overriders. + + PR c++/23118 + * cp-tree.h (add_method): Add return value. + * class.c (add_method): Return success indicator. + * semantics.c (finish_member_declaration): Don't add an invalid + method to the method list. + +2005-10-17 Mark Mitchell + + PR c++/21908 + * call.c (build_new_method_call): Do not show VTT parameters to + the user. + +2005-10-17 Volker Reichelt + + PR c++/23440 + * parser.c (cp_parser_statement): If the parser reached CPP_EOF, + only complain about missing statement. + +2005-10-17 Nathan Sidwell + + PR c++/24386 + * cp-tree.h (BASELINK_QUALIFIED_P): New. + * pt.c (tsubst_copy_and_build): : Use it. + * typeck.c (finish_class_member_access_expr): Set it. + + PR c++/21353 + * decl.c (check_default_argument): Don't check + processing_template_decl or uses_template_parms here. + (grokparms): Only call check_default_argument when not processing + a template decl. + * parser.c (cp_parser_late_parsing_default_arg): Call + check_default_argument when not processing a template decl. + +2005-10-16 Mark Mitchell + + PR c++/24389 + * decl2.c (mark_used): Use uses_template_parms instead of + dependent_type_p. + * init.c (constant_value_1): Handle uninstantiated templates + specially. + * pt.c (instantiate_decl): Add sanity check. + +2005-10-16 Mark Mitchell + + PR c++/22173 + * typeck.c (check_template_keyword): Fix thinko. + +2005-10-16 Andrew Pinski + + PR c++/23959 + * decl.c (pop_switch): Only call c_do_switch_warnings + when not processing templates. + +2005-10-16 Mark Mitchell + + PR c++/22173 + * cp-tree.h (QUALIFIED_NAME_IS_TEMPLATE): New macro. + (check_template_keyword): New function. + (finish_id_expression): Change prototoype. + (finish_qualified_id_expr): Change prototype. + (build_qualified_name): New function. + (finish_class_member_access_expr): Change prototype. + * init.c (build_offset_ref): Use build_qualified_name. + * mangle.c (write_expression): Likewise. + * parser.c (cp_parser_primary_expression): Remove qualifying_class + parameter. Add address_p and template_arg_p. Use + build_qualified_name. + (cp_parser_id_expression): Default *template_p to + template_keyword_p. Check for invalid uses of the template + keyword. + (cp_parser_postfix_expression): Eliminate special handling for + qualified names. Adjust call to cp_parser_primary_expression. + (cp_parser_postfix_dot_deref_expression): Adjust call to + cp_parser_id_expression and finish_class_member_access_expr. + (cp_parser_template_argument_list): Add comment. + (cp_parser_template_argument): Adjust use of + cp_parser_primary_expression. Remove call to + finish_qualified_id_expr. + (cp_parser_lookup_name): Use build_qualified_name. + * pt.c (tsubst): Use build_qualified_name. + (tsubst_qualified_id): Likewise. Adjust call to + finish_qualified_id_expr. + (tsubst_copy): Use build_qualified_name. + (tsubst_copy_and_build): Adjusts call to finish_id_expression and + finish_class_member_access_expr. + * semantics.c (finish_non_static_data_member): Use + build_qualified_name. + (finish_qualified_id_expr): Add template_p and template_arg_p + parameters. + (finish_id_expression): Remove qualifiying_class parameter. Add + template_p, done, address_p, and template_arg_p. Use + build_qualified_name. Adjust calls to + finish_class_member_acess_expr. + * tree.c (build_qualified_name): New function. + * typeck.c (check_template_keyword): New function. + (finish_class_member_access_expr): Add template_p argument. Check + for invalid uses of the template keyword. + +2005-10-15 Mark Mitchell + + PR c++/21347 + * class.c (maybe_warn_about_overly_private_class): Lazy + constructors are public. + +2005-10-14 Mark Mitchell + + PR c++/19565 + * call.c (convert_like_real): Rely on convert_and_check to issue + warnings about overflow and conversion to unsigned. + * decl.c (finish_enum): Use the location of the enumerators, not + the closing brace of the enumeration, when reporting warnings + about conversions. + (build_enumerator): Use error_mark_node for erroneous values. + * typeck2.c (digest_init): Remove reference to "signature pointer" + from comment. + +2005-10-14 Nathan Sidwell + + PR c++/17796 + * optimize.c (update_cloned_parm): Add FIRST parameter. Use it. + (maybe_clone_body): Track the first clone. + +2005-10-13 Nathan Sidwell + + PR c++/23984 + * class.c (build_base_path): The vtable is always the first thing + in the vtt. + +2005-10-13 Mark Mitchell + + PR c++/20721 + * cp-tree.h (DECL_NONTRIVIALLY_INITIALIZED_P): New macro. + * decl.c (duplicate_decls): Merge it into new declarations. + (decl_jump_unsafe): Use it, rather than DECL_INITIAL. + (cp_finish_decl): Set it, when appropriate. + + PR c++/22180 + * call.c (build_new_method_call): Correct pretty-printing of + destructor names. + * pt.c (tsubst_qualified_id): Recognize invalid uses of "~T" as an + identifier. + + PR c++/23694 + * decl.c (start_method): Return error_mark_node for errors. + + PR c++/23307 + * pt.c (push_template_decl_real): Complain about attempts to + declare template variables. + + PR c++/22352 + * pt.c (tsubst_template_parms): Set processing_template_decl while + processing the parameters. + (tsubst_decl): Set processing_template_decl when substituting into + a TEMPLATE_DECL. + + PR c++/22405 + * pt.c (most_specialized_instantiation): Robustify. + + PR c++/22464 + * semantics.c (finish_id_expression): Issue errors about uses of + local variables in containing functions even in templates. + +2005-10-12 Danny Smith + + PR target/21801 + PR target/23589 + * class.c (finish_struct_1): Call + targetm.cxx.adjust_class_at_definition. + + +2005-10-12 Nathan Sidwell + + PR c++/21592 + * pt.c (build_non_dependent_expr): Don't wrap a COMPONENT_REF + with already looked up member functions. Assert we're not + returning a NON_DEPENDENT_EXPR with unknown type. + * typeck.c (finish_class_member_access_expr): We can get + non-template-id-expr baselinks. If the lookup finds a baselink, + remember it even inside templates. + + PR c++/23797 + * parser.c (cp_parser_functional_cast): Cope when TYPE is not a + TYPE_DECL. Use dependent_type_p to check type. + * pt.c (uses_template_parms_p): Use dependent_type_p for a + TYPE_DECL. + (type_dependent_expression_p): Assert we've not been given a + TYPE_DECL. + + PR c++/21117 + * decl.c (check_function_type): Correctly overwrite incomplete + return type with void type. + * typeck.c (check_return_expr): If the function's return type is + void, don't try and convert a return expr. + +2005-10-12 David Edelsohn + + PR c++/23730 + * call.c (build_object_call): If BINFO is NULL, bypass + lookup_fnfields and set fns to NULL_TREE. + +2005-10-12 Paolo Bonzini + + PR c++/24052 + * error.c (dump_expr): Pass LABEL_DECL to dump_decl. Print + an ADDR_EXPR of a LABEL_DECL as &&. + +2005-10-12 Nathan Sidwell + + PR c++/19964 + * class.c (walk_subobject_offsets): Don't walk error_mark_node. + +2005-10-11 Ian Lance Taylor + + PR c++/8057 + * cvt.c (convert_to_void): Don't warn about unused values when + processing a template declaration. + +2005-10-11 Mark Mitchell + + PR c++/21089 + * call.c (convert_like_real): Use decl_constant_value, not + integral_constant_value. + * init.c (constant_value_1): New function. + (integral_constant_value): Use it. + (decl_constant_value): Likewise. + * typeck.c (decay_conversion): Use decl_constant_value, not + integral_constant_value. + + PR c++/21369 + * parser.c (cp_parser_elaborated_type_specifier): Don't treat + class types as templates if the type is not appearing as part of a + type definition or declaration. + +2005-10-10 Mark Mitchell + + PR c++/24277 + * pt.c (instantiate_decl): Call finish_static_data_member_decl for + static data members. + +2005-10-10 Giovanni Bajo + Mark Mitchell + + PR c++/23437 + * parser.c (cp_parser_template_argument_list): Do not treat + contents of argument list as part of a constant expression. + +2005-10-10 Mark Mitchell + + PR c++/24139 + * decl.c (grokdeclarator): Do not require template parameter lists + for explicitly specialized class. + * error.c (dump_aggr_type): Do not dump template arguments for + non-primary specializations. + (dump_function_name): Likewise. + + PR c++/24275 + * pt.c (instantiate_decl): Instantiate the initializer of + a static data member in the namespace containing the class + containing the static data member. + +2005-10-08 James A. Morrison + + PR c++/22172 + * parser.c (cp_parser_postfix_expression) : Treat nontype + scopes as nondependent. + +2005-10-06 Volker Reichelt + + * call.c (resolve_args): Remove redundant test. + +2005-10-05 Paolo Bonzini + + PR tree-optimization/21419 + PR tree-optimization/24146 + PR tree-optimization/24151 + + * semantics.c (finish_asm_stmt): Call readonly_error if outputs are + read-only. Set ASM_VOLATILE_P for asms without outputs. + +2005-10-05 Nathan Sidwell + + PR c++/23513 + * call.c (joust): Adjust length count to more_specialized_fn. + * pt.c (more_specialized_fn): Cope with non-static member vs + non-member. + +2005-10-04 Andrew Pinski + + PR middle-end/23125 + * decl.c (make_rtl_for_nonlocal_decl): Use set_user_assembler_name + instead of change_decl_assembler_name. + +2005-10-03 Alexandre Oliva + + * error.c (dump_type) : Print reworded message. + +2005-10-03 Mark Mitchell + + PR c++/17775 + * repo.c: Include flags.h. + (finish_repo): Add -frandom-seed to the arguments. + +2005-10-02 Mark Mitchell + + PR c++/22621 + * parser.c (cp_parser_template_argument): Don't turn "T::f" into + "(*this).T::f". + * pt.c (convert_nontype_argument): Remove ??? comment. + + PR c++/23840 + * tree.c (lvalue_p_1): A VA_ARG_EXPR with class type is an lvalue, + when class rvalues are lvalues. + +2005-09-28 Mark Mitchell + + PR c++/16782 + * decl.c (grokdeclarator): Always pedwarn about overqualified + member names. + +2005-09-27 Mark Mitchell + + PR c++/22147 + * name-lookup.c (maybe_process_template_type_declaration): Don't + treat forward declarations of classes as templates just because + we're processing_template_decl. + * pt.c (tsubst_decl): Clear DECL_TEMPLATE_INFO for friend + functions. + +2005-09-26 Jason Merrill + + PR c++/13764 + * cp-tree.h (FUNCTION_NEEDS_BODY_BLOCK): New macro. + * name-lookup.c (pushdecl_maybe_friend): Check it. + * decl.c (begin_function_body): Do nothing if it's false. + (finish_function_body): Ditto. + (outer_curly_brace_block): New fn. + (finish_function): Use it. + +2005-09-26 Richard Guenther + + PR middle-end/15855 + * decl2.c (do_static_destruction): Remove. + (finish_static_initialization_or_destruction): Likewise. + (DECL_EFFECTIVE_INIT_PRIORITY): New macro. + (NEEDS_GUARD_P): Likewise. + (do_static_initialization): Rename to + do_static_initialization_or_destruction. Process all + initializers/destructors and handle common conditionalizing. + (start_static_initialization_or_destruction): Rename to + one_static_initialization_or_destruction. Handle only + decl-specific conditionalizing. + (cp_finish_file): Call do_static_initialization_or_destruction. + +2005-09-22 Jakub Jelinek + + PR c++/21983 + * class.c (find_final_overrider): Move diagnostic about no unique final + overrider to... + (update_vtable_entry_for_fn): ... here. + +2005-09-21 Mark Mitchell + + PR c++/23993 + * init.c (integral_constant_value): Use DECL_INTEGRAL_CONSTANT_VAR_P. + +2005-09-21 Volker Reichelt + + PR c++/23965 + * call.c (resolve_args): Return error_mark_node on arguments + whose TREE_TYPE is error_mark_node. + +2005-09-20 Jakub Jelinek + + PR c++/23947 + * rtti.c (get_pseudo_ti_init): Recompute ti pointer after + get_tinfo_ptr calls. + +2005-09-16 Mark Mitchell + + PR c++/23914 + * parser.c (cp_parser_enclosed_template_argument_list): Make sure + skip_evaluation is false when processing template arguments. + + PR c++/21514 + * pt.c (check_instantiated_args): Treat uses of anonymous types as + causing type-deduction failure. + +2005-09-15 Jason Merrill + + PR c++/23357 + * cp-tree.def (SIZEOF_EXPR, ALIGNOF_EXPR): Change code class to + tcc_expression. + +2005-09-15 Mark Mitchell + + PR c++/23896 + * pt.c (tsubst_aggr_type): Make sure skip_evaluation is false when + processing template arguments. + + * pt.c (check_explicit_instantiation_namespace): Fix typo. + + PR c++/13140 + * decl.c (check_class_member_definition_namespace): New function. + (grokfndecl): Use it. + (grokvardecl): Likewise. + (grokdecl): Improve documentation. + * pt.c (check_explicit_instantiation_namespace): New function. + (register_specialization): Call check_specialization_namespace + when replacing an implicitly instantiated function. + (check_explicit_specialization): Ensure that DECL_CONTEXT is set + correctly for namespace-scope specializations. + (do_decl_instantiation): Use + check_explicit_instantiation_namespace. + (do_type_instantiation): Likewise. + +2005-09-15 Nathan Sidwell + + PR c++/23725 + * error.c (dump_decl): Use USING_DECL_SCOPE. + +2005-09-13 Bastian Blank + + PR c++/16171 + * mangle.c (find_substitution): Do not use special substitutions + for identifiers not in std::. + +2005-09-13 Mark Mitchell + + PR c++/23839 + * typeck.c (cxx_mark_addressable): Only check DECL_HARD_REGISTER + for VAR_DECLs. + +2005-09-13 Mark Mitchell + + PR c++/23842 + * pt.c (tsubst_default_argument): Do treat default argument + expressions as occurring in the context of the function called. + +2005-09-12 Mark Mitchell + + PR c++/23841 + * parser.c (cp_parser_primary_expression): Recognize the closing + ">" of a template-argument-list after a floating-point literal as + the end of a cast expression. + +2005-09-12 Mark Mitchell + + PR c++/23789 + * cvt.c (perform_qualification_conversions): Don't create + unnecessary NOP_EXPRs. + * pt.c (tsubst_template_arg): Use fold_non_dependent_expr. + +2005-09-12 Ian Lance Taylor + + PR g++/7874 + * cp-tree.h (struct lang_decl_flags): Add hidden_friend_p + bitfield. Make dummy bitfield one bit smaller. + (DECL_HIDDEN_FRIEND_P): Define. + (pushdecl_maybe_friend): Declare. + (pushdecl_top_level_maybe_friend): Declare. + * decl.c (duplicate_decls): Add newdecl_is_friend parameter. + Change prototype and all callers. Add assertion that a + DECL_ARTIFICIAL FUNCTION_DECL is not DECL_HIDDEN_FRIEND_P. Set + DECL_ANTICIPATED and DECL_HIDDEN_FRIEND_P in duplicated decl if + appropriate. + * name-lookup.c (supplement_binding): Don't ignore a + DECL_HIDDEN_FRIEND_P. + (pushdecl_maybe_friend): Break out contents of pushdecl. Add + is_friend parameter. Set DECL_ANTICIPATED and + DECL_HIDDEN_FRIEND_P for a friend function. + (pushdecl): Just call pushdecl_maybe_friend. + (pushdecl_with_scope): Add is_friend parameter. Change prototype + and all callers. + (pushdecl_namespace_level): Likewise. + (push_overloaded_decl): Likewise. Check DECL_HIDDEN_FRIEND_P as + well as DECL_ANTICIPATED when checking for a builtin. + (do_nonmember_using_decl): Check DECL_HIDDEN_FRIEND_P as well as + DECL_ANTICIPATED when checking for a builtin. + (do_nonmember_using_decl): Likewise. + (pushdecl_top_level_1): Add is_friend parameter. Change all + callers. + (pushdecl_top_level_maybe_friend): New function. + (remove_hidden_names): New function. + (struct arg_lookup): Add args field. + (friend_of_associated_class_p): New static function. + (arg_assoc_namespace): Ignore hidden functions which are not + friends of an associated class of some argument. + (lookup_arg_dependent): Remove hidden functions from list passed + in. Initialize k.args. + * name-lookup.h (remove_hidden_names): Declare. + * friend.c (do_friend): Call pushdecl_maybe_friend instead of + pushdecl. + * call.c (add_function_candidate): Change DECL_ANTICIPATED test to + an assertion, with a check for DECL_HIDDEN_FRIEND_P. + (build_new_function_call): Add koenig_p parameter. Change + prototype and callers. + * pt.c (register_specialization): Add is_friend parameter. Change + all callers. + (push_template_decl_real): Change is_friend parameter to bool. + Change prototype and all callers. + (tsubst_friend_class): Call pushdecl_top_level_maybe_friend + instead of pushdecl_top_level. + +2005-09-11 Richard Henderson + + * decl2.c (build_anon_union_vars): Copy attributes from the base addr. + * pt.c (tsubst_decl): Substitute in DECL_VALUE_EXPR. + +2005-09-09 Gabriel Dos Reis + + * parser.c (cp_parser_translation_unit): Simplify. The while-block + was actually executed at most once. + +2005-09-09 Richard Henderson + + PR debug/20998 + * cp-tree.def (ALIAS_DECL): Remove. + * cp-lang.c (cp_init_ts): Remove support for it. + * error.c (dump_decl): Likewise. + * name-lookup.c (pushdecl): Likewise. + * semantics.c (finish_id_expression): Likewise. + * decl2.c (build_anon_union_vars): Use a VAR_DECL with + DECL_VALUE_EXPR instead. + +2005-09-09 Mark Mitchell + + PR c++/22252 + * decl.c (start_preparsed_function): Do not pay attention to + #pragma interface for implicitly-defined methods. + * decl2.c (cp_finish_file): Do not complain about uses of inline + functions that have bodies, even if we decided not to emit the + body in this translation unit. + * semantics.c (note_decl_for_pch): Do not mess with linkage. + (expand_or_defer_fn): Make inline, non-template functions COMDAT + at this point. + +2005-09-08 Richard Henderson + + PR debug/23190 + * decl.c (wrapup_globals_for_namespace): Call + emit_debug_global_declarations. + * decl2.c (cp_finish_file): Likewise. + +2005-09-08 Mark Mitchell + + PR c++/23691 + * decl2.c (mark_used): Instantiate static data members initialized + by constants, even in a template. + +2005-09-08 Andrew Pinski + + PR obj-c++/16816 + * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as + two CPP_COLON. + +2005-09-07 Richard Guenther + + * cp-gimplify.c (cp_gimplify_expr): Create empty CONSTRUCTOR + for EMPTY_CLASS_EXPR. + +2005-09-06 Jakub Jelinek + + PR c/23075 + * typeck.c (check_return_expr): Add no_warning argument. Set + *no_warning to true if "return-statement with no value, in function + returning" warning has been issued. + * cp-tree.h (check_return_expr): Adjust prototype. + * semantics.c (finish_return_stmt): Set TREE_NO_WARNING if + check_return_expr set *no_warning to true. + +2005-09-06 Mark Mitchell + + * cp-tree.h (rvalue): New function. + * call.c (build_conditional_expr): Use it. + * init.c (build_new_1): Likewise. + * rtti.c (build_dynamic_cast_1): Likewise. + * tree.c (rvalue): New function. + * typeck.c (build_unary_op): Use it. + (build_static_cast_1): Likewise. + + PR c++/9782 + * init.c (build_new_1): Make sure the entire array type is + complete, not just its element types. + +2005-09-06 Volker Reichelt + + * decl.c (check_elaborated_type_specifier): Remove redundant check. + +2005-09-06 Jakub Jelinek + + PR c++/23056 + * typeck.c (ignore_overflows): New helper function. + (build_static_cast_1): Use it. + +2005-09-06 Kazu Hirata + + * cp-tree.h, decl.c, decl2.c, semantics.c: Fix comment typos. + Follow spelling conventions. + +2005-09-05 Mark Mitchell + + PR c++/23667 + * pt.c (tsubst_decl): Clear DECL_TEMPLATE_INSTANTIATED when + copying a VAR_DECL. + +2005-09-05 Mark Mitchell + + PR c++/21440 + * semantics.c (finish_stmt_expr_expr): Add an explicit + initialization to the last statement in the statement-expression. + * (finish_stmt_expr): Adjust accordingly. + +2005-09-03 Mark Mitchell + + PR c++/23699 + * decl2.c (mark_used): Always instantiate static data members + initialized by constant expressions. + * pt.c (instantiate_decl): Instantiate the initializers for static + data members initialized by constant expressions. + + PR c++/21687 + * semantics.c (expand_or_defer_fn): Do not call ggc_collect when + finishing processing for a template function in a local class. + Revert: + 2005-09-02 Mark Mitchell + * parser.c (cp_parser_class_specifier): Push/pop GC contexts + around functions in local classes. + +2005-09-02 Mark Mitchell + + PR c++/21687 + * parser.c (cp_parser_class_specifier): Push/pop GC contexts + around functions in local classes. + +2005-08-31 Andrew Pinski + + PR obj-c++/23640 + * decl2.c (cp_finish_file): If this is obj-c++ and we need a static + init, call generate_ctor_or_dtor_function. + +2005-08-31 Volker Reichelt + + PR c++/13377 + * parser.c (cp_parser_lookup_name): Pass LOOKUP_COMPLAIN to + lookup_name_real on final parse. + +2005-08-31 Volker Reichelt + + PR c++/23639 + * semantics.c (qualified_name_lookup_error): Do not complain again + on invalid scope. + +2005-08-30 Volker Reichelt + + PR c++/23586 + * parser.c (cp_parser_namespace_name): Move diagnostic for + invalid namespace-name to here from ... + * name-lookup.c (do_namespace_alias): ... here and ... + (do_using_directive): ... here. Remove dead code. + +2005-08-28 Mark Mitchell + + PR c++/23099 + * cp-tree.h (saved_scope): Add skip_evaluation. + * decl.c (start_decl): Use DECL_INITIALIZED_IN_CLASS_P, not + DECL_INITIAL, to determine whether or not a static data member was + initialized in the class-specifier. + (cp_finish_decl): Add comment. + * init.c (integral_constant_value): Subtitute into the + initializers for static data members in templates. + * name-lookup.c (push_to_top_level): Save skip_evaluation. + (pop_from_top_level): Restore it. + * pt.c (instantiate_class_template): Do not substitute into the + intializers of static data members when instantiating a class. + (regenerate_decl_from_template): Simplify. + (instantiate_decl): Tidy. Substitute into the initializer for a + static data member even when the definition of the data member is + not available. + +2005-08-26 Mark Mitchell + + PR c++/19004 + * pt.c (uses_template_parms): Handle IDENTIFIER_NODE. + (type_dependent_expression_p): Allow BASELINKs whose associated + functions are simply a FUNCTION_DECL. + + PR c++/23491 + * cp-tree.h (build_vec_init): Adjust prototype. + * init.c (perform_member_init): Adjust call to build_vec_init. + (build_aggr_init): Likewise. + (build_new_1): Do not call build_default_init for array types. + (build_vec_init): Add explicit_default_init_p parameter. Perform + default initialization of vector elements when set. + * typeck.c (build_modify_expr): Adjust call to build_vec_init. + +2005-08-25 Nathan Sidwell + + PR c++/20817 + * typeck.c (build_x_unary_op): Make sure OFFSET_REF is not for a + ->*. + +2005-08-24 Nathan Sidwell + + PR c++/22454 + * parser.c (cp_lexer_peek_nth_token): Relax assert. + +2005-08-23 Nathan Sidwell + + PR c++/23044 + * pt.c (tsubst_qualified_id): A SCOPE_REF can still remain. + +2005-08-22 James E Wilson + + PR tree-optimization/23426 + * decl.c (grokdeclarator): Use TYPE_SIZE_UNIT not TYPE_SIZE for + array size check. + +2005-08-22 Volker Reichelt + + PR c++/22233 + * pt.c (push_template_decl_real): Return error_mark_node if the + number of template parameters does not match previous definition. + +2005-08-22 Volker Reichelt + + PR c++/23089 + * decl.c (require_complete_types_for_parms): Mark incomplete types + as invalid. + +2005-08-19 Volker Reichelt + + * parser.c (cp_parser_nth_token_starts_template_argument_list_p): + Fix typo in leading comment. + +2005-08-15 Kaveh R. Ghazi + + * name-lookup.c, ptree.c: Delete HOST_PTR_PRINTF. + +2005-08-15 Fariborz Jahanian + + * cp-tree.h (can_convert_arg, fn_type_unification): New argument. + * call.c (add_template_candidate_real): Pass down 'flags' to + fn_type_unification. + (can_convert_arg): New 'flags' argument. Pass it to call to + implicit_conversion instead of LOOKUP_NORMAL. + (can_convert): Add LOOKUP_NORMAL to call to can_convert_arg. + * class.c (resolve_address_of_overloaded_function): Ditto. + (resolve_address_of_overloaded_function): Ditto. + * decl.c (reshape_init, check_default_argument): Ditto. + * typeck.c (build_ptrmemfunc): Ditto. + * pt.c (type_unification_real): Add 'flags' argument. + (fn_type_unification): Pass 'flags' to type_unification_real. + (type_unification_real): Pass new 'flags' argument to call to + can_convert_arg. + +2005-08-12 Giovanni Bajo + Nathan Sidwell + + PR c++/21799 + PR c++/8271 + * pt.c (unify) : Check this-pointer cv-qualifiers + explicitly. + +2005-08-12 Nathan Sidwell + + PR c++/21799 + Revert my 2005-07-08 patch + * pt.c (type_unification_real): Remove is_method_argument and + assoicated checks. + (fn_type_unification, unify): Adjust type_unification_real calls. + +2005-08-11 Volker Reichelt + + PR c++/23266 + * decl2.c (grokfield): Check that method is not static before + marking it as pure. + +2005-08-11 Nathan Sidwell + + PR c++/23219 + * name-lookup.c (pushtag): Process the template type before + altering the identifier lookup fields. Remove unreachable code + creating an empty stub decl. + +2005-08-10 Volker Reichelt + + PR c++/20646 + * decl.c (grokdeclarator): Reset storage_class after error. + +2005-08-08 Volker Reichelt + + PR c++/22508 + * init.c (build_new_1): Check for empty candidate list. + +2005-08-06 Volker Reichelt + + PR c++/23191 + * pt.c (tsubst) : Check for error_mark_node + before calling build_exception_variant. + +2005-08-06 Volker Reichelt + + PR c++/19498 + * pt.c (tsubst_decl) : Return ERROR_MARK_NODE + if substitution of template args did not succeed. + +2005-08-06 Michael Matz + + * method.c (use_thunk): Call init_insn_lengths. + +2005-08-05 James A. Morrison + + PR c++/22514 + * name-lookup.c (cp_emit_debug_info_for_using): Do nothing if + sorrycount or errorcount are nonzero. + +2005-08-05 Mark Mitchell + + * name-lookup.c (pushtag): Remove accidental commit from: + 2004-12-21 Mark Mitchell + PR c++/19063 + * decl.c (grokdeclarator): Return error_mark_node, not + void_type_node, to indicate errors. + * parser.c (cp_parser_template_parameter_list): Robustify. + (cp_parser_template_parameter): Likewise. + +2005-08-01 Kazu Hirata + + * class.c, decl.c, name-lookup.c, pt.c, typeck.c, typeck2.c: + Fix comment typos. + +2005-07-29 Kazu Hirata + + * method.c: Fix a comment typo. + +2005-07-28 Mark Mitchell + + PR c++/22545 + * call.c (add_builtin_candidate): Adjust for changes in + representation of pointer-to-member types. + +2005-07-28 Mike Stump + + * pt.c (check_explicit_specialization): Add visibility logic. + (lookup_template_class): Likewise. + (instantiate_class_template): Likewise. + +2005-07-27 Devang Patel + + * name-lookup.c (pushtag): Do no set DECL_IGNORED_P bit. + +2005-07-25 Ian Lance Taylor + + * ptree.c (cxx_print_identifier): Print a leading space if the + indent level is 0. + +2005-07-24 Kaveh R. Ghazi + + * call.c (convert_for_arg_passing): Check function pointers when + -Wmissing-format-attribute is activated. + * typeck.c (convert_for_assignment): Likewise. + +2005-07-22 Manfred Hollstein + + * parser.c (cp_parser_declaration): Fix unitialised warnings. + +2005-07-21 Andrew Pinski + + * class.c (build_base_path): Fix typo. + +2005-07-21 Andrew Pinski + + PR C++/22358 + * class.c (build_base_path): Convert BINFO_OFFSET to the correct type. + +2005-07-21 Volker Reichelt + + * call.c: Fix comment typo(s). + * cxx-pretty-print.h: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + +2005-07-20 Douglas Gregor + + PR c++/2922 + * semantics.c (perform_koenig_lookup): For dependent calls, just + return the set of functions we've found so far. Later, it will be + augmented by those found through argument-dependent lookup. + * name-lookup.c (lookup_arg_dependent): Implement DR 164 by removing + the optimization that skips namespaces where the functions were + originally found. + +2005-07-20 Giovanni Bajo + + Make CONSTRUCTOR use VEC to store initializers. + * call.c (convert_default_arg): Update call to digest_init. + * class.c (dump_class_hierarchy, dump_array): Update to cope with + VEC in CONSTRUCTOR_ELTS. + * cp-tree.h (EMPTY_CONSTRUCTOR_P): Likewise. + (finish_compound_literal, digest_init): Update declaration. + * decl.c (struct reshape_iter): New data type. + (reshape_init_array): Rename to... + (reshape_init_array_1): Update to cope with VEC in CONSTRUCTOR_ELTS. + (reshape_init): Rewrite from scratch. Split parts into... + (reshape_init_array, reshape_init_vector, reshape_init_class, + reshape_init_r): New functions. + (check_initializer): Update call to reshape_init. Remove obsolete + code. + (initialize_artificial_var, cp_complete_array_type): Update to cope + with VEC in CONSTRUCTOR_ELTS. + * decl2.c (grokfield): Update calls to digest_init. + (mark_vtable_entries): Update to cope with VEC in CONSTRUCTOR_ELTS. + * error.c (dump_expr_init_vec): New function. + (dump_expr): Use dump_expr_init_vec. + * init.c (build_zero_init, build_vec_init): Update to cope with VEC + in CONSTRUCTOR_ELTS. + (expand_default_init): Update call to digest_init. + * parser.c (cp_parser_postfix_expression): Use a VEC for the + initializers. + (cp_parser_initializer_list): Build a VEC of initializers. + * pt.c (tsubst_copy, tsubst_copy_and_build): Update to cope with VEC + in CONSTRUCTOR_ELTS. + * rtti.c (tinfo_base_init, generic_initializer, ptr_initializer, + ptm_initializer, class_initializer, get_pseudo_ti_init): Use + build_constructor_from_list instead of build_constructor. + * semantics.c (finish_compound_literal): Update call to digest_init. + * tree.c (stabilize_init): Update to cope with VEC in + CONSTRUCTOR_ELTS. + * typeck.c (build_ptrmemfunc1): Likewise. + * typeck2.c: (cxx_incomplete_type_error, split_nonconstant_init_1): + Likewise. + (store_init_value): Use build_constructor_from_list and update call + to digest_init. + (digest_init): Rewrite. + (process_init_constructor): Rewrite from scratch. Split into... + (process_init_constructor_array, picflag_from_initializer, + process_init_constructor_record, process_init_constructor_union): + New functions. + (PICFLAG_ERRONEOUS, PICFLAG_NOT_ALL_CONSTANT, PICFLAG_NOT_ALL_SIMPLE): + New macros. + (build_functional_cast): Use build_constructor_from_list instead of + build_constructor. + +2005-07-18 Mark Mitchell + + PR c++/22263 + * cp-tree.h (instantiate_decl): Change prototype. + * decl2.c (mark_used): Adjust accordingly. + * pt.c (do_decl_instantiation): Likewise. + (instantiate_class_member): Likewise. + (instantiate_decl): Rename undefined_ok as expl_inst_class_mem_p. + Clear DECL_INTERFACE_KNOWN for an explicitly instantiated template + that has no definition available. + (instantiate_pending_templates): Adjust call to instantiate_decl. + +2005-07-17 Mark Mitchell + + PR c++/22139 + * cp-tree.h (DECL_TEMPLATE_INFO): Improve documentation. + * decl.c (duplicate_decls): Re-register template specializations + for functions that have DECL_TEMLPLATE_INFO, even if they do not + have DECL_TEMPLATE_INSTANTIATION set. + +2005-07-16 Kaveh R. Ghazi + + * call.c (diagnostic_fn_t): New. + (build_temp, convert_like_real): Use diagnostic_fn_t. + +2005-07-15 Mark Mitchell + + PR c++/22204 + * repo.c (repo_emit_p): Robustify. + +2005-07-14 Daniel Berlin + + Fix PR c++/22452 + * tree.c (decl_linkage): Don't check DECL_COMDAT on CONST_DECL. + +2005-07-15 Mark Mitchell + + PR c++/22132 + * call.c (implicit_conversion): Add c_cast_p parameter. + (standard_conversion): Likewise. Allow conversions between + differently-qualified pointer types when performing a C-style + cast. + (add_function_candidate): Adjust callee. + (build_builtin_candidate): Likewise. + (build_user_type_conversion_1): Likewise. + (conditional_conversion): Likewise. + (can_convert_arg): Likewise. + (can_convert_arg_bad): Likewise. + (perform_implicit_conversion): Likewise. + * cp-tree.h (comp_ptr_ttypes_const): Declare. + * typeck.c (comp_ptr_ttypes_const): Give it external linkage. + Return bool. + +2005-07-12 Volker Reichelt + Nathan Sidwell + + PR c++/20172 + * pt.c (tsubst_template_parms): Check for invalid non-type + parameters. + +2005-07-09 Andrew Pinski + + * cp-lang.c (shadowed_var_for_decl, decl_shadowed_for_var_lookup, + decl_shadowed_for_var_insert): Move over to cp-objcp-common.c. + (cp_init_ts): Call init_shadowed_var_for_decl. + Remove include of gt-cp-cp-lang.h. + * cp-objcp-common.c (shadowed_var_for_decl, + decl_shadowed_for_var_lookup, decl_shadowed_for_var_insert): Moved from + cp-lang.c. + (init_shadowed_var_for_decl): New function to initialize + shadowed_var_for_decl. + Include gt-cp-cp-objcp-common.h. + * Make-lang.in (gt-cp-lang.h): Remove. + (gt-cp-cp-objcp-common.h): Add. + (cp/cp-lang.o): Remove dependancy on gt-cp-lang.h. + (cp/cp-objcp-common.o): Add dependancy on gt-cp-cp-objcp-common.h. + * config-lang.in (gtfiles): Remove cp-lang.c and Add cp-objcp-common.c. + * cp-tree (init_shadowed_var_for_decl): Add prototype. + +2005-07-08 Daniel Berlin + + * Make-lang.in: Add gt-cp-lang.h. + (cp-lang.o): Ditto. + * class.c (create_vtable_ptr): Stop setting DECL_ASSEMBLER_NAME on + the field. + * config-lang.in: Add cp-lang.c to gtfiles. + * cp-lang.c: Include hashtab.h. + (cp_init_ts): New function. + (LANG_HOOK_INIT_TS): Use macro. + (decl_shadowed_for_var_lookup): New function. + (decl_shadowed_for_var_insert): Ditto. + * cp-tree.h (THUNK_FUNCTION_CHECK): Use decl_common. + (NON_THUNK_FUNCTION_CHECK): Ditto. + (DECL_NAMESPACE_ASSOCIATIONS): Use decl_non_common. + (DECL_INIT_PRIORITY): Ditto. + (DECL_HAS_SHADOWED_FOR_VAR_P): Ditto. + (DECL_SHADOWED_FOR_VAR): Use hashtable. + (SET_DECL_SHADOWED_FOR_VAR): Ditto. + * decl.c (duplicate_decls): Update for new/updated structures. + (poplevel): Use SET_DECL_SHADOWED_FOR_VAR. + * decl2.c (start_static_initialization_or_destruction): Deal with + priority. + * pt.c (tsubst_decl): Check TS_DECL_WRTL before doing + SET_DECL_RTL. + * tree.c (handle_init_priority_attribute): Handle priority. + +2005-07-08 Nathan Sidwell + + PR c++/21799 + * pt.c (type_unification_real): Add is_method argument. Use it + for this pointer unification. + (fn_type_unification): Adjust type_unification_real call. + (unify): Likewise. + +2005-07-07 Nathan Sidwell + + * pt.c (type_unification_real): Remove allow_incomplete argument. + Remove unreachable code. + (fn_type_unification): Adjust call to type_unification_real. + (unify): Likewise. + +2005-07-05 Paolo Bonzini + + * Makefile.in (class.o, decl2.o): Adjust dependencies. + * class.c: Include tree-dump.h. + * decl2.c: Include tree-dump.h. + +2005-07-02 Gabriel Dos Reis + + * dump.c: Use dump_string_field. + +2005-07-03 Joseph S. Myers + + * cp-tree.h (GCC_DIAG_STYLE): #undef before defining. Change + minimum GCC version for format checking to 4.1. + +2005-07-02 Kazu Hirata + + * Make-lang.in (cc1plus-checksum.c): Use + build/genchecksum$(build_exeext), not build/genchecksum$(exeext). + +2005-07-02 Joseph S. Myers + + * name-lookup.c, parser.c: Use %q, %< and %> to quote in + diagnostics. + +2005-07-02 Zack Weinberg + Joseph S. Myers + + * error.c (location_of): Add comment. + (locate_error, cp_error_at, cp_warning_at, cp_pedwarn_at): Remove. + * cp-tree.h (cp_error_at, cp_warning_at, cp_pedwarn_at): Remove. + * call.c, class.c, decl.c, decl2.c, friend.c, init.c, + name-lookup.c, parser.c, pt.c, search.c, semantics.c, typeck.c, + typeck2.c: Use '+' flag instead of %J, cp_error_at, cp_warning_at + or cp_pedwarn_at. Mark up some diagnostic strings with N_. + +2005-06-30 Daniel Berlin + + * decl.c (require_complete_types_for_parms): Call relayout_decl + instead of layout_decl. + +2005-06-30 Zack Weinberg + Jakub Jelinek + + * cp-lang.c: No need to include cxx-pretty-print.h. + * error.c (cp_printer): Update signature. No need to process + flags. + (print_instantiation_partial_context): Output last newline + with pp_base_newline. + * Make-lang.in: Update dependencies. + +2005-06-30 Steven Bosscher + + * decl.c (start_decl): Replace DECL_THREAD_LOCAL with + DECL_THREAD_LOCAL_P. + (cp_finish_decl): Likewise. + (grokvardecl): Set the default DECL_TLS_MODEL here. + +2005-06-28 Joseph S. Myers + + * cvt.c (ocp_convert): Use invalid_conversion hook. + * typeck.c (build_binary_op): Use invalid_binary_op hook. + (build_unary_op): Use invalid_unary_op hook. + +2005-06-28 Paul Brook + + * Make-lang.in (cp/except.o): Depend on $(TARGET_H) + * except.c: Include target.h. + (init_exception_processing): Initialize unwind_resume_libfunc. + * doc/tm.texi: Document TARGET_ASM_TTYPE + +2005-06-26 Kaveh R. Ghazi + + * call.c (build_over_call): Pass in named argument list to + `check_function_arguments'. + * typeck.c (build_function_call): Likewise. + +2005-06-26 Kaveh R. Ghazi + + * cp-tree.h (lang_check_failed): Add noreturn attribute. + +2005-06-25 Kelley Cook + + * all files: Update FSF address in copyright headers. + +2005-06-23 Jason Merrill + + PR c++/19317 + * semantics.c (simplify_aggr_init_expr): Use + CALL_EXPR_RETURN_SLOT_OPT, not CALL_EXPR_HAS_RETURN_SLOT_ADDR. + +2005-06-23 Volker Reichelt + + * pt.c (register_specialization): Remove superfluous assertion. + +2005-06-18 Kaveh R. Ghazi + + * call.c (convert_like_real): Add format attribute. + * typeck.c (check_for_casting_away_constness, + build_static_cast_1): Likewise. + * typeck2.c (readonly_error, cxx_incomplete_type_diagnostic): + Likewise. + +2005-06-17 Geoffrey Keating + + PR c++/17413 + * pt.c (type_unification_real): Apply template type deduction even + to procedure parameters that are not dependent on a template + parameter. + +2005-06-16 Nathan Sidwell + + * rtti.c (get_tinfo_decl): Avoid caching tinfo_descs when it might + change. + (create_pseudo_type_info): First parameter is an int. + +2005-06-15 Nathan Sidwell + + PR c++/20678 + * error.c (dump_expr) : Check DECL_NAME is not + null. + + * Make-lang.in: Reformat some long lines. + (gt-cp-rtti.h): New target. + (cp/rtti.o): Add dependency. + * config-lang.in (gtfiles): Add cp/rtti.c. + * cp-tree.h (CPTI_TI_DESC_TYPE, CPTI_BLTN_DESC_TYPE, + CPTI_PTR_DESC_TYPE, CPTI_ARY_DESC_TYPE, CPTI_FUNC_DESC_TYPE, + CPTI_ENUM_DESC_TYPE, CPTI_CLASS_DESC_TYPE, + CPTI_SI_CLASS_DESC_TYPE, CPTI_VMI_CLASS_DESC_TYPE, + CPTI_PTM_DESC_TYPE, CPTI_BASE_DESC_TYPE): Remove. + (ti_desc_type_node, bltn_desc_type_node, ptr_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, ptm_desc_type_node, + base_desc_type_node): Remove. + * decl.c: Adjust documentation of global trees. + * rtti.c (TINFO_PSEUDO_TYPE, TINFO_VTABLE_DECL, + TINFO_REAL_NAME): Remove. + (struct tinfo_s): New. + (enum tinfo_kind): New. + (tinfo_descs): New. + (get_tinfo_decl): Adjust use of tinfo descriptor. + (tinfo_base_init, generic_initializer, ptr_initializer, + ptm_initializer, class_initializer): Likewise. + (get_pseudo_ti_init): Take descriptor index. Adjust. + (create_pseudo_type_info): Likewise. + (get_pseudo_ti_desc): Return descriptor index. Adjust. + (create_tinfo_types): Adjust use of create_pseudo_type_info. + (emit_tinfo_decl): Adjust use of tinfo descriptor. + +2005-06-14 Roger Sayle + + * decl.c (grokdeclarator): Only check TREE_OVERFLOW on INTEGER_CST. + +2005-06-13 Geoffrey Keating + + * Make-lang.in (c++.install-man): Doesn't really depend on installdirs. + (rule for installing g++.1 manpage): Does depend on installdirs. + +2005-06-13 Nathan Sidwell + + PR c++/20789 + * decl.c (cp_finish_decl): Clear runtime runtime initialization if + in-class decl's initializer is bad. + + PR c++/21929 + * parser.c (struct cp_parser): Document that scope could be + error_mark. + (cp_parser_diagnose_invalid_type_name): Cope with error_mark for + scope. + (cp_parser_nested_name_specifier): Return NULL_TREE on error. + (cp_parser_postfix_expression): Deal with null or error_mark + scope. + (cp_parser_elaborated_type_specifier): Adjust + cp_parser_nested_name_specifier call. + + * parser (cp_parser_skip_to_end_of_block_or_statement): Cleanup. + +2005-06-12 Roger Sayle + + PR c++/21930 + * error.c (dump_expr): UNARY_PLUS_EXPR need not handle void types. + Treat CONVERT_EXPR identically to NOP_EXPR. + +2005-06-10 Aldy Hernandez + + PR c++/10611 + * cvt.c (build_expr_type_conversion): Same. + * typeck.c (build_binary_op): Handle vectors. + (common_type): Same. + (type_after_usual_arithmetic_conversions): Same. + +2005-06-08 Nathan Sidwell + + PR c++/19497 + * cp-tree.def (USING_DECL): Update documentation. + * cp-tree.h (DECL_DEPENDENT_P): New. + (USING_DECL_DECLS, USING_DECL_SCOPE): New. + * class.c (handle_using_decl): Move most of the processing to ... + * name-lookup.c (do_class_using_decl): ... here. Make stricter. + (push_using_decl): Use USING_DECL_SCOPE. + (cp_emit_debug_info_for_using): Make extern. + * cxx-pretty-print.c (pp_cxx_statement) : Adjust. + * name-lookup.h (cp_emit_debug_info_for_using): Declare. + * pt.c (tsubst_decl) : Use do_class_using_decl + when tsubsting. + (tsubst_expr): Use USING_DECL_SCOPE. + * search.c (lookup_field_1): Use DECL_DEPENDENT_P. + * semantics.c (finish_member_declaration): Likewise. + +2005-06-08 Volker Reichelt + + PR c++/19894 + * pt.c (tsubst): Reject pointer-to-member of type void. + + PR c++/20563 + * parser.c (cp_parser_label_declaration): Deal with invalid/missing + identifiers. + +2005-06-07 Nathan Sidwell + + * cp-tree.def (DEFAULT_ARG): Adjust documentation. + * cp-tree.h (DEFARG_INSTANTIATIONS): New. + (struct tree_default_arg): Add instantiations member. + * parser.c (cp_parser_late_parsing_default_args): Adjust to use a + VEC. + * pt.c (tsubst_arg_types): Likewise. + + * parser.c (cp_parser_late_parsing_default_args): Fix overeager + assert in previous patch. + +2005-06-06 Jakub Jelinek + + * error.c (locate_error): Use gmsgid instead of msgid for argument + name. + (cp_error_at, cp_warning_at, cp_pedwarn_at): Likewise. + +2005-06-06 Nathan Sidwell + + PR 21903 + * cp-tree.def (DEFAULT_ARG): Document TREE_CHAIN use. + * parser.c (cp_parser_late_parsing_default_args): Propagate parsed + argument to any early instantiations. + * pt.c (tsubst_arg_types): Chain early instantiation of default arg. + + PR c++/20637 + * cp-tree.h (add_method): Add using_decl parameter. + * class.c (add_method): Add using_decl parameter. Adjust error + messages. + (handle_using_decl): Pass the using decl to add_method. + (clone_function_decl): Adjust add_member calls. + * decl2.c (check_classfn): Likewise. + * method.c (lazily_declare_fn): Likewise. + * semantics.c (finish_member_declaration): Likewise. + + * method.c (synthesize_method): Use inform, not warning. + +2005-06-06 Hans-Peter Nilsson + + * config-lang.in (target_libs): Remove target-gperf. + +2005-06-05 Mark Mitchell + + PR c++/21619 + * cp-tree.h (DECL_IS_BUILTIN_CONSTANT_P): New macro. + * parser.c (cp_parser_postfix_expression): Allow non-constant + expressions as arguments to __builtin_constant_p. + * tree.c (builtin_valid_in_constant_expr_p): Use + DECL_IS_BUILTIN_CONSTANT_P. + +2005-06-03 Mark Mitchell + + PR c++/21853 + * typeck.c (casts_away_constness_r): Do not drop cv-qualifiers on + the pointed-to type for a pointer-to-member. + + PR c++/21336 + * cp-tree.h (grok_op_properties): Remove friendp parameter. + * decl.c (grokfndecl): Adjust call. + (grok_op_properties): Determine the class of which the function is + a member by looking at its DECL_CONTEXT, not current_class_type. + * pt.c (tsubst_decl): Adjust call to grok_op_properties. + +2005-06-02 Nathan Sidwell + + * method.c (synthesize_method): Add addtional arg to warning call. + + PR c++/21280 + * Make-lang.in (method.o): Add diagnostic.h + * decl.c (start_preparsed_function): Use decl's location for file + info. + * decl2.c (cp_finish_file): Set input_location before synthesizing + a function. + (mark_used): When deferring a synthesized function, save current + location. Do not set function's location when actually + synthesizing it. + * method.c: #include diagnostic.h. + (synthesize_method): Set the functions source location. Show + needed location if errors are emitted. + + * decl.c (start_decl): Simplify specialization handling. Remove + unneeded CLASSTYPE_TEMPLATE_INSTANTIATION check. + * mangle.c (discriminator_for_local_entity): Use VEC_index. + + PR c++/20350 + * decl.c (duplicate_decls): Copy all of DECL_USE_TEMPLATE. + + PR c++/21151 + * name-lookup.c (pushtag): Push local class even in a template. + +2005-05-31 Nathan Sidwell + + PR c++/21165 + * init.c (integral_constant_value): Check the type of the + initializer, not the decl. + +2005-05-30 Mark Mitchell + + PR c++/21784 + * name-lookup.c (do_nonmember_using_decl): Ignore builtin + functions, even when the used name is not a function. + +2005-05-30 Kazu Hirata + + * operators.def, optimize.c: Update copyright. + +2005-05-28 Mark Mitchell + + PR c++/21210 + * call.c (standard_conversion): Permit conversions to complex + types if conversion to the corresponding scalar type would be + permitted. + + PR c++/21340 + * method.c (implicitly_declare_fn): Clear processing_template_decl + when generating implicit declaration. + +2005-05-27 Mark Mitchell + + PR c++/21614 + * typeck.c (get_member_function_from_ptrfunc): Do not attempt + conversions to base classes of incomplete types. + +2005-05-27 Ian Lance Taylor + + * semantics.c (add_stmt): Add C++ frontend specific version. + * cp-tree.h (STMT_IS_FULL_EXPR_P): Define. + (stmts_are_full_exprs_p): Declare. + +2005-05-27 Roger Sayle + Giovanni Bajo + + * cp-tree.def (UNARY_PLUS_EXPR): New C++ unary tree code. + * parser.c (cp_parser_unary_expression): Use UNARY_PLUS_EXPR instead + of CONVERT_EXPR. + (cp_parser_unary_expression): Likewise. + * typeck.c (build_unary_op): Likewise. + * call.c (add_builtin_candidate, build_new_op): Likewise. + * error.c (dump_expr): Likewise. + * pt.c (tsubst_copy, tsubst_copy_and_build): Likewise. + * decl.c (ambi_op_p, grok_op_properties): Likewise. + * dump.c (dump_op): Likewise. + * lex.c (init_operators): Likewise. + * operators.def ("+"): Likewise. + * cp-gimplify.c (cp_gimplify_expr): Handle UNARY_PLUS_EXPR like a + conversion, if the result and argument types differ. + * tree.c (fold_if_not_in_template): Fold UNARY_PLUS_EXPR much + like a NOP_EXPR when !processing_template_decl. + + * cxx-pretty-print.c (pp_cxx_cast_expression): Prototype. + (pp_cxx_unary_expression): Handle new UNARY_PLUS_EXPR tree code. + +2005-05-27 Nathan Sidwell + + PR c++/21455 + * typeck.c (get_delta_difference): Cope with incomplete but equal + classes. Reorder if. + + PR c++/21681 + * parser.c (cp_parser_late_parsing_for_member): Disable access + checking for template functions. + +2005-05-26 Volker Reichelt + + PR c++/21768 + * pt.c (redeclare_class_template): Change error message according + to coding conventions. + +2005-05-26 Volker Reichelt + + * call.c (build_op_delete_call): Fix quoting in error message. + +2005-05-25 Richard Henderson + + PR libgcj/21692 + * cp-tree.h (make_alias_for): Declare. + * decl2.c (build_java_method_aliases): New. + (cp_finish_file): Call it. + * method.c (make_alias_for): Split out from ... + (make_alias_for_thunk): ... here. + +2005-05-25 Volker Reichelt + + PR c++/21686 + * semantics.c (finish_id_expression): Fix quoting in error message. + +2005-05-25 DJ Delorie + + * decl.c (duplicate_decls): Move warning control from if() to + warning(OPT_*). + * name-lookup.c (parse_using_directive): Likewise. + * parser.c (cp_parser_elaborated_type_specifier): Likewise. + (cp_parser_init_declarator): Likewise. + * tree.c (handle_com_interface_attribute): Likewise. + +2005-05-24 Ziemowit Laski + + * class.c (layout_class_type): Do not issue C++ ABI warnings + for ObjC structs. + * decl.c (objc_mark_locals_volatile): Streamline by calling + objc_volatilize_decl(). + * parser.c (cp_parser_objc_message_expression): Allow simple + type specifiers (instead of merely type names) as message + receivers. + * pt.c (template_args_equal): Do not call objc_comptypes(). + * typeck.c (composite_pointer_type): If both pointers are + ObjC-esque, arbitrarily choose the first; do not call + objc_comptypes(). + (comptypes): Do not call objc_comptypes(). + (convert_for_assignment): Call objc_compare_types(). + (comp_ptr_ttypes_real): Call objc_type_quals_match() before + concluding that types do not match. + +2005-05-24 Andrew Pinski + + PR C++/21645 + * optimize.c (update_cloned_parm): Copy the TYPE also from the + original one. + +2005-05-19 Jakub Jelinek + + PR c++/21495 + * decl.c (grokdeclarator): Fix "storage class specified for" + error reporting. + +2005-05-19 Kazu Hirata + + * parser.c: Fix comment typos. + +2005-05-18 Geoffrey Keating + + * Make-lang.in (cc1plus-dummy): New. + (cc1plus-checksum.c): New. + (cc1plus-checksum.o): New. + (cc1plus): Add cc1plus-checksum.o. + +2005-05-17 H.J. Lu + + PR C++/19664 + * decl2.c (determine_visibility): Don't set visibility to + hidden if it has been set explicitly by user. + +2005-05-17 Ziemowit Laski + Mike Stump + + Yet more Objective-C++... + + * cp-objcp-common.h (cxx_get_alias_set): Move from + here... + (cxx_warn_unused_global_decl): Likewise. + (cp_expr_size): Likewise. + (cp_tree_size): Likewise. + (cp_var_mod_type_p): Likewise. + (cxx_initialize_diagnostics): Likewise. + (cxx_types_compatible_p): Likewise. + * cp-tree.h: to here. + (do_poplevel): Add. + * lex.c (D_OBJC): Add. + (init_reswords): Add. + * Make-lang.in (cp/pt.o): Add cp/cp-objcp-common.h. + * parser.c: Add c-common.h include. + * pt.c: Add c-common.h and cp-objcp-common.h includes. + (template_args_equal): Use objc_comptypes as well. + (tsubst_copy_and_build): Use objcp_tsubst_copy_and_build as well. + * semantics.c (do_poplevel): Remove static. + + * decl.c (objc_mark_locals_volatile): Don't change decls that are + already ok. + * decl2.c (generate_ctor_or_dtor_function): Add code to initialize + Objective C++ early enough. + * lex.c (struct resword reswords): Add Objective-C++ support. + * parser.c (cp_lexer_get_preprocessor_token): Add Objective-C++. + (cp_parser_objc_message_receiver): Add. + (cp_parser_objc_message_args): Likewise. + (cp_parser_objc_message_expression): Likewise. + (cp_parser_objc_encode_expression): Likewise. + (cp_parser_objc_defs_expression): Likewise. + (cp_parser_objc_protocol_expression): Likewise. + (cp_parser_objc_selector_expression): Likewise. + (cp_parser_objc_expression): Likewise. + (cp_parser_objc_visibility_spec): Likewise. + (cp_parser_objc_method_type): Likewise. + (cp_parser_objc_protocol_qualifiers): Likewise. + (cp_parser_objc_typename): Likewise. + (cp_parser_objc_selector_p): Likewise. + (cp_parser_objc_selector): Likewise. + (cp_parser_objc_method_keyword_params): Likewise. + (cp_parser_objc_method_tail_params_opt): Likewise. + (cp_parser_objc_interstitial_code): Likewise. + (cp_parser_objc_method_signature): Likewise. + (cp_parser_objc_method_prototype_list): Likewise. + (cp_parser_objc_method_definition_list): Likewise. + (cp_parser_objc_class_ivars): Likewise. + (cp_parser_objc_identifier_list): Likewise. + (cp_parser_objc_alias_declaration): Likewise. + (cp_parser_objc_class_declaration): Likewise. + (cp_parser_objc_protocol_declaration): Likewise. + (cp_parser_objc_protocol_refs_opt): Likewise. + (cp_parser_objc_superclass_or_category): Likewise. + (cp_parser_objc_class_interface): Likewise. + (cp_parser_objc_class_implementation): Likewise. + (cp_parser_objc_end_implementation): Likewise. + (cp_parser_objc_declaration): Likewise. + (cp_parser_objc_try_catch_finally_statement): Likewise. + (cp_parser_objc_synchronized_statement): Likewise. + (cp_parser_objc_throw_statement): Likewise. + (cp_parser_objc_statement): Likewise. + (cp_parser_primary_expression): Add Objective-C++. + (cp_parser_statement): Likewise. + (cp_parser_declaration): Likewise. + (cp_parser_simple_type_specifier): Likewise. + (cp_parser_type_name): Likewise. + (cp_parser_parameter_declaration_list): Likewise. + (cp_parser_member_declaration) Likewise. + * tree.c: Include debug.h. + * typeck.c (composite_pointer_type): Add Objective-C++ support. + (finish_class_member_access_expr): Likewise. + (build_function_call): Allow objc to rewrite FUNCTION_DECLs. + (build_modify_expr): Allow objc to generate write barriers. + + * Make-lang.in (cp/tree.o): Add debug.h. + * tree.c (lvalue_p_1, case CONST_DECL): Add. + +2005-05-18 Jan Hubicka + + * method.c: Include tree-pass.h + (use_thunk): Lower body before expanding. + +2005-05-17 Jakub Jelinek + + PR c++/21454 + * decl.c (maybe_deduce_size_from_array_init): Call + cp_apply_type_quals_to_decl after completing array type. + +2005-05-16 Richard Henderson + + * decl.c (build_library_fn_1): Move setting TREE_NOTHROW ... + (build_library_fn): ... here. + +2005-05-12 Ian Lance Taylor + + * cp-tree.h (cp_stmt_codes): Don't define. + (statement_code_p): Declare. + (STATEMENT_CODE_P): Define. + * lex.c (statement_code_p): Define. + (cxx_init): Use actual codes in stmt_codes initializer, not + cp_stmt_codes macro. Initialize statement_code_p directly, rather + than using INIT_STATEMENT_CODES. + +2005-05-09 Mark Mitchell + + * typeck.c (build_unary_op): Do not resort to address arithmetic + when taking the address of a COMPONENT_REF. + +2005-05-08 Kazu Hirata + + * class.c (vtbl_init_data_s): Change the type of fns to + VEC(tree,gc)*. + (build_vtbl_initializer, add_vcall_offset, add_vcall_offset): + Use VEC instead of VARRAY. + +2005-05-07 Richard Sandiford + + * mangle.c: Remove a reference to the MIPS -mint64 option. + +2005-05-07 Kazu Hirata + + * decl.c (wrapup_globals_for_namespace): Use VEC instead of + VARRAY. + * name-lookup.c (add_decl_to_level, begin_scope): Likewise. + * name-lookup.h (cp_binding_level): Change the type of + static_decls to VEC(tree,gc)*. + + * mangle.c (globals): Change the type of substitutions to + VEC(tree,gc)*. + (dump_substitution_candidates, add_substitution, + find_substitution, finish_mangling, init_mangle): Use VEC + instead of VARRAY. + +2005-05-06 Kazu Hirata + + * decl2.c (spew_debug): Remove. + + * decl2.c (ssdf_decls, start_static_storage_duration_function, + generate_ctor_or_dtor_function): Use VEC instead of VARRAY. + + * decl2.c (pending_statics, note_vague_linkage_var, + cp_finish_file): Use VEC instead of VARRAY. + (pending_statics_used): Remove. + +2005-05-05 Kazu Hirata + + * decl2.c (deferred_fns, note_vague_linkage_fn, + cp_finish_file): Use VEC instead of VARRAY. + +2005-05-05 Mark Mitchell + + PR c++/21352 + * pt.c (build_non_dependent_expr): Use is_overloaded_fn. + +2005-05-05 Kazu Hirata + + * pt.c: Fix a comment typo. + +2005-05-04 Kazu Hirata + + * cp-tree.h (language_function): Change the type of + x_local_names to VEC. + * decl.c (push_local_name): Adjust uses of local_names. + +2005-05-03 Kazu Hirata + + * friend.c, lex.c, mangle.c, repo.c: Update copyright. + +2005-05-02 Kazu Hirata + + * class.c (local_classes, init_class_processing): Use VEC + instead of VARRAY. + * cp-tree.h (local_classes): Likewise. + * mangle.c (discriminator_for_local_entity): Likewise. + * name-lookup.c (pushtag): Likewise. + + * class.c (current_lang_depth, push_lang_context, + pop_lang_context): Use VEC instead of VARRAY. + * cp-tree.h (saved_scope): Use VEC for lang_base instead of + VARRAY. + * name-lookup.c (push_to_top_level): Use VEC instead of + VARRAY. + +2005-05-02 Paolo Bonzini + + * semantics.c (finish_call_expr): Call resolve_overloaded_builtin + for BUILT_IN_MD built-ins. + +2005-05-02 Michael Matz + + PR c++/19542 + * cp-tree.h (cp_tree_index): Remove CPTI_NULL, to be defined in C + common frontend. + (null_node): Remove. + * lex.c (cxx_init): Move null_node initialisation to C common frontend. + +2005-04-25 Ian Lance Taylor + + * cp-tree.def: Add EXPR_STMT. + * cp-tree.h (cp_stmt_codes): Add EXPR_STMT. + (EXPR_STMT_EXPR): Define. + * cp-gimplify.c: Include "flags.h". + (gimplify_expr_stmt): New static function. + (cp_gimplify_expr): Handle EXPR_STMT. + * cxx-pretty-print.c (pp_cxx_statement): Use pp_cxx_expression + rather than pp_expression. + (pp_cxx_statement): Handle EXPR_STMT. + * dump.c (cp_dump_tree): Handle EXPR_STMT. + * lex.c (cxx_init): Don't use c_common_stmt_codes in stmt_codes + initializer. + +2005-04-25 Andrew Pinski + + PR C++/21188 + * rtti.c (ifnonnull): Cast the zero comparison operand + to the correct type. + +2005-04-24 Jakub Jelinek + + PR middle-end/20991 + * class.c: Include cgraph.h. + (cp_fold_obj_type_ref): Set node->local.vtable_method. + * Make-lang.in (cgraph.o): Depend on $(CGRAPH_H). + +2005-04-12 Markus F.X.J. Oberhumer + + * mangle.c (write_builtin_type): Handle integer types which are + not one of the shared integer type nodes and emit a "vendor + extended builtin type" with an encoding in the form of "u5int96". + +2005-04-24 Ian Lance Taylor + + * cp-tree.def (USING_STMT): Change class to tcc_statement. + (TRY_BLOCK, EH_SPEC_BLOCK, HANDLER, CLEANUP_STMT): Likewise. + (IF_STMT, FOR_STMT, WHILE_STMT, DO_STMT): Likewise. + (BREAK_STMT, CONTINUE_STMT, SWITCH_STMT): Likewise. + +2005-04-23 DJ Delorie + + * call.c, class.c, cvt.c, decl.c, decl2.c, except.c, friend.c, + init.c, lex.c, mangle.c, method.c, name-lookup.c, parser.c, + repo.c, rtti.c, tree.c, typeck.c, typeck2.c: Adjust warning() + callers. + +2005-04-22 Per Bothner + + * decl.c (make_rtl_for_nonlocal_decl): Don't try get_fileinfo if + input_filename is NULL, as it is for (say) __PRETTY_FUNCTION__. + +2005-04-22 Alexandre Oliva + + PR c++/21087 + * name-lookup.c (push_overloaded_decl): Do not overload with + non-duplicate anticipated built-in. + +2005-04-21 Kazu Hirata + + * cp-tree.h (THROW_NAME, AUTO_VTABLE_NAME, AUTO_TEMP_FORMAT, + VTABLE_BASE, VTABLE_NAME_PREFIX, STATIC_NAME_FORMAT): Remove. + +2005-04-21 Nathan Sidwell + + * cp-tree.h: Adjust for new VEC API. + Define VEC(tree_pair_s,gc). + (struct save_scope): Adjust. + (struct lang_type_class): Adjust. + (unemitted_tinfo_decls): Adjust. + * class.c (add_method, resort_type_method_vec, + finish_struct_methods, struct find_final_overrider_data, + dfs_find_final_overrider_pre, find_final_overrider, + get_vcall_index, warn_hidden, walk_subobject_offsets, + check_methods, fixup_inline_methods, end_of_class, + warn_about_ambiguous_bases, finish_struct, build_vtbl_initializer, + add_vcall_offset): Adjust. + * decl.c (xref_basetypes, finish_method): Adjust. + * decl2.c (check_classfn): Adjust. + * init.c (sort_mem_initializers, push_base_cleanups): Adjust. + * method.c (do_build_copy_constructor): Adjust. + * name-lookup.c (new_class_binding, store_binding, + store_bindings, store_class_bindings): Adjust. + * name-lookup.h: Define VEC(cxx_saved_binding,gc), + VEC(cp_class_binding,gc). + (struct cp_binding_level): Adjust. + * parser.c: Define VEC(cp_token_position,heap). + (struct cp_lexer): Adjust. + (cp_lexer_new_main, cp_lexer_new_from_tokens, cp_lexer_destroy, + cp_lexer_save_tokens): Adjust. + * pt.c (retrieve_specialization, + check_explicit_specialization): Adjust. + * rtti.c (unemitted_tinfo_decls): Adjust. + (init_rtti_processing, get_tinfo_decl, get_pseudo_ti_init, + get_pseudo_ti_desc): Adjust. + * search.c (dfs_access_in_type, lookup_conversion_operator, + lookup_fnfields_1, dfs_walk_once, dfs_walk_once_accessible, + dfs_get_pure_virtuals, lookup_conversions_r, binfo_for_vbase): Adjust. + * semantics.c: Define VEC(deferred_access,gc). + (push_deferring_access_checks): Adjust. + * typeck2.c (abstract_virtuals_error): Adjust. + +2005-04-20 Ian Lance Taylor + + * cp-tree.def: Add STMT_EXPR. + * cp-tree.h (STMT_EXPR_NO_SCOPE): Define. + (STMT_EXPR_STMT): Define. + * cxx-pretty-print.c (pp_cxx_primary_expression): Handle + STMT_EXPR. + (pp_cxx_expression): Likewise. + (pp_cxx_statement): Call pp_cxx_statement, not pp_statement. + * dump.c (cp_dump_tree): Handle STMT_EXPR. + +2005-04-18 Kazu Hirata + + * decl.c (expand_static_init): Call build2 and build3 instead + of build. + + * cp-tree.h (VPTR_NAME, VPTR_NAME_P): Remove. + +2005-04-17 Ian Lance Taylor + + * cp-tree.def: Add SIZEOF_EXPR, ARROW_EXPR and ALIGNOF_EXPR. + * cxx-pretty-print.c (pp_cxx_postfix_expression): Handle + ARROW_EXPR. + (pp_cxx_unary_expression): Handle SIZEOF_EXPR and ALIGNOF_EXPR. + (pp_cxx_expression): Handle ARROW_EXPR, SIZEOF_EXPR, and + ALIGNOF_EXPR. + * typeck.c (cxx_sizeof_or_alignof_type): Update call to + c_sizeof_or_alignof_type for change in parameter type. + +2005-04-16 Mark Mitchell + + PR c++/21025 + * typeck.c (cxx_sizeof_or_alignof_type): Check whether the type to + which sizeof/alignof is dependent, rather than just whether we are + processing_template_decl. + +2005-04-17 Kazu Hirata + + * cp-tree.h (LOOKUP_GLOBAL): Remove. + (LOOKUP_ONLYCONVERTING, DIRECT_BIND, LOOKUP_NO_CONVERSION, + LOOKUP_DESTRUCTOR, LOOKUP_NO_TEMP_BIND, LOOKUP_PREFER_TYPES, + LOOKUP_PREFER_NAMESPACES, LOOKUP_CONSTRUCTOR_CALLABLE): Adjust + their values. + +2005-04-15 Richard Henderson + + PR middle-end/14311 + * semantics.c (finish_call_expr): Call resolve_overloaded_builtin. + +2005-04-15 Kazu Hirata + + * cp-tree.h (lang_type_class): Remove redefined. Move + java_interface into where redefined was. Increment the width + of dummy. + (TYPE_REDEFINED): Remove. + +2005-04-14 Kazu Hirata + + * cp-tree.h (SET_TMPL_ARG, ENUM_TI_TEMPLATE, ENUM_TI_ARGS, + CLASSTYPE_TEMPLATE_LEVEL): Remove. + +2005-04-11 Mark Mitchell + + * decl2.c (determine_visibility): Don't use export_class_data. + (import_export_decl): Honor TARGET_CXX_CLASS_DATA_ALWAYS_WEAK and + TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY. + +2005-04-09 Kazu Hirata + + * cp-tree.h (cxx_alignof): Remove. + + * cp-tree.h (DECL_ARRAY_DELETE_OPERATOR_P): Remove. + + * cp-tree.h (EXCEPTION_CLEANUP_NAME, B_SET, B_CLR, B_TST, + CONV_STATIC_CAST): Remove. + + * pt.c (UNIFY_ALLOW_MAX_CORRECTION): Remove. + + * cp-tree.h (VF_BINFO_VALUE, VF_BASETYPE_VALUE): Remove. + + * cp-tree.h (cp_deprecated): Remove. + +2005-04-08 Ian Lance Taylor + + * cp-tree.def: Define FOR_STMT, WHILE_STMT, DO_STMT, BREAK_STMT, + CONTINUE_STMT, SWITCH_STMT. + * cp-tree.h (cp_stmt_codes): Add FOR_STMT, WHILE_STMT, DO_STMT, + BREAK_STMT, CONTINUE_STMT, SWITCH_STMT. + (WHILE_COND, WHILE_BODY): Define. + (DO_COND, DO_BODY): Define. + (FOR_INIT_STMT, FOR_COND, FOR_EXPR, FOR_BODY): Define. + (SWITCH_STMT_COND, SWITCH_STMT_BODY, SWITCH_STMT_TYPE): Define. + * cp-gimplify.c (enum bc_t): Define. + (struct cp_gimplify_ctx, ctxp): Define. + (push_context, pop_context): New static functions. + (begin_bc_block, finish_bc_block): New static functions. + (build_bc_goto): New static function. + (gimplify_cp_loop, gimplify_for_stmt): New static functions. + (gimplify_while_stmt, gimplify_do_stmt): Likewise. + (gimplify_switch_stmt): Likewise. + (cp_gimplify_expr): Handle FOR_STMT, WHILE_STMT, DO_STMT, + SWITCH_STMT, CONTINUE_STMT, BREAK_STMT. + (cp_genericize): Call push_context and pop_context. + * semantics.c (finish_break_stmt): Just call build_stmt + (BREAK_STMT) rather than build_break_stmt. + (finish_continue_stmt): Corresponding change. + * decl.c (pop_switch): Update call to c_do_switch_warnings for new + parameters. + * cxx-pretty-print.c (pp_cxx_statement): Handle SWITCH_STMT, + WHILE_STMT, DO_STMT, FOR_STMT, BREAK_STMT, CONTINUE_STMT. + * dump.c (cp_dump_tree): Likewise. + +2005-04-08 Mark Mitchell + + PR c++/20905 + * parser.c (cp_parser_type_specifier_seq): Add is_condition + parameter. + (cp_parser_new_type_id): Pass it. + (cp_parser_condition): Likewise. + (cp_parser_conversion_type_id): Likewise. + (cp_parser_type_id): Likewise. + (cp_parser_type_specifier_seq): In a condition, do not allow + invalid type-specifier combinations. + (cp_parser_exception_declaration): Adjust call to + cp_parser_type_specifier_seq. + + * cp-tree.def (TINST_LEVEL): Document TINST_IN_SYSTEM_HEADER_P. + * cp-tree.h (struct tinst_level): Add in_system_header_p. + (TINST_IN_SYSTEM_HEADER_P): New macro. + (make_tinst_level): Remove. + * pt.c (lookup_template_class): Preserve DECL_IN_SYSTEM_HEADER on + the instantiated class. + (push_tinst_level): Do not use make_tinst_level. Set + TINST_IN_SYSTEM_HEADER_P. + (pop_tinst_level): Likewise. + (instantiate_class_template): Set in_system_header. + (instantiate_pending_templates): Likewise. + * tree.c (make_tinst_level): Remove. + +2005-04-06 Joseph S. Myers + + * decl.c (start_decl): Apply pending #pragma weak regardless of + scope. + +2005-04-06 Mark Mitchell + + PR c++/20212 + * pt.c (regenerate_decl_from_template): Copy attributes for + parameters from the pattern to the instantiation. + +2005-04-05 Mark Mitchell + + PR c++/20734 + * cp-tree.def (OFFSET_REF): Correct comments. + * init.c (build_offset_ref): Remove misleading comment. + * typeck.c (build_unary_op): Handle pointer-to-member creation + here, rather than ... + (unary_complex_lvalue): ... here. + +2005-04-06 Jason Merrill + + PR c++/19312 + * tree.c (stabilize_init): Don't bother trying to stabilize + something with no side-effects. + +2005-04-05 Mark Mitchell + + PR c++/20763 + * decl.c (grokdeclarator): Correct attribute handling. + +2005-04-05 Mark Mitchell + + PR c++/19159 + * decl2.c (import_export_decl): Use non-COMDAT external linkage + for virtual tables, typeinfo, etc. that will be emitted in only + one translation unit on systems without weak symbols. + +2005-04-04 Mark Mitchell + + PR c++/20679 + * parser.c (cp_parser_template_name): Fix thinko. + +2005-04-04 Nathan Sidwell + + PR c++/20746 + * method.c (use_thunk): Protect covariant pointer return + adjustments from NULL pointers. + +2005-04-04 Jan Hubicka + + * decl2.c (finish_objects): Revert my previous patch. + (cp_finish_file): Likewise. + +2005-04-03 Kazu Hirata + + * pt.c: Fix comment typos. + +2005-04-03 Nathan Sidwell + + PR c++/20723 + * pt.c (more_specialized_fn): Member functions are unordered wrt + non-members. Conversion operators are unordered wrt other + functions. + +2005-04-01 Nathan Sidwell + + * call.c (add_template_candidates_real): Remove length parameter + from fn_type_unification call. + * class.c (resolve_address_of_overloaded_function): Likewise + * cp-tree.h (fn_type_unification): Remove length parameter. + * pt.c (get_bindings_overload): Remove. + (get_bindings_real): Rename to ... + (get_bindings): ... here. Remove length and strict + parameters. Change return type flag to boolean. Remove original + forwarding function. + (determine_specialization): Adjust get_bindings call. + (fn_type_unification): Remove length parameter. Adjust. + (type_unification_real): Remove length parameter. Adjust. + (resolve_overloaded_unification): Adjust get_bindings call. + (try_one_overload): Simplify confusing cascaded if control flow. + (unify): Remove length paramter from type_unification_real call. + (most_specialized_instantiation): Adjust get_bindings calls. + (most_specialized): Likewise. + +2005-03-31 Nathan Sidwell + + PR c++/19203, implement DR 214 + * call.c (joust): Use more_specialized_fn. + * cp-tree.h (DEDUCE_ORDER): Remove. + (more_specialized): Replace with ... + (more_specialized_fn): ... this. + * pt.c (maybe_adjust_types_for_deduction): Remove DEDUCE_ORDER + case. + (type_unification_real): Remove DEDUCE_ORDER case. + (more_specialized): Replace with ... + (more_specialized_fn): ... this. Implement DR 214. + (most_specialized_instantiation): Use get_bindings_real directly. + +2005-03-31 Gabriel Dos Reis + + PR c++/18644 + * call.c (build_new_op): Remove check for -Wsynth. + +2005-03-31 Jan Hubicka + + * decl2.c (finish_objects): Mark ctor as needed. + (cp_finish_file): Output variables only in nonunit-at-a-time. + +2005-03-29 Richard Henderson + + PR c/20519 + * decl.c (cp_complete_array_type): Rename from complete_array_type. + Use the new complete_array_type in c-common.c. Update all callers. + * cp-tree.h (cp_complete_array_type): Update to match. + +2005-03-24 Geoffrey Keating + + * typeck.c (build_static_cast_1): Allow scalar_cast between + any integral, floating, or enumeration type. + +2005-03-24 Steven Bosscher + + * typeck.c (comptypes): First determine if the types are compatible + from a target-independent point of view. Check target attributes + last. + + * class.c (build_base_path): + (build_vbase_offset_vtbl_entries): + (add_vcall_offset): Replace fold (buildN (...)) with fold_buildN. + * error.c (dump_expr): Likewise. + * init.c (build_zero_init, expand_cleanup_for_base, + build_vec_delete_1): Likewise. + * mangle.c (write_integer_cst): Likewise. + * method.c (thunk_adjust): Likewise. + * pt.c (convert_nontype_argument, tsubst, unify): Likewise. + * tree.c (cxx_print_statistics, array_type_nelts_total): Likewise. + * typeck.c (build_ptrmemfunc_access_expr, + (get_member_function_from_ptrfunc): Likewise. + +2005-03-23 Joseph S. Myers + + * cp-objcp-common.h (LANG_HOOKS_TRUTHVALUE_CONVERSION): Remove. + +2005-03-23 Joseph S. Myers + + * cp-tree.h (perform_integral_promotions): Remove. + (default_conversion): Add. + +2005-03-22 Mark Mitchell + + * parser.c (cp_parser_warn_min_max): New function. + (cp_parser_binary_expression): Use it. + (cp_parser_assignment_operator_opt): Likewise. + (cp_parser_operator): Likewise. + +2005-03-22 Volker Reichelt + + PR c++/19980 + * decl.c (start_preparsed_function): Robustify. + +2005-03-22 Volker Reichelt + + PR c++/20499 + * parser.c (cp_parser_class_head): Return NULL_TREE when + encountering a redefinition. + +2005-03-22 Nathan Sidwell + + PR c++/20465 + PR c++/20381 + * typeck.c (build_ptrmemfunc): Allow OFFSET_REF when processing a + template. + +2005-03-21 Paolo Carlini + + PR c++/20461 + PR c++/20536 + * init.c (emit_mem_initializers): Don't crash on undefined + types. + +2005-03-21 Paolo Carlini + + PR c++/20147 + * semantics.c (finish_stmt_expr_expr): Return immediately + if error_operand_p (expr). + +2005-03-21 Joseph S. Myers + + * cp-tree.h (lvalue_or_else, lvalue_p): New. + * typeck.c (lvalue_or_else): New. Call lvalue_error. + +2005-03-19 Kriang Lerdsuwanakij + + PR c++/20240 + * decl.c (decls_match): Compare context of VAR_DECL. + +2005-03-19 Kriang Lerdsuwanakij + + PR c++/20333 + * parser.c (cp_parser_postfix_expression) : + Check the return value of cp_parser_nested_name_specifier. + +2005-03-18 Dale Johannesen + + * cp/tree.c (cp_tree_equal): Handle SSA_NAME. + +2005-03-18 Paolo Carlini + + PR c++/20463 + * parser.c (cp_parser_diagnose_invalid_type_name): + Check TYPE_BINFO (current_class_type) before attempting + to emit inform messages. + +2005-03-17 Paolo Carlini + + PR c++/19966 + * cp-tree.h (grok_op_properties): Change return type to void. + * decl.c (grok_op_properties): Return early - don't check the + arity - in case of a static member or an operator that cannot + be non-member; tidy a bit. + +2005-03-17 Nathan Sidwell + + PR c++/20186 + * pt.c (contains_dependent_cast_p): Remove. + (fold_non_dependent_expr): Don't use it. + (value_dependent_expression_p): Use a switch statement. + reference_exprs can be dependent. + +2005-03-14 Kriang Lerdsuwanakij + + PR c++/4403 + PR c++/9783, DR433 + * name-lookup.c (pushtag): Skip template parameter scope when + scope is ts_global. Don't push tag into template parameter + scope. + * pt.c (instantiate_class_template): Reorder friend class + template substitution to handle non-dependent friend class + that hasn't been previously declared. + +2005-03-14 Kriang Lerdsuwanakij + + Friend class name lookup 5/n + PR c++/1016 + * cp-tree.h (pushtag): Adjust declaration. + * decl.c (lookup_and_check_tag): Call lookup_type_scope if + lookup_name fails. + (xref_tag): Adjust call to pushtag. Make hidden class visible. + (start_enum): Adjust call to pushtag. + * name-lookup.c (ambiguous_decl): Ignore hidden names. + (qualify_lookup): Change return type to bool. + (hidden_name_p): New function. + (lookup_namespace_name, unqualified_namespace_lookup, + lookup_name_real): Use it. + (lookup_type_scope): Update comments. + (maybe_process_template_type_declaration): Change parameter name + from globalize to is_friend. + (pushtag): Change globalize parameter of type int to tag_scope. + Hide name if introduced by friend declaration. + * name-lookup.h (hidden_name_p): Add declaration. + * parser.c (cp_parser_lookup_name): Don't deal with hidden name + here. + * pt.c (push_template_decl_real): Make hidden class template + visible. + (lookup_template_class, instantiate_class_template): Adjust call + to pushtag. + * semantics.c (begin_class_definition): Likewise. + * rtti.c (init_rtti_processing, build_dynamic_cast_1, + tinfo_base_init, emit_support_tinfos): Use ts_current instead of + ts_global. + +2005-03-13 Mark Mitchell + + PR c++/20157 + * pt.c (determine_specialization): Reject non-specializations. + +2005-03-11 Per Bothner + + * cp-tree.h (struct cp_declarator): New id_loc field. + * cp/parser.c (cp_lexer_get_preprocessor_token): Set cp_token's + location using c_lex_with_flags, instead of input_location. + (cp_parser_direct_declarator): Set declarator's id_loc from + cp_token's id_loc. + +2005-03-10 Jakub Jelinek + + PR c++/18384, c++/18327 + * decl.c (reshape_init_array): Use UHWI type for max_index_cst + and index. Convert max_index to size_type_node if it isn't + host_integerp (, 1). + +2005-03-09 Mark Mitchell + + PR c++/20208 + * pt.c (tsubst_decl): Apply array-to-pointer and + function-to-pointer conversions to function arguments. + (regenerate_decl_from_template): Likewise. + +2005-03-09 Paolo Carlini + + PR c++/16859 + * decl.c (complete_array_type): In pedantic mode, return + 3 for an empty initializer list as the initializer for an + array of unknown bound (8.5.1/4). + (maybe_deduce_size_from_array_init): Fix final test to use + the above. + +2005-03-08 Nathan Sidwell + + PR c++/20186 + * pt.c (contains_dependent_cast_p): New. + (fold_non_dependent_expr): Call it. + +2005-03-08 Mark Mitchell + + PR c++/20142 + * cp-tree.h (target_type): Remove. + * decl.c (layout_var_decl): Remove #if 0'd code. + (cp_finish_decl): Remove dead code. + * init.c (build_vec_init): When determining whether or not the + element type has an asignment operator, look through all array + dimensions. + * typeck.c (target_type): Remove. + +2005-03-07 Mark Mitchell + + * class.c (finish_struct_1): Do not warn about non-virtual + destructors in Java classes. + +2005-03-05 Kriang Lerdsuwanakij + + PR c++/19311 + * init.c (build_offset_ref): Don't build non-dependent SCOPE_REF. + * pt.c (build_non_dependent_expr): Don't build NON_DEPENDENT_EXPR + for OFFSET_TYPE. + * typeck.c (build_x_unary_op): Don't build non-dependent SCOPE_REF. + Also set PTRMEM_OK_P for NON_DEPENDENT_EXPR. + (build_unary_op): Handle building ADDR_EXPR of OFFSET_REF inside + template. + +2005-03-02 Alexandre Oliva + + * name-lookup.c (push_overloaded_decl): Don't error if the new + decl matches the old one. + * decl.c (redeclaration_error_message): Likewise. + +2005-03-01 Per Bothner + + * decl.c (finish_function): Use SET_EXPR_LOCATION instead of + unavailable annotate_with_file_line, if USE_MAPPED_LOCATION. + +2005-03-01 Nathan Sidwell + + PR c++/20232 + * class.c (update_vtable_entry_for_fn): Don't crash on invalid + covariancy. + + * cp-tree.g (THUNK_TARGET): Expand comment. + * method.c (use_thunk): Make sure we also use the target, if that + is a thunk. + +2005-02-27 Jakub Jelinek + + PR c++/20206 + * decl.c (cxx_comdat_group): Put thunks for + TARGET_USE_LOCAL_THUNK_ALIAS_P (function) functions into the same + comdat group as the thunk target. + +2005-02-24 Volker Reichelt + + * call.c, class.c, cp-tree.h, decl2.c, error.c, init.c, mangle.c, + parser.c: Fix comment typo(s). + +2005-02-24 Jakub Jelinek + + PR c++/20175 + * decl.c (reshape_init): Don't warn about missing braces if STRING_CST + initializes a char/wchar_t array. + +2005-02-23 Mark Mitchell + + PR c++/19878 + * decl.c (grokvardecl): Set DECL_INTERFACE_KNOWN for declarations + with internal linkage. + +2005-02-23 Alexandre Oliva + + * decl.c (grokvardecl): Don't exempt anonymous types from having + linkage for variables that have linkage other than "C". + +2005-02-23 Kazu Hirata + + * cp-objcp-common.h, error.c: Update copyright. + +2005-02-22 Mark Mitchell + + PR c++/20073 + * decl.c (start_decl_1): Don't clear TREE_READONLY. + (cp_finish_decl): Likewise. + (complete_vars): Call cp_apply_type_quals_to_decl. + * typeck.c (cp_apply_type_quals): Avoid setting TREE_READONLY in + cases where that's not valid. + + PR c++/19991 + * init.c (integral_constant_value): Iterate if the value of a decl + is itself a constant. + + PR c++/20152 + * parser.c (cp_parser_class_head): Check for redefintions here. + * semantics.c (begin_class_definition): Not here. + + PR c++/20153 + * decl2.c (build_anon_union_vars): Add type parameter. + (finish_anon_union): Pass it. + + PR c++/20148 + * error.c (dump_expr): Do not print the body of a BIND_EXPR. + Handle STATEMENT_LIST. + + PR c++/19883 + * parser.c (cp_parser_direct_declarator): Always complain about + non-constant array bounds when in a function scope. + * semantics.c (finish_id_expression): Do not mark dependent names + as non-constant. + +2005-02-21 Douglas Gregor + + PR c++/19076 + PR c++/6628 + * cp-tree.h (cp_apply_type_quals_to_decl): Declared. + * decl.c (grokdeclarator): Pedwarn about qualifying a function + type. + Add qualifiers when declaring a typedef of a function type. + Member function pointers pick up the qualifiers of the typedef + used to declare them. + Don't complain about creating cv-qualified function types. + Complain about qualified function typedefs that are used to + declare non-static member functions or free functions. + Use cp_apply_type_quals_to_decl. + (start_preparsed_function): Use cp_apply_type_quals_to_decl. + (grokclassfn): Use cp_apply_type_quals_to_decl. + * error.c (dump_type_suffix): Print qualifiers for function + types. + * pt.c (tsubst_decl): Use cp_apply_type_quals_to_decl. + (tsubst): When substituting a function type into a member + pointer type, pass along the qualifiers. + (unify): Unify member pointers to member function pointers. + * tree.c (cp_build_qualified_type_real): Function types may be + qualified. This includes restrict qualifiers. + * typeck.c (cp_apply_type_quals_to_decl): New function to replace + use of c_apply_type_quals_to_decl. Drops qualifiers that are being + added to function types. + +2005-02-20 Zack Weinberg + + PR 18785 + * cp-objcp-common.h (LANG_HOOKS_TO_TARGET_CHARSET): Set to + c_common_to_target_charset. Delete bogus comment. + +2005-02-18 Richard Henderson + + PR libstdc++/10606 + * except.c (do_get_exception_ptr): New. + (expand_start_catch_block): Use it. + +2005-02-19 Jakub Jelinek + + * decl.c (start_decl_1): Only check TYPE_NEEDS_CONSTRUCTING + if type is not error_mark_node. + +2005-01-20 Giovanni Bajo + + PR c++/19508 + * decl2.c (grokfield): Do not apply attributes to template parameters + as they are ignored by tsubst anyway. + +2005-02-18 Jakub Jelinek + + PR c++/19813 + * decl.c (start_decl_1): Clear TREE_READONLY flag if + its type has TYPE_NEEDS_CONSTRUCTING. + (complete_vars): Likewise. + +2005-02-17 Alexandre Oliva + + PR c++/20028 + * class.c (finish_struct): Initialize TYPE_SIZE_UNIT of a + template along with TYPE_SIZE. + + PR c++/20022 + * semantics.c (perform_deferred_access_checks): Use + get_deferred_access_checks to get the top of the stack. + +2005-02-15 Alexandre Oliva + + PR c++/17788 + * class.c (add_implicitly_declared_members, check_field_decl) + (check_field_decls, check_bases): Remove arguments, tests and + assignments of cant_have_default_ctor-related variables. + +2005-02-15 Alexandre Oliva + + * decl2.c (mark_used): Set the source location of the used decl to + the current input location here... + * method.c (synthesize_method): ... not here. Set input_location + from the decl instead. + +2005-02-14 Nathan Sidwell + + PR c++/19608 + * parser.c (cp_parser_late_parsing_for_member): Use + current_function_decl as scope to push to and from. + + PR c++/19884 + * pt.c (check_explicit_specialization): Make sure namespace + binding lookup found an overloaded function. + (lookup_template_function): Just assert FNS is an overloaded + function. + + PR c++/19895 + * decl.c (grokdeclarator): Check for error mark node in ptrmem + construction. + +2005-02-14 Alexandre Oliva + + PR c++/17816 + * decl.c (redeclaration_error_message): Report redefinition of + pure virtual function. + +2005-02-14 Nathan Sidwell + + PR c++/19891 + * class.c (build_simple_base_path): Build the component_ref + directly. + (update_vtable_entry_for_fn): Walk the covariant's binfo chain + rather than using lookup_base. + * search.c (dfs_walk_once): Add non-recursive assert check. + * typeck.c (build_class_member_access_expr): It is possible for + the member type to be both const and volatile. + +2005-02-12 Kriang Lerdsuwanakij + + PR c++/14479 + PR c++/19487 + * pt.c (maybe_check_template_type): Remove. + * cp-tree.h (maybe_check_template_type): Remove prototype. + * name-lookup.c (maybe_process_template_type_declaration): Don't + use maybe_check_template_type. + +2005-02-11 Richard Henderson + + PR c++/19632 + * pt.c (get_mostly_instantiated_function_type): Save and restore + flag_access_control instead of push/pop_access_scope. + +2005-02-10 Mark Mitchell + + PR c++/19755 + * decl.c (reshape_init): Issue warnings about missing braces. + +2005-02-11 Kazu Hirata + + * cp-tree.def, except.c, ptree.c: Update copyright. + +2005-02-09 Mark Mitchell + + PR c++/19811 + * call.c (build_op_delete_call): Check COMPLETE_TYPE_P before + attempting name lookup. + + * parser.c (cp_parser_unqualified_id): Initialize type_decl. + + PR c++/19787 + * call.c (initialize_reference): Robustify. + + PR ++/19732 + * decl.c (grokdeclarator): Check for invalid use of destructor + names. + + PR c++/19762 + * parser.c (cp_parser_unqualified_id): Avoid creating destructor + names with invalid types. + + PR c++/19826 + * parser.c (cp_parser_direct_declarator): Allow type-dependent + expressions as array bounds. + + PR c++/19739 + * parser.c (cp_parser_attributes_list): Allow empty lists. + +2005-02-08 Mark Mitchell + + PR c++/19733 + * class.c (add_method): Don't set TYPE_HAS_DESTRUCTOR. + (check_bases): Give warnings about a base class with a + non-virtual destructor, even if it is implicit. + (finish_struct_bits): Don't copy TYPE_HAS_DESTRUCTOR. + (maybe_warn_about_overly_private_class): Don't use + TYPE_HAS_DESTRUCTOR. + (finish_struct_methods): Don't set TYPE_HAS_DESTRUCTOR. + (check_for_override): Give it external linkage. + (add_implicitly_declared_members): Generate destructors lazily. + (check_field_decls): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR, not + TYPE_HAS_DESTRUCTOR. + (check_bases_and_members): Call check_methods before + check_field_decls. + (check_bases_and_members): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR, not + TYPE_HAS_DESTRUCTOR. + (finish_struct_1): Do not use TYPE_HAS_DESTRUCTOR. + * cp-tree.def (PSEUDO_DTOR_EXPR): Document. + * cp-tree.h (TYPE_HAS_DESTRUCTOR): Remove. + (lang_type_class): Add lazy_destructor. + (CLASSTYPE_LAZY_DESTRUCTOR): New macro. + (CLASSTYPE_DESTRUCTORS): Robustify. + (TYPE_HAS_DESTRUCTOR): Remove. + (check_for_override): Declare. + (build_vbase_delete): Remove. + * cvt.c (convert_to_void): Issue errors about pseudo-destructor + expressions. + * decl.c (cxx_maybe_build_cleanup): Remove dead code. + * except.c (dtor_nothrow): Lazily create destructors if necessary. + (build_throw): Use TYPE_HAS_NONTRIVIAL_DESTRUCTOR. + * init.c (build_delete): Lazily create destructors, if necessary. + (build_vbase_delete): Remove. + * method.c (locate_dtor): Simplify. + (implicitly_declare_fn): Add support for destructors. + * parser.c (cp_parser_lookup_name): Lazily create destructors, if + necessary. + * pt.c (check_explicit_specialization): Don't use + TYPE_HAS_DESTRUCTOR. + (instantiate_class_template): Likewise. + * ptree.c (cxx_print_type): Don't print TYPE_HAS_DESTRUCTOR. + * rtti.c (emit_support_tinfos): Robustify. + * search.c (lookup_fnfields_1): Lazily create destructors. + * typeck.c (build_class_member_access_expr): Remove + PSEUDO_DTOR_EXPR handling. + (lookup_destructor): Likewise. + +2005-02-08 Kazu Hirata + + * cxx-pretty-print.c, cxx-pretty-print.h, decl.h: Update + copyright. + +2005-02-07 Mark Mitchell + + * parser.c (cp_lexer_start_debugging): Avoid arithmetic operations + on boolean variables. + (cp_lexer_stop_debugging): Likewise. + +2005-02-03 Giovanni Bajo + + PR c++/17401 + * parser.c (cp_parser_pure_specifier): Emit a specific error + message with an invalid pure specifier. + * decl2.c (grok_function_init): Remove. + (grokfield): An initializer for a method is a always a pure + specifier. + +2005-02-02 Matt Austern + + PR c++/19628 + * cp-tree.h (builtin_valid_in_constant_expr_p): Declare. + * parser.c (cp_parser_postfix_expression): Accept function call in + constant expression if builtin_valid_in_constant_expr_p is true + for that function. + * pt.c (value_dependent_expression_p): Handle CALL_EXPRs properly. + * semantics.c (finish_id_expression): Accept function call in constant + expression if builtin_valid_in_constant_expr_p is true for that + function. + * tree.c (builtin_valid_in_constant_expr_p): New. + +2005-02-02 Volker Reichelt + + PR c++/17413 + * pt.c (check_instantiated_args): Improve error message. + Fix logic when to print its second part. + +2005-02-02 Volker Reichelt + + * cp-tree.h (complete_type_or_else): Remove macro. + (complete_type_or_diagnostic): Rename to complete_type_or_else + and remove last argument. + * typeck.c (complete_type_or_diagnostic): Rename to + complete_type_or_else and remove last argument. + +2005-02-02 Volker Reichelt + + * cp-tree.h (commonparms): Remove prototype. + (convert_arguments): Likewise. + (PFN_FROM_PTRMEMFUNC): Remove. + * typeck.c (commonparms): Make static. + (convert_arguments): Add prototype. Make static. + (PFN_FROM_PTRMEMFUNC): Replace by pfn_from_ptrmemfunc. + +2005-01-31 Mark Mitchell + + * parser.c (cp_parser_primary_expression): Don't complain about + floating-point literals in integral constant expressions when + !pedantic. + +2005-02-01 Alexandre Oliva + + * parser.c (cp_parser_template_id): Revert comment patch too. + + PR c++/18757 + PR c++/19366 + PR c++/19499 + * parser.c (cp_parser_template_id): Revert 2004-12-09's patch. + Issue an error when creating the template id. + * pt.c (fn_type_unification): Return early if the explicit + template arg list is an error_mark_node. + +2005-01-31 Mark Mitchell + + * decl.c (build_enumerator): Do not issue duplicate error messages + about invalid enumeration constants. + * parser.c (cp_parser_non_integral_constant_expression): Always + set parser->non_integral_constant_expression_p. + (cp_parser_primary_expression): Add cast_p parameter. Issue + errors about invalid uses of floating-point literals in + cast-expressions. + (cp_parser_postfix_expression): Add cast_p parameter. + (cp_parser_open_square_expression): Pass it. + (cp_parser_parenthesized_expression_list): Add cast_p parameter. + (cp_parser_unary_expression): Likewise. + (cp_parser_new_placement): Pass it. + (cp_parser_direct_new_declarator): Likewise. + (cp_parser_new_initializer): Likewise. + (cp_parser_cast_expression): Add cast_p parameter. + (cp_parser_binary_expression): Likewise. + (cp_parser_question_colon_clause): Likewise. + (cp_parser_assignment_expression): Likewise. + (cp_parser_expression): Likewise. + (cp_parser_constant_expression): If an integral constant + expression is invalid, return error_mark_node. + (cp_parser_expression_statement): Pass cast_p. + (cp_parser_condition): Likewise. + (cp_parser_iteration_statement): Likewise. + (cp_parser_jump_statement): Likewise. + (cp_parser_mem_initializer): Likewise. + (cp_parser_template_argument): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_initializer): Likewise. + (cp_parser_throw_expression): Likewise. + (cp_parser_attribute_list): Likewise. + (cp_parser_simple_cast_expression): Likewise. + (cp_parser_functional_cast): Likewise. + (cp_parser_late_parsing_default_args): Likewise. + (cp_parser_sizeof_operand): Save/restore + non_integral_constant_expression_p. + +2005-01-31 Mike Stump + + * parser.c (cp_lexer_new_main): Get the first token, first, before + doing anything. + +2005-01-31 Mark Mitchell + + * decl.c (start_decl): Add missing parentheses. + +2005-01-30 Mark Mitchell + + PR c++/19555 + * cp-tree.h (DECL_USE_TEMPLATE): Expand documentation. + * decl.c (duplicate_decls): Do not discard + DECL_IMPLICIT_INSTANTIATION when merging declarations. + (start_decl): Do not SET_DECL_TEMPLATE_SPECIALIZATION for + variables that do not have DECL_USE_TEMPLATE. + + PR c++/19395 + * decl.c (grokdeclarator): Refactor code so that qualified names + are never allowed as the declarator in a typedef. + + PR c++/19367 + * name-lookup.c (do_nonmember_using_decl): Avoid overloading + builtin declarations. + + PR c++/19457 + * call.c (convert_like_real): Inline call to + dubious_conversion_warnings here. + * cp-tree.h (dubious_conversion_warnings): Remove. + * semantics.c (finish_unary_op_expr): Copy INTEGER_CSTs before + setting TREE_NEGATED_INT. + * typeck.c (dubious_conversion_warnings): Remove. + + PR c++/19349 + * name-lookup.c (pushdecl_namespace_level): Avoid accessing free'd + memory. + +2005-01-28 Mark Mitchell + + PR c++/19253 + * parser.c (cp_parser_diagnose_invalid_type_name): Commit to + tentative parses. + + PR c++/19667 + * pt.c (redeclare_class_template): Robustify. + +2005-01-27 Steven Bosscher + + * decl.c (finish_case_label): Use SWITCH_STMT accessor macros + instead of SWITCH_EXPR ones. + * pt.c (tsubst_expr): Likewise. + * semantics.c (begin_switch_stmt, finish_switch_cond, + finish_switch_stmt): Likewise. + +2005-01-26 J"orn Rennecke + + PR c++/18370 + * parser.c (cp_parser_initializer_clause): Initialize *non_constant_p. + +2005-01-25 Andrew Pinski + + * class.c (abort_fndecl_addr): New variable. + (build_vtbl_initializer): If we have a pure virtual function + share the abort function's address. + Include gt-cp-class.h at the end. + * config-lang.in (gtfiles): Add cp/class.c. + +2005-01-25 Volker Reichelt + + * cxx-pretty-print.c (pp_cxx_statement): Add prototype. Make static. + (pp_cxx_function_definition): Make static. + * cxx-pretty-print.h (pp_cxx_statement): Remove prototype. + (pp_cxx_function_definition): Likewise. + +2005-01-25 Volker Reichelt + + * name-lookup.c (print_binding_level): Make static. + (constructor_name_full): Make static inline. + (current_decl_namespace): Make static. + * name-lookup.h (constructor_name_full): Remove prototype. + (print_binding_level): Likewise. + (current_decl_namespace): Likewise. + +2005-01-25 Volker Reichelt + + * decl.h (debug_bindings_indentation): Remove. + +2005-01-23 Kazu Hirata + + * typeck.c: Fix a comment typo. + +2005-01-21 Giovanni Bajo + + PR c++/19208 + * pt.c (fold_decl_constant_value): Always call fold_non_dependent_expr + at least once. + (tsubst): Use fold_decl_constant_value in place of a bare call to + integral_constant_value. + +2005-01-20 Kazu Hirata + + * typeck.c (more_qualified_p): Remove. + * cp-tree.h: Remove the corresponding prototype. + +2005-01-19 Matt Austern + + * typeck.c (comptypes): Handle return code from objc_comptypes + correctly. + +2005-01-19 Kazu Hirata + + * cp-tree.h, name-lookup.h: Remove unused prototypes. + +2005-01-19 Kriang Lerdsuwanakij + + PR c++/19375 + * semantics.c (finish_id_expression): Disable access checking for + already lookuped FIELD_DECL. + +2005-01-18 Kazu Hirata + + * decl.c (delete_block): Remove. + * cp-tree.h: Remove the corresponding prototype. + + * decl.c (vtable_decl_p, vtype_decl_p, walk_globals_data, + walk_vtables_r, walk_vtables, walk_globals_r, walk_globals): + Remove. + * cp-tree.h: Remove the corresponding prototypes. + + * tree.c (count_functions, bound_pmf_p, cp_is_overload_p, + cp_update_decl_after_saving, name_p): Remove. + * cp-tree.h: Remove the corresponding prototypes. + +2005-01-18 Andrew Pinski + + PR c/19472 + * semantics.c (finish_asm_stmt): Strip nops off + input memory operands. + +2005-01-18 Kazu Hirata + + * Make-lang.in, call.c, cvt.c, init.c, rtti.c, tree.c, + typeck2.c: Update copyright. + +2005-01-16 Kazu Hirata + + * class.c (get_enclosing_class): Remove. + * cp-tree.h: Remove the corresponding prototypes. + + * cvt.c (convert_lvalue): Remove. + * cp-tree.h: Remove the corresponding prototype. + + * pt.c (tinst_for_decl): Remove. + * cp-tree.h: Remove the corresponding prototypes. + + * tree.c (hash_chainon): Remove. + * cp-tree.h: Remove the corresponding prototypes. + +2005-01-15 Jakub Jelinek + + PR c++/19263 + * typeck2.c (split_nonconstant_init_1) : Put a copy + of CONSTRUCTOR's node into MODIFY_EXPR, as the original is modified. + +2005-01-12 Kaveh R. Ghazi + + * Make-lang.in (cp-warn): Don't append $(WERROR). + +2005-01-10 Kazu Hirata + + * cp-tree.h: Fix a comment typo. + +2005-01-07 Nathan Sidwell + + PR c++/19298 + * pt.c (tsubst_qualified_id): Call convert_from_reference. + +2005-01-06 Mark Mitchell + + PR c++/19244 + * class.c (add_implicitly_declared_members): Remove dead code. + * decl.c (grokfndecl): Add sfk parameter. Use it do set + DECL_CONSTRUCTOR_P. + (grokdeclarator): Adjust calls to grokfndecl. + * method.c (implicitly_declare_fn): Improve documentation. + * parser.c (cp_parser_direct_declarator): Do not consider a + function to be a constructor if the containing class was + originally anonymous. + +2005-01-06 Kriang Lerdsuwanakij + + PR c++/17154 + * search.c (lookup_field_1): Handle using declaration in + class template partial specialization. + +2005-01-06 Kriang Lerdsuwanakij + + PR c++/19258 + * pt.c (push_access_scope): Handle friend defined in class. + (pop_access_scope): Likewise. + +2005-01-06 Nathan Sidwell + + PR c++/19270 + * pt.c (tsubst_copy) : Handle separately. + (tsubst_copy_and_build) : Remove obsolete + array-new handling code. Use build_x_binary_op. + +2005-01-05 Nathan Sidwell + + PR c++/19030 + * cp-tree.h (start_decl): Take pointer to pushed scope, not bool. + * name-lookup.h (push_scope): Return pushed scope, not flag. + * name-lookup.c (push_scope): Return scope that should be popped, + not a flag. + * decl.c (start_decl): Adjust. + (grokfndecl): Adjust scope push and pop. + * decl2.c (check_classfn): Likewise. + * parser.c (cp_parser_condition, cp_parser_conversion_function_id, + cp_parser_init_declarator, cp_parser_direct_declarator, + cp_parser_class_specifier, cp_parser_class_head, + cp_parser_lookup_name, + cp_parser_constructor_declarator_p): Likewise. + * pt.c (instantiate_class_template, + resolve_typename_type): Likewise. + +2005-01-03 Volker Reichelt + + PR c++/14136 + * parser.c (cp_parser_unqualified_id): Do not issue error message + for typedef-name as destructor declarator when performing an + uncommitted tentative parse. + +2005-01-01 Steven Bosscher + + PR middle-end/17544 + * decl.c (finish_function): Fix comment. Annotate the compiler + generated return with the current file name and line 0. + + +Copyright (C) 2005 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2006 b/gcc/cp/ChangeLog-2006 new file mode 100644 index 000000000..09df1ef21 --- /dev/null +++ b/gcc/cp/ChangeLog-2006 @@ -0,0 +1,3502 @@ +2006-12-31 Simon Martin + + PR c++/29731 + * parser.c (cp_parser_primary_expression): Return error_mark_node when + a statement-expression is found outside of a function body. + +2006-12-28 Kazu Hirata + + * cp-tree.h (TYPE_NAMESPACE_SCOPE_P, TYPE_FUNCTION_SCOPE_P): + Remove. + + * decl2.c: Fix a comment typo. + +2006-12-21 Andrew Pinski + + PR C++/30225 + * decl.c (cxx_builtin_function): Only copy the decl if adding + it to the std namespace. + +2006-12-21 Andrew Pinski + + PR C++/30168 + * optimize.c (update_cloned_parm): Copy DECL_GIMPLE_REG_P also. + +2006-12-22 Kazu Hirata + + * decl.c: Fix a coment typo. + +2006-12-18 Ian Lance Taylor + + * decl.c (start_preparsed_function): Add support for + -Wmissing-declarations. + +2006-12-16 Simon Martin + + PR c++/29475 + * cp-tree.h (struct deferred_access_check): New structure to represent a + deferred access check. It replaces the previous representation as a tree. + (get_deferred_access_checks): Return a vector of struct + deferred_access_check instead of a tree list. + (perform_access_checks): Take a vector of struct deferred_access_check + instead of a tree list. + * semantics.c (struct deferred_access): Store the deferred access checks + as a vector of struct deferred_access_check instead of a tree list. + (push_deferring_access_checks): Handle the change in struct + deferred_access. + (get_deferred_access_checks): Likewise. + (pop_to_parent_deferring_access_checks): Likewise. + (perform_or_defer_access_check): Likewise. + (perform_access_checks): Take a vector of struct deferred_access_check + instead of a tree list. + * parser.c (struct tree_check): New structure to store various data + associated with a CPP_NESTED_NAME_SPECIFIER or CPP_TEMPLATE_ID token. + (struct cp_token): Changed the value field to be a union with a pointer to + a struct tree_check for CPP_NESTED_NAME_SPECIFIER or CPP_TEMPLATE_ID + tokens and a tree field for all other tokens. + (eof_token): Adjusted due to the change in struct cp_token. + (cp_lexer_get_preprocessor_token): Likewise. + (cp_lexer_purge_token): Likewise. + (cp_lexer_purge_tokens_after): Likewise. + (cp_lexer_print_token): Likewise. + (cp_parser_error): Likewise. + (cp_parser_identifier): Likewise. + (cp_parser_string_literal): Likewise. + (cp_parser_primary_expression): Likewise. + (cp_parser_unqualified_id): Likewise. + (cp_parser_parenthesized_expression_list): Likewise. + (cp_parser_storage_class_specifier_opt): Likewise. + (cp_parser_function_specifier_opt): Likewise. + (cp_parser_type_specifier): Likewise. + (cp_parser_simple_type_specifier): Likewise. + (cp_parser_initializer_list): Likewise. + (cp_parser_member_specification_opt): Likewise. + (cp_parser_attribute_list): Likewise. + (cp_parser_objc_expression): Likewise. + (cp_parser_objc_protocol_qualifiers): Likewise. + (cp_parser_objc_selector): Likewise. + (cp_parser_objc_declaration): Likewise. + (cp_parser_objc_statement): Likewise. + (cp_parser_omp_clause_name): Likewise. + (cp_parser_omp_clause_default): Likewise. + (cp_parser_omp_clause_schedule): Likewise. + (cp_parser_omp_parallel): Likewise. + (cp_parser_initial_pragma): Likewise. + (pragma_lex): Likewise. + (cp_parser_pre_parsed_nested_name_specifier): Likewise. + (cp_parser_nested_name_specifier_opt): Likewise. + Use cp_token::u::tree_check_value to save the token's value, the + associated deferred checks and its qualifying scope. + (cp_parser_template_id): Likewise. + (cp_parser_template_declaration_after_export): Adjusted the call to + get_deferred_access_checks. + (cp_parser_init_declarator): Take the access checks as a vector of struct + deferred_access_check instead of a tree list. + (cp_parser_single_declaration): Likewise. + (cp_parser_perform_template_parameter_access_checks): Likewise. + (cp_parser_simple_declaration): Adjusted the call to + cp_parser_init_declarator. + (cp_parser_explicit_specialization): Adjusted the call to + cp_parser_single_declaration. + +2006-12-13 Ian Lance Taylor + + PR c++/19564 + PR c++/19756 + * parser.c (cp_parser_expression_stack_entry): Add field + lhs_type. + (cp_parser_binary_expression): Track tree code of left hand side + of expression. Use it when calling build_x_binary_op. + (cp_parser_selection_statement): Add if_p parameter. Change all + callers. Warn about ambiguous else. + (cp_parser_statement): Add if_p parameter. Change all callers. + (cp_parser_implicitly_scoped_statement): Likewise. + * typeck.c (build_x_binary_op): Add parameters arg1_code and + arg2_code. Change all callers. Call warn_about_parentheses. + * cp-tree.h (build_x_binary_op): Update declaration. + +2006-12-12 Manuel Lopez-Ibanez + + * decl.c (build_enumerator): Update error message to match C + front-end. + +2006-12-11 Jan Hubicka + + * decl2.c (var_finalized_p): Update for renamed varpool functions. + +2006-12-09 Zack Weinberg + + * parser.c (yydebug, enum pragma_omp_clause): Delete. + +2006-12-07 Mark Mitchell + + PR c++/29732 + * cp-tree.h (DECL_USE_TEMPLATE): Mention partial specializations. + (explicit_class_specialization_p): Declare. + * pt.c (explicit_class_specialization_p): New function. + * parser.c (cp_parser_init_declarator): Check correct number of + template parameters for in-class function definitions. + (cp_parser_check_declrator_template_parameters): Stop looking for + template classes when we find an explicit specialization. + +2006-12-07 Lee Millward + + PR c++/29980 + * cp_parser_elaborated_type_specifier: Check + the return value of check_elaborated_type_specifier. + +2006-12-06 Mark Mitchell + + PR c++/29730 + * parser.c (cp_parser_init_declarator): Reject initialization of + functions. + +2006-12-05 Mark Mitchell + + PR c++/29729 + * decl2.c (check_member_template): Move check for member + templates in local classes to ... + * parser.c (cp_parser_template_declaration_after_export): + ... here. + + PR c++/29728 + * decl.c (check_array_designated_initializer): New function. + (maybe_deduce_size_from_array_init): Use it. + (reshape_init_array): Likewise. + +2006-12-05 Aldy Hernandez + + Merge from gimple-tuples-branch. + + 2006-10-05 Aldy Hernandez + + * cp-gimplify.c (cp_gimplify_expr): Adjust for GIMPLE_MODIFY_STMT. + (cxx_omp_clause_apply_fn): Adjust for GIMPLE_MODIFY_STMT. + (cxx_omp_clause_copy_ctor): Same. + (cxx_omp_clause_assign_op): Same. + + 2006-09-28 Aldy Hernandez + + * cp-tree.h (union lang_tree_node): Gimple statements do not + have a TREE_CHAIN. + (TREE_INDIRECT_USING): Look in base. + +2006-12-04 Jan Hubicka + + * cp-objcp-common.c (cp_expr_size): Return NULL in the case + size is undefined. + +2006-12-04 Mark Mitchell + + PR c++/29733 + * pt.c (tsubst_decl): Disallow variables of function type. + + PR c++/29632 + * call.c (add_builtin_candidate): Do not permit NULL pointer + constants to be compared with template parameters. + +2006-12-04 Eric Botcazou + + * pt.c (for_each_template_parm_r) : New case. + Call for_each_template_parm on TYPE_MIN_VALUE and TYPE_MAX_VALUE. + +2006-12-03 Richard Henderson + Andrew Pinski + + PR C++/14329 + * error.c (cp_printer) <'D'>: Handle DECL_DEBUG_EXPR. + +2006-12-02 Andrew Pinski + + PR C++/30033 + * decl.c (cp_tree_node_structure): Handle STATIC_ASSERT. + +2006-12-02 Kazu Hirata + + * name-lookup.c: Follow spelling conventions. + +2006-12-01 Geoffrey Keating + + * decl.c (poplevel): Check DECL_INITIAL invariant. + (duplicate_decls): Preserve DECL_INITIAL when eliminating + a new definition in favour of an old declaration. + (start_preparsed_function): Define and document value of + DECL_INITIAL before and after routine. + (finish_function): Check DECL_INITIAL invariant. + * parser.c + (cp_parser_function_definition_from_specifiers_and_declarator): + Skip duplicate function definitions. + +2006-12-01 Volker Reichelt + + PR c++/30022 + * typeck.c (type_after_usual_arithmetic_conversions): + Fix assertion for vector types. + (build_binary_op): Use temporary for inner type of vector types. + +2006-12-01 Ryan Mansfield + + PR c++/29066 + * typeck.c (build_binary_op): Fix pointer to member function + comparison for ptrmemfunc_vbit_in_delta targets. + +2006-12-01 Dirk Mueller + + PR c++/18313 + * decl.c (grokdeclarator): Warn for type qualifiers on return + type for non-dependent types. + * pt.c (tsubst_function_type): Warn for type qualifiers on + return type for dependent types. + +2006-11-30 Geoffrey Keating + + * rtti.c (get_tinfo_decl): Handle return value from + pushdecl_top_level_and_finish. + +2006-11-29 Lee Millward + + PR c++/29022 + * parser.c (cp_parser_class_head): Move processing + of any base classes to... + (cp_parser_class_specifier) ...here. Take an extra + tree* parameter for any base classes. Only process + them if the opening brace was found. + +2006-11-28 Jakub Jelinek + + PR c++/29735 + * decl.c (grokfndecl): Check main's type after applying + attributes, not before. + +2006-11-27 Mark Mitchell + + * class.c (build_vcall_offset_vtbl_entries): Do not add vcall + entries for a primary construction virtual table. + +2006-11-26 Mark Mitchell + + PR c++/29886 + * parser.c (cp_parser): Add in_function_body. + (cp_parser_new): Initialize it. + (cp_parser_primary_expression): Use parser->in_function_body + instead of at_function_scope_p. + (cp_parser_asm_definition): Likewise. + (cp_parser_direct_declarator): Likewise. + (cp_parser_class_specifier): Clear parser->in_function_body. + (cp_parser_constructor_declarator_p): Use parser->in_function_body + instead of at_function_scope_p. + (cp_parser_function_body_after_declarator): Set + parser->in_function_body. + +2006-11-21 Douglas Gregor + + * cp-tree.def (STATIC_ASSERT): New. + * cp-objcp-common.c (cp_tree_size): Handle STATIC_ASSERT. + * error.c (dump_decl): Handle STATIC_ASSERT. + * cp-tree.h (STATIC_ASSERT_CONDITION): New. + (STATIC_ASSERT_MESSAGE): New. + (STATIC_ASSERT_SOURCE_LOCATION): New. + (struct tree_static_assert): New. + (enum cp_tree_node_structure_enum): Add TS_CP_STATIC_ASSERT. + (union lang_tree_node): Add static_assertion. + (finish_static_assert): Declare. + * cxx-pretty-print.c (pp_cxx_statement): Handle STATIC_ASSERT. + (pp_cxx_declaration): Handle STATIC_ASSERT. + * pt.c (instantiate_class_template): Handle + STATIC_ASSERT members. + (tsubst_expr): Handle STATIC_ASSERT statements. + * semantics.c (finish_static_assert): New. + * lex.c (D_CPP0X): New. + (reswords): Add static_assert keyword. + (init_reswords): If not flag_cpp0x, mask out C++0x keywords. + * parser.c (cp_parser_block_declaration): Parse static + assertions. + (cp_parser_static_assert): New. + (cp_parser_member_declaration): Parse static assertions. + +2006-11-21 Jakub Jelinek + + PR c++/29570 + * decl.c (cp_finish_decl): Check for value dependent brace enclosed + scalar initializer. + + PR c++/29734 + * cp-tree.h (WANT_VECTOR): Define. + (WANT_ARITH): Add WANT_VECTOR. + * cvt.c (build_expr_type_conversion): Handle vector types. + * typeck.c (build_unary_op): Add WANT_VECTOR to + build_expr_type_conversion flags. + +2006-11-20 Simon Martin + + PR c++/29475 + * cp-tree.h (enforce_access, perform_or_defer_access_check): Added an + extra argument that represents the declaration to use to print + potential error messages. + * init.c (build_offset_ref): Adjusted the call to + perform_or_defer_access_check. + * class.c (alter_access, resolve_address_of_overloaded_function): + Likewise. + * decl.c (make_typename_type, make_unbound_class_template): Likewise. + * search.c (lookup_member): Likewise. + * friend.c (add_friend): Likewise. + * parser.c (cp_parser_template_id, + cp_parser_pre_parsed_nested_name_specifier): Likewise. + * semantics.c (finish_non_static_data_member, + check_accessibility_of_qualified_id, finish_id_expression): Likewise. + (pop_to_parent_deferring_access_checks, perform_access_checks, + perform_or_defer_access_check): Adjusted the call to enforce_access. + * call.c (enforce_access): Use the new extra argument to build the + error message. + (build_op_delete_call): Adjusted the call to + perform_or_defer_access_check. + (build_over_call): Likewise. + +2006-11-16 Dirk Mueller + + * name-lookup.c (begin_scope): Use GGC_CNEW instead of + GGC_NEW and memset. + +2006-11-13 Roger Sayle + + * rtti.c (get_pseudo_ti_init): Ensure that the offset field of the + base type info initializer has the correct type. + +2006-11-13 Mark Mitchell + + PR c++/29518 + * pt.c (coerce_template_parms): Do not skip_evaluation while + substituting template arguments. + +2006-11-11 Richard Guenther + + * typeck.c (build_unary_op): Remove handling of FIX_CEIL_EXPR, + FIX_FLOOR_EXPR and FIX_ROUND_EXPR. + +2006-11-03 Roger Sayle + + * call.c (build_op_delete_call): Test user-visible type against + size_type_node, instead of against the internal type, sizetype. + * class.c (type_requires_array_cookie): Likewise. + * mangle.c (write_builtin_type) : Remove special + handling of TYPE_IS_SIZETYPE. + * typeck.c (type_after_usual_arithmetic_conversions): Remove + special case handling of TYPE_IS_SIZETYPE. + (comptypes): Likewise. + +2006-11-01 Danny Smith + + * decl.c (get_atexit_node): Reference atexit, not __cxa_exit. + if targetm.cxx.use_atexit_for cxa_atexit. + (start_cleanup_fn): Likewise. + (register_dtor_fn): Likewise. + +2006-09-25 Geoffrey Keating + + * decl2.c (cp_write_global_declarations): Rename from + cp_finish_file. + * cp-lang.c (finish_file): Don't call cp_finish_file. + * cp-tree.h (cp_write_global_declarations): Rename from + cp_finish_file. + * cp-objcp-common.h (LANG_HOOKS_WRITE_GLOBALS): Define to + cp_write_global_declarations. + +2006-10-31 Geoffrey Keating + + * name-lookup.c (get_anonymous_namespace_name): New. + (push_namespace_with_attribs): Use get_anonymous_namespace_name. + * decl2.c (start_objects): Update for rename of + get_file_function_name_long. + +2006-10-30 Dirk Mueller + + PR c++/28704 + * decl.c (grokdeclarator): Duplicate diagnostic message + for easier translation. + * decl.c (grokdeclarator): Fix line-wrapping. + +2006-10-30 Dirk Mueller + + PR c++/6321 + * decl.c (grokfndecl): Use check_main_parameter_types. + +2006-10-30 Dirk Mueller + + PR c++/28669 + * decl.c (grokfndecl): Duplicate warning message for + easier translation. + +2006-10-30 Dirk Mueller + + * typeck.c (build_unary_op): Fix indenting. Use G_(). + +2006-10-29 Dirk Mueller + + PR c++/29089 + * typeck.c (build_unary_op): Duplicate warning message + for easier translation. + +2006-10-29 Dirk Mueller + + PR c++/16307 + * typeck.c (build_array_ref): Warn for char subscriptions + on pointers. + +2006-10-29 Kazu Hirata + + * decl.c: Fix a comment typo. + +2006-10-28 Andrew Pinski + + PR C++/29295 + * typeck.c (build_unary_op): Use same_type_p when comparing to + boolean type. + +2006-10-29 Dirk Mueller + + PR c++/29033 + * typeck.c (build_binary_op): Duplicate warning message + for better translation. + +2006-10-23 Rafael Ávila de EspĂ­ndola + + * decl.c (builtin_function_1): Move common code to + add_builtin_function. + (builtin_function): Rename to cxx_builtin_function. + Change the signature. + * call.c: Include langhooks.h. + (build_java_interface_fn_ref): Replace calls to + builtin_function with add_builtin_function. + * Make-lang.in (cp/call.o): Depend on langhooks.h. + * cp-objcp-common.h (LANG_HOOKS_BUILTIN_FUNCTION): Define as + cxx_builtin_function. + * cp-tree.h (builtin_function): Rename to cxx_builtin_function. + Change the signature. + +2006-10-22 Nathan Sidwell + + PR c++/20647 + * rtti.c (tinfo_base_init): The type info string is always global. + +2006-10-20 Lee Millward + Mark Mitchell + + PR c++/28053 + * decl2.c (grokbitfield): Detect invalid non-integral + types earlier when possible. + +2006-10-18 Mark Shinwell + + PR c++/26884 + * typeck2.c (digest_init): Raise error upon attempts to + initialize arrays with variables. + +2006-10-17 Lee Millward + + PR c++/27952 + * cp-tree.h (xref_basetypes): Return bool instead of void. + * decl.c (xref_basetypes): Adjust definition. Return false + if the class bases are invalid. + * parser.c (cp_parser_class_head): Check the return value + from xref_basetypes. + +2006-10-17 Mark Mitchell + + PR c++/28261 + * parser.c (cp_lexer_next_token_is_decl_specifier_keyword): Add + comment. + + PR c++/28261 + * parser.c (cp_lexer_next_token_is_decl_specifier_keyword): New + function. + (cp_parser_constructor_declarator_p): Use it. + (cp_parser_check_type_definition): Return a value indicating + whether or not the definition is valid. + (cp_parser_enum_specifier): Skip invalid enum definitions. + +2006-10-17 Mark Mitchell + + PR c++/29039 + * typeck2.c (build_functional_cast): Don't zero-initialize + non-PODs; instead, call their constructors. + * method.c (synthesize_method): Always build mem-initializers, if + we're synthesizing the default constructor. + +2006-10-17 Mark Mitchell + + PR c++/27270 + * decl.c (reshape_init_class): Move check for designated + to ... + * parser.c (cp_parser_initializer_list): ... here. + * pt.c (tsubst_copy_and_build): Use finish_compound_literal. + +2006-10-16 Mark Mitchell + + PR c++/27270 + * typeck2.c (process_init_constructor_array): Reword comment. + * pt.c (tsubst_copy_and_built): Call reshape_init before calling + digest_init. + + PR c++/29408 + * parser.c (cp_parser_using_declaration): Stop parsing when + something goes wrong with an access declaration. + + PR c++/29435 + * typeck.c (cxx_sizeof_or_alignof_type): Complete non-dependent + types when their sizes are required. Refine test for VLAs. + + PR c++/28211 + * parser.c (cp_parser_template_argument): Don't consider "&var" a + possible constant-expression. + * pt.c (convert_nontype_argument): Refine handling of arguments of + pointer type. + +2006-10-13 Mark Mitchell + + PR c++/28506 + * parser.c (function_declarator_p): New function. + (cp_parser_init_declarator): Use it. + (cp_parser_member_declaration): Likewise. + +2006-10-12 Mark Mitchell + + PR c++/29318 + * rtti.c (get_tinfo_decl): Refuse to create type info objects for + variably modified types. + +2006-10-12 Lee Millward + + PR c++/27961 + * decl.c (start_decl): Return error_mark_node if a + function is initialized like a variable. + (check_var_type): If a variable of field is declared void, + set the type to error_mark_node. + (grokdeclarator): Check the return type of check_var_type. + * class.c (finish_struct_1): Robustify. + +2006-10-11 Mark Mitchell + + PR c++/29175 + * decl.c (check_initializer): Issue errors about trying to + initialize arrays whose elements have variable size. + +2006-10-11 Lee Millward + + PR c++/29024 + * cp-tree (struct cp_decl_specifier_seq): Rename to + conflicting_specifiers_p + * parser.c (cp_parser_set_storage_class): Set + conflicting_specifiers_p for the input decl specifier + if a typedef specifier is present. Rename uses of + multiple_specifiers_p to conflicting_specifiers_p. + (cp_parser_decl_specifier_seq) : If a storage + class specifier has already been set for this declaration, + set conflicting_specifiers_p to true on the decl_specs. + * decl.c (grokdeclarator): Rename uses of + multiple_specifiers_p to conflicting_specifiers_p. + +2006-10-10 Brooks Moses + + * Make-lang.in: Added "c++.pdf" target support. + +2006-10-10 Richard Guenther + + PR rtl-optimization/29323 + * decl.c (finish_function): Set TREE_NOTHROW only for + functions that bind local. + +2006-10-09 Richard Henderson + + Revert emutls patch. + +2006-10-04 Richard Henderson + Jakub Jelinek + + * decl.c (grokvardecl): Don't error if !have_tls. + (grokdeclarator): Likewise. + * parser.c (cp_parser_omp_threadprivate): Likewise. + +2006-10-03 Mark Mitchell + + PR c++/29020 + * friend.c (do_friend): Improve comments; add assertion. + * parser.c (cp_parser_nested_name_specifier_opt): Resolve + typenames for qualified names used in declarations, even when + caching qualified name lookup. + + PR c++/29138 + * decl2.c (grokfield): Don't handle access declarations here. + * parser.c (cp_parser_using_declaration): Handle access + declarations too. + (cp_parser_block_declaration): Adjust calls to + cp_parser_using_declaration. + (cp_parser_member_declaration): Likewise. Use + cp_parser_using_declaration to look for access_declarations. + +2006-10-03 Volker Reichelt + + PR c++/29291 + * init.c (build_new): Check for invalid init. + +2006-10-02 Mark Mitchell + + PR c++/29226 + * typeck.c (cxx_sizeof_or_alignof_type): Tidy. In templates, do + not try to actually evaluate sizeof for a VLA type. + +2006-10-01 Mark Mitchell + + PR c++/29105 + * pt.c (tsubst_baselink): Substituteinto the qualifying scope. + * semantics.c (baselink_for_fns): Build a baselink, even when + processing a template. + + PR c++/29080 + * parser.c (cp_parser_postfix_dot_deref_expression): Use + BASELINK_ACCESS_BINFO as the qualifying scope when calling + adjust_result_of_qualified_name_lookup. + +2006-09-25 Lee Millward + + PR c++/27329 + PR c++/26938 + * cp-tree.h (redeclare_class_template): Adjust declaration + to return bool instead of void. + * pt.c (redeclare_class_template): Update definition. + Return false on error. + * decl.c (xref_tag): Return error_mark_node if + redeclare_class_template returned false. + + PR c++/27667 + * cp-tree.h (begin_specialization): Return bool + instead of void. + * pt.c (check_specialization_scope): Likwise. + Adjust comment. Return false if a specialization + isn't permitted in the current scope. + (begin_specialization): Use the return value of + check_specialization_scope. + * parser.c (cp_parser_explicit_specialization): If + begin_specialization returned false, skip the rest + of the specialization. + +2006-09-21 Mark Mitchell + + PR c++/29016 + * typeck.c (build_unary_op): Don't form an ADDR_EXPR around a + BASELINK. + +2006-09-21 Lee Millward + + PR c++/28861 + * decl.c (shadow_tag): Return error_mark_node + if maybe_process_partial_specialization failed. + + PR c++/28303 + * decl.c (grokdeclarator): Return error_mark_node on + declaration with two or more data types. + +2006-09-20 Danny Smith + + PR target/27650 + * class.c (check_for_override): Remove dllimport from virtual + methods. + +2006-09-18 Steven Bosscher + + PR c++/29087 + * parser.c (cp_parser_labeled_statement): Return nothing. Do + not take in_statement_expr and in_compound as arguments. Rename + to cp_parser_label_for_labeled_statement. Parse only the label, + not the statement. + (cp_parser_statement): Parse the statement of a labeled-statement + from here, using tail recursion. + +2006-09-14 Andrew Pinski + + PR C++/29002 + * init.c (build_zero_init): If we have an error mark node for + the array size, return. + +2006-09-10 Mark Mitchell + + PR c++/28991 + * cp-objcp-common.c (cxx_staticp): New function. + * cp-objcp-common.h (LANG_HOOOKS_STATICP): Use it. + * cp-tree.h (cxx_staticp): New function. + +2006-09-09 Jason Merrill + + PR c++/28996 + * cvt.c (convert_to_void): Strip COMPONENT_REF to functions. + +2006-09-08 Volker Reichelt + + PR c++/28858 + * parser.c (cp_parser_skip_until_found): Rename to + cp_parser_skip_to_end_of_template_parameter_list. Remove last two + parameters. Track levels of '< ... >'. Stop at '{', '}', or ';'. + Reorganize. Adjust comment. + (cp_parser_template_declaration_after_export): Adjust call. + (cp_parser_enclosed_template_argument_list): Likewise. + +2006-09-07 Andrew Pinski + + PR C++/28906 + * init.c (build_new_1): Build a distinct type copy + for the array type that was returned from + build_cplus_array_type. + +2006-09-07 Jason Merrill + + PR c++/27371 + * cvt.c (convert_to_void): Enable previous change. + + PR c++/26957 + * method.c (use_thunk): Clear DECL_HAS_VALUE_EXPR_P on copied + parms. + +2006-09-07 Simon Martin + + PR c++/28284 + * pt.c (fold_non_dependent_expr): Make sure expr is not + dereferenced if it is NULL. + +2006-09-06 Zak Kipling + + PR c++/26195 + * decl.c (make_rtl_for_nonlocal_decl), + (start_preparsed_function): Don't use lbasename on + input_filename when calling get_fileinfo. + * semantics.c (begin_class_definition): Likewise. + * lex.c (cxx_make_type): Likewise. + (handle_pragma_interface): Call get_fileinfo on input_filename, + not on the parameter to the directive. + +2006-09-06 Mark Mitchell + + PR c++/28903 + * pt.c (tsubst): Use fold_non_dependent_expr to fold array + dimensions. + + PR c++/28886 + * pt.c (unify): Avoid unnecessary calls to fold_build2 for array + dimensions. + +2006-09-06 Jason Merrill + + PR c++/27371 + * cvt.c (convert_to_void): Strip useless TARGET_EXPR. + * cp-tree.h (TARGET_EXPR_IMPLICIT_P): New macro. + * tree.c (build_cplus_new): Set it. + + PR c++/26696 + * cvt.c (convert_to_void): Replace a subexpression with no side + effects with void_zero_node. + * tree.c (is_overloaded_fn): Look through COMPONENT_REF. + (get_first_fn): Ditto. + * decl.c (grokdeclarator): No need to look through COMPONENT_REF. + +2006-09-05 Jason Merrill + + PR c++/26571 + * parser.c (cp_parser_diagnose_invalid_type_name): Handle the case + where the name is a type used incorrectly. + + PR c++/26671 + * typeck.c (maybe_warn_about_returning_address_of_local): Look + through COMPONENT_REF and ARRAY_REF. + + PR c++/26102 + * name-lookup.c (do_class_using_decl): Try to find the base even + if bases_dependent_p. + * pt.c (type_dependent_expression_p): A USING_DECL is dependent. + + PR c++/19809 + * pt.c (tsubst_friend_function): Set DECL_INITIAL before pushdecl. + +2006-09-04 Nathan Sidwell + + PR 23287 Revert my 2006-09-01 patch. + * parser.c: Reverted. + * pt.c: Reverted. + +2006-09-02 Lee Millward + + PR c++/27670 + PR c++/27493 + PR c++/27494 + PR c++/27397 + * parser.c (cp_parser_template_parameter_list): Add + invalid template parameters to the parameter list as + error_mark_node. + +2006-09-02 Jakub Jelinek + + PR c++/28878 + * except.c (build_throw): Only set current_function_returns_abnormally + if cfun is not NULL. + + PR c++/26917 + * repo.c (repo_file): Remove. + (open_repo_file, reopen_repo_file_for_write): Return fopened + FILE * instead of setting global repo_file variable. + (init_repo): Adjust caller. + (finish_repo): Likewise. Return instead of goto out before + reopen_repo_file_for_write has been called. + +2006-09-01 Nathan Sidwell + + PR c++/28705 + * semantics.c (finish_call_expr): Add assert. + * name-lookup.c (lookup_arg_dependent): Check we found an overload + or an object. + + PR c++/23287 + * parser.c (cp_parser_id_expression): Add member_p + argument. Update all callers. + (cp_parser_unqualified_id): Likewise. Lookup a destructor name in + the object's scope, if valid. + (cp_parser_global_scope_opt): Add object_scope_valid_p. Update + callers. + (cp_parser_postfix_dot_deref_expression): Set object_scope. + * pt.c (tsubst_copy_and_build): Lookup dependent dtor name here. + +2006-08-30 Jason Merrill + + PR c++/26670 + * class.c (check_field_decls): Don't unset TYPE_PACKED until all + the fields have been processed. + +2006-08-29 Andrew Pinski + + PR C++/28349 + * call.c (build_x_va_arg): Remove the reference type + from the type before creating the pointer type. + +2006-08-29 J"orn Rennecke + + PR c++/28139 + * except.c (expand_start_catch_block): Use correct types for bitwise + copy. + +2006-08-28 Jason Merrill + + PR c++/26670 + * class.c (check_field_decls): Unset TYPE_PACKED (t) if one of the + fields can't be packed. + + PR c++/26577 + * cvt.c (convert_to_void): Don't automatically load from volatiles + of TREE_ADDRESSABLE type. + +2006-08-28 Volker Reichelt + + PR c++/28860 + * cp-tree.h (maybe_process_partial_specialization): Return + tree instead of void. + * parser.c (cp_parser_class_head): Use return value of + maybe_process_partial_specialization. + * pt.c (maybe_process_partial_specialization): Return error_mark_node + for broken specializations, TYPE otherwise. Check for template + template parameters. + +2006-08-27 Mark Mitchell + + PR c++/28058 + * pt.c (register_specialization): Return error_mark_node for + specialization-after-instantiation. + * decl2.c (mark_used): Mark the main function used when one of its + clones is used. + +2006-08-27 Lee Millward + + PR c++/26573 + * class.c (check_field_decls): Don't issue error about + local classes containing static data members. + +2006-08-26 Joseph S. Myers + + PR c++/24009 + * parser.c (struct cp_token): Add input_file_stack_index. + (eof_token): Update. + (cp_lexer_get_preprocessor_token): Save input_file_stack_tick. + (cp_lexer_set_source_position_from_token): Restore input file + stack. + +2006-08-26 Lee Millward + + PR c++/28736 + PR c++/28737 + PR c++/28738 + * pt.c (process_template_parm): Store invalid template + parameters as a TREE_LIST with a TREE_VALUE of error_mark_node. + (push_inline_template_parms_recursive): Check for template + parameters having a TREE_VALUE of error_mark_node rather than + check the parameter itself. + (mangle_class_name_for_template): Likewise. + (comp_template_parms): When comparing the individual template + parameters, return 1 if either is error_mark_node. + (current_template_args): Robustify. + (redeclare_class_template): Likewise. + +2006-08-26 Mark Mitchell + + PR c++/28588 + * class.c (resolve_address_of_overloaded_function): Add + access_path parameter. Perform access checks. + (instantiate_type): Adjust call to + resolve_address_of_overloaded_function. Remove unnecessary code. + * tree.c (is_overloaded_fn): Document. Return 2 when there are + acutally multiple functions. + (really_overloaded_fn): Use is_overloaded_fn. + * mangle.c (write_expression): Handle BASELINKs. + * cp-tree.h (really_overloaded_fn): Return bool. + (baselink_for_fns): Declare. + * search.c (lookup_member): Check access for single static + functions here. + * pt.c (convert_nontype_argument_function): Handle BASELINKs. + (tsubst_copy_and_build): Generate BASELINKs for template-ids. + * semantics.c (finish_call_expr): Use baselink_for_fns. + (baselink_for_fns): New function. + (finish_id_expression): Use it. + * parser.c (cp_parser_template_argument): Don't strip BASELINKs. + + PR c++/28595 + * pt.c (tsubst): Issue errors about attempts to create VLAs at + template-instantiation time. + +2006-08-25 Volker Reichelt + + PR c++/28853 + * typeck2.c (cxx_incomplete_type_diagnostic): Handle template + template parameters. Improve error message for template type + parameters. + + PR c++/28852 + * cp-tree.h (grok_op_properties): Return bool instead of void. + * decl.c (grokfndecl): Discard invalid operator declarations. + (copy_fn_p): Revert change for PR 27547. + (grok_op_properties): Return error status (true on success). + * pt.c (tsubst_decl): Discard invalid operator declarations. + +2006-08-25 Mark Mitchell + + PR c++/28056 + * decl.c (grokdeclarator): Disallow declarations with qualified + names in local scopes. + +2006-08-25 Nathan Sidwell + + PR c++/27787 + * decl.c (make_typename_type): Only try and resolve it when + context is not dependent. Refactor. + * decl2.c (check_classfn): Push to class scope before looking for + the function. + +2006-08-24 Danny Smith + + PR driver/28528 + * g++spec.c (lang_specific_driver): Always check if we need to + swallow a space-separated arg to '-x'. + * lang-specs.h: Don't create ouput files for '-xc++-header' + if -fsyntax-only. + +2006-08-23 Jason Merrill + + PR c++/27714 + * pt.c (push_template_decl_real): A friend template with class + scope isn't primary. + +2006-08-23 Benjamin Smedberg + + PR c++/28687 + * rtti.c (build_dynamic_cast, build_dynamic_cast_1): + Move -fno-rtti check to be more specific. + +2006-08-22 Jason Merrill + + PR c++/23372 + * call.c (build_over_call): Don't make a copy here if build_call + will make one too. + +2006-08-22 Andrew Pinski + + PR C++/28450 + * cp/init.c (build_zero_init): Handle VECTOR_TYPE and + COMPLEX_TYPEs. + +2006-08-22 Simon Martin + + PR c++/28420 + * parser.c (cp_parser_postfix_expression): Make sure that the + saved value for parser->type_definition_forbidden_message is + restored before returning to avoid an invalid free(). + +2006-08-22 Jason Merrill + + PR c++/28659 + * typeck.c (merge_types): If either of the types have the right + attributes, return that one. + + * tree.c (cp_build_type_attribute_variant): Make sure we aren't + doing this to class types. + * typeck.c (original_type): Deal with type quals properly. + +2006-08-21 Jason Merrill + + PR c++/27115 + * semantics.c (finish_stmt_expr_expr): Don't try to voidify here, + just leave the expression as it is. + (finish_stmt_expr): If the statement-expression has class type, + wrap it in a TARGET_EXPR. + * cp-gimplify.c (cp_gimplify_init_expr): Don't bother with + CLEANUP_POINT_EXPR. + * except.c (build_throw): Give the CLEANUP_POINT_EXPR void type. + +2006-08-21 Lee Millward + + PR c++/26269 + * decl.c (duplicate_decls): Return early if either + newdecl or olddecl is error_mark_node. + + PR c++/28505 + * decl.c (grokdeclarator): Return early after + issuing diagnostic about an incomplete type. + + PR c++/28741 + * tree.c (decl_anon_ns_mem_p): Robustify. + * decl2.c (determine_visibility): Likewise. + +2006-08-20 Mark Mitchell + + PR c++/28341 + * tree.c (cast_valid_in_integral_constant_expression_p): New + function. + * cp-tree.h (tsubst_copy_and_build): Adjust prototype. + * pt.c (tsubst_expr): Add integral_constant_expression_p + parameter. + (fold_non_dependent_expr): Adjust callers of + tsubst_{expr,copy_and_build}. + (tsubst_friend_function): Likewise. + (tsubst_template_arg): Likewise. + (tsubst_default_argument): Likewise. + (tsubst_decl): Likewise. + (tsubst): Likewise. + (tsubst_omp_clasuses): Likewise. + (regenerate_decl_fromp_template): Likewise. + (instantiate_decl): Likewise. + (tsubst_initializer_list): Likewise. + (tsubst_enum): Likewise. + (tsubst_expr): Use RECUR throughout. + (tsubst_copy_and_build): Change definition of RECUR. Do not allow + invalid casts in integral constant expressions. + * parser.c (cp_parser_postfix_expression): Use + cast_valid_in_integral_constant_expression_p. + (cp_parser_cast_expression): Likewise. + (cp_parser_functional_cast): Likewise. + + PR c++/28346 + * pt.c (tsubst_qualified_id): Do not strip references from + OFFSET_REFs. + +2006-08-17 Volker Reichelt + + PR c++/28606 + * parser.c (cp_parser_diagnose_invalid_type_name): Handle BIT_NOT_EXPR. + Fix formatting. + (cp_parser_parse_and_diagnose_invalid_type_name): Tighten condition + for valid type-names. + (cp_parser_unqualified_id): Fix error handling for destructors. + + PR c++/28710 + * decl.c (xref_tag): Improve error message. Return early on error. + + PR c++/28711 + * pt.c (tsubst_copy_and_build) : Robustify. + +2006-08-17 Paolo Bonzini + + PR c++/28573 + * semantics.c (finish_offsetof): Add new argument to fold_offsetof. + +2006-08-16 Andrew Pinski + + PR c++/28302 + * typeck.c (build_unary_op ): Don't call + perform_integral_promotions for non integral type. + +2006-08-16 Jason Merrill + + PR c++/28385 + * pt.c (tsubst) [TEMPLATE_TYPE_PARM]: Ignore quals from template + if arg is a function. + +2006-08-16 Volker Reichelt + + PR c++/28593 + * init.c (build_new): Return early on invalid placement. + +2006-08-15 Lee Millward + + PR c++/28594 + * pt.c (process_template_parm): Robustify. + +2006-08-14 Steve Ellcey + + PR c++/28288 + PR c++/14556 + * operators.def: Remove , ?= operators. + * parser.c: Remove CPP_MIN, CPP_MAX, CPP_MIN_EQ, and CPP_MAX_EQ. + (cp_parser_warn_min_max): Remove. + +2006-08-11 Jason Merrill + + PR c++/28559 + * parser.c (cp_parser_elaborated_type_specifier): Also ignore + attributes applied to a TYPENAME_TYPE. + +2006-08-09 Lee Millward + + PR c++/28637 + * pt.c (coerce_template_parms): Copy across the + invalid template arguments to the new template inner arguments. + (retrieve_specialization): Robustify. + + PR c++/28638 + * pt.c (coerce_template_template_parms): Robustify. + + PR c++/28639 + * error.c (dump_template_parms): Robustify. + + PR c++/28640 + * pt.c (redeclare_class_template): Robustify. + + PR c++/28641 + * pt.c (type_unification_real): Robustify. + +2006-08-03 Lee Millward + + PR c++/28347 + * decl.c (start_decl): Return error_mark_node if a + diagnostic was issed for an invalid typedef initialization. + +2006-08-03 Volker Reichelt + + PR c++/27508 + * parser.c (cp_parser_unqualified_id): Check for invalid scopes + when parsing destructor names. + + PR c++/28274 + * decl.c (duplicate_decls): Call check_default_args here. + (start_preparsed_function): Do not call check_default_args. + * name-lookup.c (pushdecl_maybe_friend): Only call + check_default_args if duplicate_decls got bypassed. + +2006-08-02 Richard Guenther + + PR c++/28479 + Revert + 2006-07-05 Richard Guenther + Andrew Pinski + + PR c++/27084 + * cp-objcp-common.c (cxx_types_compatible_p): Ignore + top level qualifiers for pointer type comparisons. + +2006-08-02 Mark Mitchell + + PR c++/28557 + * pt.c (tsubst_baselink): Substitute into BASELINK_OPTYPE. + +2006-07-31 Mark Mitchell + + PR c++/28523 + * tree.c (stabilize_expr): Tweak documentation. Add assertion. + (stabilize_call): Tweak documentation. + (stabilize_init): Only call stabilize_call for calls. + +2006-08-01 Steve Ellcey + + PR c++/28432 + * decl2.c (check_classfn): Remove early return. + * search.c (lookup_member): Return NULL with bad type. + +2006-08-01 Steve Ellcey + + PR c++/28256 + * decl.c (check_initializer): Check for 1 initializer on scalar types. + +2006-08-01 Daniel Jacobowitz + + PR debug/23336 + * pt.c (tsubst_copy_and_build): Mark used enum types. + * semantics.c (finish_id_expression): Likewise. + +2006-07-31 Volker Reichelt + + PR c++/6634 + * decl.c (grokdeclarator): Check whether "long" or "short" was + specified for non-integral types. + +2006-07-28 Volker Reichelt + + * Make-lang.in: Use $(HEADER_H) instead of header.h in dependencies. + +2006-07-28 Lee Millward + + PR c++/27668 + PR c++/27962 + * pt.c (process_template_parm) Store invalid template + parameters as error_mark_node in the paramater list. + (push_inline_template_parms_recursive): Handle invalid + template parameters. + (comp_template_parms): Likewise. + (check_default_tmpl_arg): Likewise. + (coerce_template_template_parms): Likewise. + (mangle_class_name_for_template): Likewise. + (tsubst_template_parms): Likewise. + * error.c (dump_template_argument_list): Likewise. + +2006-07-28 Kazu Hirata + + * cp-tree.h: Fix a comment typo. + +2006-07-24 Volker Reichelt + + PR c++/27572 + * decl.c (grokdeclarator): Return error_mark_node after invalid + typedef. + +2006-07-23 Daniel Jacobowitz + + PR c++/28460 + * decl.c (grokvardecl): Use FROB_CONTEXT. + * pt.c (register_specialization): Likewise. + +2006-07-23 Mark Mitchell + + PR c++/28025 + * cp-tree.h (LOOKUP_HIDDEN): New macro. Reformat comments. + * name-lookup.c (unqualified_namespace_lookup): There is no way to + have a hidden name in non-namespace scopes. + * pt.c (tsubst_friend_class): Look for hidden names. + * decl.c (lookup_and_check_tag): Fix typo in comment. + + * semantics.c (finish_compound_literal): Fix typo in comment. + +2006-07-21 Jason Merrill + + * decl2.c (determine_visibility): Don't propagate visibility from + type to decl. + (constrain_class_visibility): Don't warn in system headers. + Don't warn about pointer fields. + +2006-07-20 Mike Stump + + * decl2.c (determine_visibility_from_class): Don't use hidden + visibility for explicit instantiations. + +2006-07-21 Volker Reichelt + + PR c++/28250 + * pt.c (tsubst_expr): Only apply DECL_TEMPLATE_INSTANTIATED to + valid decls. Cleanup. + + PR c++/28363 + * semantics.c (check_template_template_default_arg): Simplify + error handling. + +2006-07-20 Jason Merrill + + PR c++/28407 + * decl.c (grokvardecl): Set DECL_THIS_STATIC on file-scope + const variables with implicit internal linkage. + * tree.c (decl_linkage): Only return lk_external if it's set. + + PR c++/28409 + * decl2.c (constrain_visibility): Ignore the anonymous namespace + for extern "C" decls. + (VISIBILITY_STATIC): Rename to VISIBILITY_ANON. + + * decl2.c (constrain_visibility): Remove specified and reason + parameters. Don't touch decls that already have explicit visibility. + (determine_visibility): Do copy DECL_VISIBILITY_SPECIFIED from + template. + (determine_visibility_from_class): Reverse sense of + DECL_VISIBILITY_SPECIFIED test for target-specific visibility rules. + (constrain_class_visibility): Only complain about member visibility + if the member type is another class. Don't change visibility of the + current class. + +2006-07-19 Mark Mitchell + + PR c++/28338 + * decl.c (layout_var_decl): Don't call push_local_name here. + (initialize_artificial_var): Assert artificiality. + (cp_finish_decl): Call push_local_name here. + +2006-07-18 Mark Mitchell + + PR c++/28337 + * typeck.c (build_binary_op): Short-circuit pointer arithmetic in + templates. + +2006-07-18 Mark Mitchell + + PR c++/28048 + * semantics.c (check_accessibility_of_qualified_id): Robustify. + + PR c++/28235 + * pt.c (tsubst_decl): Handling substitutions into a static data + member from within the scope of the tempalte itself. + +2006-07-18 Lee Millward + + PR c++/28258 + * method.c (locate_copy): Check for non_reference + returning error_mark_node. + + PR c++/28260 + * decl.c (duplicate_decls): Return error_mark_node + on ambiguous declaration. + +2006-07-18 Steve Ellcey + + PR c++/27495 + * search.c (adjust_result_of_qualified_name_lookup): Change + assert to part of if statement. + +2006-07-17 Steve Ellcey + + PR c++/28291 + * decl.c (reshape_init_class): Return error_mark_node on error. + +2006-07-17 Steve Ellcey + + PR c++/28304 + * decl2.c (check_classfn): Return NULL_TREE on error. + +2006-07-17 Volker Reichelt + + PR c++/28250 + * name-lookup.c (pushdecl_maybe_friend): Return early on + error_mark_node. + * except.c (expand_start_catch_block): Use error_mark_node instead + of NULL_TREE for invalid decls. + * parser.c (cp_parser_exception_declaration): Return error_mark_node + on invalid catch parameter. Simplify. + +2006-07-16 Jakub Jelinek + + PR c++/28370 + * decl2.c (note_vague_linkage_var): Removed. + (finish_static_data_member_decl): Add decl to pending_statics vector + directly. Do it even for non-public decls. + +2006-07-15 Lee Millward + + PR c++/28292 + * decl2.c (acceptable_java_type): Robustify. Use + proper Boolean return type instead of return 1. + (check_java_method): Don't issue error about + type not being an acceptable Java parameter if + it's error_mark_node. + + PR c++/28269 + * parser.c (cp_parser_elaborated_type_specifier): + Return early if an invalid type was detected. + +2006-07-15 Volker Reichelt + + PR c++/28249 + * parser.c (cp_parser_check_decl_spec): New function. + (cp_parser_decl_specifier_seq): Factor out check for repeated + decl-specifiers into cp_parser_check_decl_spec. Use it. + (cp_parser_type_specifier_seq): Use it. + + PR c++/28294 + * semantics.c (finish_offsetof): Use TREE_OPERAND for COMPONENT_REFs + only. + + PR c++/28387 + * decl2.c (cplus_decl_attributes): Check for invalid decls. + +2006-07-14 Volker Reichelt + + PR c++/28343 + * decl.c (cp_finish_decl): Check asmspec_tree for error_mark_node. + * decl2.c (grokfield): Likewise. + +2006-07-12 Geoffrey Keating + + * decl2.c (determine_visibility): Don't change visibility of + function locals because of -fvisibility-inlines-hidden. + +2006-07-12 Jason Merrill + + PR c++/28217 + * semantics.c (note_decl_for_pch): Don't premangle templates. + +2006-07-12 Martin Michlmayr + + * typeck.c (string_conv_p): Remove spurious quotation mark in + warning. + +2006-07-07 Lee Millward + Andrew Pinski + + PR c++/27820 + * decl.c (define_label): Return error_mark_node on error. + * semantics.c (finish_label_stmt): Don't call + add_stmt for invalid labels. + +2006-07-06 Jason Merrill + + PR c++/28279 + * decl2.c (finish_static_data_member_decl): Don't assert + TREE_PUBLIC. + +2006-07-05 Jason Merrill + + PR c++/13983 + PR c++/17519 + * class.c (check_field_decls): Check TYPE_PACKED after + stripping array types. + (finish_struct_bits): Don't copy TYPE_SIZE here. + + PR c++/18681 + * friend.c (is_friend): Fix DR 45 implementation. + +2006-07-05 Richard Guenther + Andrew Pinski + + PR c++/27084 + * cp-objcp-common.c (cxx_types_compatible_p): Ignore + top level qualifiers for pointer type comparisons. + +2006-07-01 Jason Merrill + + PR c++/28215 + * method.c (make_thunk): Unset DECL_USE_TEMPLATE and + DECL_TEMPLATE_INFO. + +2006-06-30 Jason Merrill + + PR c++/26577 + * call.c (build_new_method_call): Force evaluation of the + instance pointer, not the object. + +2006-06-30 Kazu Hirata + + * decl2.c: Fix a comment typo. + +2006-06-30 Jason Merrill + + PR c++/18698 + * decl2.c (grokfield): Only try to treat the decl as an access + declaration if the scope is a class. + +2006-06-29 Jason Merrill + + PR c++/26905 + PR c++/26612 + PR c++/27000 + PR c++/26984 + PR c++/19134 + * decl2.c (determine_visibility): Overhaul. + (determine_visibility_from_class): Likewise. + (min_vis_r, type_visibility, constrain_visibility): New fns. + (constrain_visibility_for_template): Likewise. + (constrain_class_visibility): Likewise. + * decl.c (cp_finish_decl): Call determine_visibility for function + decls, too. + * name-lookup.c (pushtag): Call determine_visibility. + * decl.c (duplicate_decls): Don't copy visibility from template to + specialization. + * pt.c (check_explicit_specialization): Likewise. + (lookup_template_class, tsubst_decl): Call determine_visibility. + * class.c (finish_struct_1): Call constrain_class_visibility. + + PR c++/26905 + PR c++/21675 + PR c++/17470 + * parser.c (cp_parser_explicit_instantiation): Pass the attributes + to grokdeclarator. + (cp_parser_type_specifier): Allow 'enum __attribute ((...)) E'. + (cp_parser_enum_specifier): Likewise. + (cp_parser_elaborated_type_specifier): Apply attributes if this + declares only the class. + (cp_parser_class_specifier): Apply leading attributes immediately. + * semantics.c (begin_class_definition): Add attributes parameter, + apply them to the type. + + PR c++/21581 + PR c++/25915 + * tree.c (decl_anon_ns_mem_p): New function. + * cp-tree.h: Declare it. + * decl2.c (determine_visibility): Make anonymous namespace + members static. + (min_vis_r, constrain_visibility): Likewise. + * rtti.c (create_pseudo_type_info): Set TREE_PUBLIC on + pseudo-types. + * decl.c (cxx_init_decl_processing): Set TREE_PUBLIC on + global_namespace. + * name-lookup.c (push_namespace_with_attribs): Don't set TREE_PUBLIC + on anonymous namespaces. + +2006-06-28 Jason Merrill + + PR c++/27424 + * pt.c (convert_template_argument): Pass all template arguments + on to coerce_template_template_parms. + +2006-06-25 Lee Millward + Mark Mitchell + + PR c++/28054 + * decl2.c (grokbitfied): Remove check for grokdeclarator + returning NULL_TREE, instead check for error_mark_node + to indicate failure. + * decl.c (grokdeclarator): Adjust block comment. + +2006-06-25 Lee Millward + + PR c++/28051 + * mangle.c (mangle_conv_op_name_for_type): Check for + invalid types. + * name-lookup.c (push_class_level_binding): Robustify. + (do_class_using_decl): Return early if name is error_mark_node. + +2006-06-23 Steve Ellcey + + PR c++/28114 + * name-lookup.c (pushtag): Return if we have error_mark_node. + +2006-06-23 Steve Ellcey + + PR c++/27019 + * typeck2.c (process_init_constructor_array): Set ce->value on errors. + +2006-06-23 Volker Reichelt + + PR c++/28112 + * parser.c (cp_parser_attribute_list): Skip attributes with invalid + arguments. Fix comment. + + PR c++/11468 + * init.c (build_new_1): Handle error_mark_nodes returned by + build_java_class_ref. + (build_java_class_ref): Do not abort compilation, but return + error_mark_node. Improve error message. Fix indentation. + +2006-06-23 Danny Smith + + PR target/27789 + * decl.c (start_decl): Check that dllimports are not initialized. + +2006-06-22 Lee Millward + + PR c++/27805 + * typeck2.c (build_m_component_ref): Use error_operand_p. + + PR c++/27821 + * decl.c (grokdeclarator): Return error_mark_node on + invalid uses of the scope resolution operator. + +2006-06-22 Volker Reichelt + + PR c++/28111 + * pt.c (determine_specialization): Check for invalid decls. + + PR c++/28110 + * pt.c (unify) : Check for invalid + parameters. + + PR c++/28109 + * rtti.c (get_tinfo_decl_dynamic): Robustify. + +2006-06-20 Volker Reichelt + + PR c++/28052 + * init.c (push_base_cleanups): Skip members with invalid types. + * typeck.c (build_class_member_access_expr): Robustify. + +2006-06-19 Mark Mitchell + + * pt.c (instantiate_template): Fix typo in comment. + +2006-06-19 Richard Guenther + + * parser.c (CP_LEXER_BUFFER_SIZE): Adjust to assure near + power-of-two token vector size. + +2006-06-16 Mark Mitchell + + PR c++/28016 + * decl.c (cp_finsh_decl): Do not emit uninstantiated static data + members. + + PR c++/27979 + * call.c (standard_conversion): Strip cv-qualifiers from bitfield + types. + + PR c++/27884 + * decl.c (have_extern_spec): Remove. + (start_decl): Do not check have_extern_spec. + (start_function): Likewise. + * cp-tree.h (have_extern_spec): Remove. + * parser.c (cp_parser_linkage_specification): Don't set + have_extern_spec. + (cp_parser_init_declarator): Likewise. + (cp_parser_parameter_declaration): Do not treat parameters as + within the scope of an unbraced linkage specification. + +2006-06-15 Mark Mitchell + + PR c++/27689 + * cp-tree.h (CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P): New + macro. + * pt.c (unify): Use it. + + PR c++/27666 + * call.c (build_conditional_expr): Robustify. + + PR c++/27640 + * pt.c (instantiate_template): Set processing_template_decl to + zero while performing substitutions. + +2006-06-14 Mark Mitchell + + PR c++/27665 + * parser.c (cp_parser_unqualified_id): Use constructor_name_p to + identify destructors. + (cp_parser_nested_name_specifier_opt): Remove invalid + optimization. + (cp_parser_template_id): Refine heuristic for determining whether + we are entering a scope. + + PR c++/27648 + * parser.c (cp_parser_declarator): Robustify. + + PR c++/26559 + * pt.c (tsubst_expr): Use finish_omp_atomic. + (value_dependent_expression_p): All CALL_EXPRs are dependent. + * semantics.c (finish_omp_atomic): Rework to use standard + paradigms for handling non-dependent expressions. + +2006-06-14 Gabriel Dos Reis + + * typeck.c (build_modify_expr): Tidy diagnostic message. + +2006-06-14 Mark Mitchell + + PR c++/28018 + * typeck.c (build_modify_expr): Disallow array assignment. + +2006-06-14 Gabriel Dos Reis + + * cp-tree.def: Fix typo. + +2006-06-13 Mark Mitchell + + PR c++/27227 + * decl.c (decls_match): Allow an extern "C" variable declarations + from different namespaces to match. + (duplicate_decls): Disallow redeclaring a variable with a + different linkage specification. + +2006-06-13 Jakub Jelinek + + PR middle-end/27793 + * cp-tree.h (cxx_int_tree_map): New struct. + (struct language_function): Add extern_decl_map field. + * name-lookup.c (pushdecl_maybe_friend): Add x -> t mapping + to cp_function_chain->extern_decl_map hash table instead of + copying over DECL_UID. + * cp-gimplify.c (cxx_int_tree_map_eq, cxx_int_tree_map_hash): New + functions. + (cp_genericize_r): Remap DECL_EXTERN local decls using + cp_function_chain->extern_decl_map hash table. + * decl.c (finish_function): Clear extern_decl_map. + +2006-06-12 Volker Reichelt + + PR c++/27601 + * semantics.c (finish_offsetof): Handle pseudo-destructors. + + PR c++/27933 + * name-lookup.c (lookup_qualified_name): Always return error_mark_node + if lookup fails. + + PR c++/27951 + * decl2.c (finish_anon_union): Return early if build_anon_union_vars + fails. + +2006-06-12 Roger Sayle + + PR c++/21210 + * typeck2.c (build_functional_cast): Use cp_convert to construct + non-aggregate initializers instead of the user-level build_c_cast. + +2006-06-07 Volker Reichelt + + PR c++/27601 + * cp-tree.h (finish_offsetof): Add prototype. + * semantics.c (finish_offsetof): New function. + * parser.c (cp_parser_builtin_offsetof): Call it instead of + fold_offsetof. + * pt.c (tsubst_copy_and_build): Likewise. + +2006-06-06 Mark Mitchell + + PR c++/27177 + * call.c (standard_conversion): Require that the derived type be + complete when performing a derived-to-base conversion. + +2006-06-04 Mark Mitchell + + PR c++/27819 + * decl.c (cp_finish_decl): Process initializers for static data + members with non-dependent initializers, even in templates. + + PR c++/27722 + * decl.c (maybe_deduce_size_from_array_init): If the declaration + is erroneous, give it an erroneous type. + (layout_var_decl): If the type is erroneous, give up. + (check_initializer): Likewise. + + PR c++/27807 + * cp-tree.h (TYPE_OBJ_P): New macro. + (TYPE_PTROB_P): Use it. + (TYPE_REF_OBJ_P): Likewise. + * semantics.c (finish_compound_literal): Do not permit compound + literals of non-object types. + + PR c++/27806 + * typeck.c (original_type): Robustify. + +2006-06-05 Volker Reichelt + + PR c++/27804 + * init.c (constant_value_1): Return decl instead of error_mark_node + for invalid initializers. + +2006-06-01 Andrew Pinski + + PR c++/27592 + * rtti.c (build_dynamic_cast_1): Call c_common_truthvalue_conversion + on operand of the COND_EXPR for the null pointer check. + +2006-06-01 Andrew Pinski + + PR c++/26740 + * typeck.c (build_unary_op): Mark the function as being used. + +2006-06-01 Alexandre Oliva + + PR c++/26660 + * parser.c (cp_parser_initial_pragma): Read one more token for + caller after reading PCH file in. + +2006-05-31 Mark Mitchell + + PR c++/27801 + * call.c (perform_implicit_conversion): Do not actually perform + conversions in templates. + + PR c++/26496 + * call.c (resolve_args): Check for invalid uses of bound + non-static member functions. + * init.c (build_offset_ref): Return error_mark_node for errors. + + PR c++/27385 + * decl.c (reshape_init): Robustify. + (reshape_init_array_1): Likewise. + +2006-05-30 Mark Mitchell + + PR c++/27808 + * parser.c (cp_parser_decl_specifier_seq): Issue errors about + "friend" specifiers that do not appear in class scopes. + + PR c++/27803 + * class.c (check_bitfield_decl): Ensure that all bitfields have + integral type. + +2006-05-29 Kazu Hirata + + * pt.c (convert_nontype_argument): Fix a typo in an error + message. + +2006-05-28 Kazu Hirata + + * decl.c, decl2.c, parser.c: Fix comment typos. Follow + spelling conventions. + +2006-05-24 Mark Mitchell + + PR c++/20103 + * decl.c (cp_make_fname_decl): Don't set DECL_INITIAL to + error_mark_node to indicate an initialization is OK. + (start_decl): Likewise. Adjust call to start_decl_1. + (start_decl_1): Add initialized parameter. Simplify. + * except.c (initialize_handler_parm): Adjust call to + setart_decl_1. + (expand_start_catch_block): Let cp_finish_decl initialize catch + parameters. + * cp-tree.h (start_decl_1): Adjust prototype. + * pt.c (tsubst_expr): Don't set DECL_INITIAL to error_mark_node. + (instantiate_decl): Let cp_finish_decl handle initialization. + * semantics.c (finish_compound_literal): Create a temporary + variable for the literal. + * typeck.c (build_unary_op): Remove COMPOUND_LITERAL_P special + cases. + * decl2.c (finish_static_data_member_decl): Don't set + DECL_INITIAL. + (grokfield): Do not try to initialize functions. + +2006-05-23 Mark Mitchell + + PR c++/20173 + * pt.c (determine_specialization): Disallow partial + specializations of templates. + +2006-05-22 Volker Reichelt + + PR c++/27716 + * typeck.c (build_modify_expr): Test arguments for error_operand_p. + + * decl.c (grokdeclarator): Return error_mark_node instead of NULL_TREE. + +2006-05-21 Mark Mitchell + + PR c++/27210 + * cp-tree.h (cp_save_expr): New function. + * init.c (build_new): Correct logic for zero-element array + warning. Use cp_save_expr. + * tree.c (cp_save_expr): New function. + +2006-05-21 Volker Reichelt + + PR c++/27398 + * decl.c (grokdeclarator): Return error_mark_node instead of NULL_TREE + or void_type_node. + +2006-05-19 Mike Stump + + * typeck.c (default_conversion): Remove static. + +2006-05-19 Mark Mitchell + + PR c++/26433 + * cp-tree.h (begin_function_try_block): Change prototype. + (finish_function_handler_sequence): Likewise. + * parser.c (cp_parser_function_try_block): Adjust calls. + * pt.c (tsubst_expr): Adjust calls. + * semantics.c (begin_function_try_block): Create an artificial + outer scope. + (finish_function_handler_sequence): Close it. + +2006-05-18 Mark Mitchell + + PR c++/27471 + PR c++/27506 + * typeck.c (decay_conversion): Convert bitfields to their declared + types here. Improve documentation. Avoid use of cp_convert. + (default_conversion): Make it static. Perform integral promotions + before lvalue-to-rvalue, function-to-pointer, and array-to-pointer + conversions. + * init.c (build_init): Remove. + (expand_default_init): Do not call rvalue. + * call.c (null_ptr_cst_p): Robustify. + (build_conditional_expr): Tidy. + * except.c (build_throw): Do not perform lvalue-to-rvalue + conversion on operand before initializing temporary. + * tree.c (convert.h): Include it. + (convert_bitfield_to_declared_type): Use convert_to_integer, not + cp_convert. + (rvalue): Don't convert bitfields to their declared type here. + * cp-tree.h (build_init): Remove. + (default_conversion): Likewise. + * typeck2.c (build_m_component_ref): Do not perform + lvalue-to-rvalue, function-to-pointer, or array-to-pointer + conversions here. Correct error message. + +2006-05-17 Mark Mitchell + + PR c++/26122 + * decl2.c (check_member_template): Remove checks for virtual + functions. + * parser.c (cp_parser_function_specifier_opt): Complain about + virtual templates. + (cp_parser_pure_specifier): Likewise. + + PR c++/26068 + * parser.c (cp_parser_set_storage_class): Check for + invalid uses of storage classes on unbraced linkage + specifications. + (cp_parser_decl_specifier_seq): Pass keywords, not storage classes, + to cp_parser_set_storage_class. + +2006-05-17 Jakub Jelinek + + PR c++/27491 + * semantics.c (finish_compound_literal): Only set TREE_HAS_CONSTRUCTOR + on CONSTRUCTORs. + + PR middle-end/27415 + * parser.c (cp_parser_omp_parallel): Set OMP_PARALLEL_COMBINED + on combined parallel workshare constructs. + * pt.c (tsubst_expr): Copy OMP_PARALLEL_COMBINED flag. + +2006-05-16 H.J. Lu + + PR driver/26885 + * Make-lang.in (GXX_OBJS): Replace gcc.o with $(GCC_OBJS). + +2006-05-15 Mark Mitchell + + PR c++/27339 + * cp-tree.h (perform_access_checks): New function. + * semantics.c (perform_access_checks): New function. + (perform_deferred_access_checks): Use it. + * parser.c (cp_parser_simple_declaration): Adjust call to + cp_parser_init_declarator. + (cp_parser_type_parameter): Do not defer checks in default + arguments. + (cp_parser_explicit_specialization): Adjust call to + cp_parser_single_declaration. + (cp_parser_init_declarator): Perform template-parameter access + checks. + (cp_parser_parameter_declaration): Do not defer checks for + template parameter default arguments. + (cp_parser_template_declaration_after_export): Gather access + checks for template parameters, and pass them to + cp_parser_single_declaration. + (cp_parser_template_parameter_access_checks): New function. + (cp_parser_single_declaration): Add checks parameter. + + PR c++/27505 + * call.c (convert_like_real): Convert bitfields to their declared + types when forming an rvalue. + * tree.c (convert_bitfield_to_declared_type): New function. + (rvalue): Use it. + * cp-tree.h (convert_bitfield_to_declare_type): Declare it. + +2006-05-15 Volker Reichelt + + PR c++/27582 + * pt.c (any_dependent_template_arguments_p): Return early on invalid + argument list. + + PR c++/27581 + * search.c (adjust_result_of_qualified_name_lookup): Skip on + invalid context_class. + + PR c++/27315 + * pt.c (do_decl_instantiation): Return early on invalid decl. + + PR c++/27559 + * pt.c (push_template_decl_real): Return error_mark_node instead + of broken decl. + + PR c++/27496 + * pt.c (tsubst_friend_class): Return early on invalid friend + declarations. + +2006-05-14 H.J. Lu + + * Make-lang.in (cp/decl.o): Add dependency on $(TARGET_H). + (cp/decl2.o): Likewise. + (cp/typeck.o): Likewise. + (cp/cvt.o): Likewise. + (cp/parser.o): Likewise. + (cp/call.o): Replace target.h with $(TARGET_H). + +2006-05-14 Alexandre Oliva + + * pt.c (build_non_dependent_expr): Leave ADDR_EXPR of + COMPONENT_REF alone. + +2006-05-11 Volker Reichelt + + PR c++/27547 + * decl.c (copy_fn_p): Return early on non-member functions. + +2006-05-08 Volker Reichelt + + PR c++/27447 + * decl2.c (build_memfn_type): Skip invalid functions and class types. + +2006-05-06 Volker Reichelt + + PR c++/27427 + * pt.c (convert_nontype_argument): Return early on invalid arguments. + + * pt.c (process_template_parm): Remove superfluous temporary. + + PR c++/27430 + * pt.c (process_template_parm): Handle erroneous non-type parameters. + + PR c++/27423 + * typeck.c (convert_for_initialization): Skip erroneous types. + + PR c++/27422 + * typeck.c (convert_arguments): Return early on args with + invalid types. + +2006-05-03 Aldy Hernandez + + PR/21391 + * typeck.c (build_static_cast_1): Save casted types in used types + hash table. + (build_reinterpret_cast_1): Same. + * rtti.c (build_dynamic_cast_1): Same. + +2006-05-04 Jakub Jelinek + + PR c++/27359 + * parser.c (cp_parser_omp_for_loop): Only call + cp_parser_abort_tentative_parse if cp_parser_parse_definitely was not + called. + +2006-05-02 Mark Mitchell + + PR c++/27102 + * decl.c (grokdeclarator): Robustify checks for defining members + of incomplete types. + + PR c++/27309 + * class.c (add_method): Call grok_special_member_properties. + * decl.c (grokdeclarator): Don't call it here. + (copy_fn_p): A TEMPLATE_DECL is never a copy constructor or + assignment operator. Set TYPE_HAS_CONSTURCTOR if DECL is a + constructor. + (start_method): Don't call grok_special_member_properties. + * method.c (implicitly_declare_fn): Likewise. + * pt.c (instantiate_class_template): Likewise. + * decl2.c (grokfield): Likewise. + +2006-05-02 Jakub Jelinek + + PR middle-end/27337 + * cp-gimplify.c (cxx_omp_privatize_by_reference): New function. + * cp-tree.h (cxx_omp_privatize_by_reference): New prototype. + * cp-objcp-common.h (LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE): Define. + +2006-04-30 Mark Mitchell + + PR c++/27094 + * pt.c (tsubst_default_argument): Increment function_depth around + call to tsubst_expr. + * parser.c (cp_parser_parameter_declaration): Likewise. + * decl2.c (mark_used): Tidy. + +2006-04-30 Volker Reichelt + + PR c++/27278 + * decl.c (grok_op_properties): Skip operators with invalid args + when checking for class-type or enum-type args. + +2006-04-29 Volker Reichelt + + PR c++/27279 + * decl.c (copy_fn_p): Skip functions with invalid first arg. + +2006-04-27 Mark Mitchell + + PR c++/27292 + * tree.c (rvalue): Convert bitfields to their declared types. + + PR c++/27102 + * typeck2.c (cxx_incomplete_type_diagnostic): Handle + TYPENAME_TYPE. + +2006-04-24 Mark Mitchell + + PR c++/27292 + * typeck.c (decay_conversion): Don't adjust bitfield types. + (perform_integral_promotions): Treat bitfield enums as enums, not + as short integer types. + * tree.c (rvalue): Convert bitfields to their correct types. + +2006-04-24 Volker Reichelt + + PR c++/19963 + * class.c (layout_class_type): Skip fields with invalid types. + +2006-04-23 Mark Mitchell + + PR c++/26912 + * cp-tree.h (build_this_parm): Declare. + (grok_method_quals): Remove. + (build_memfn_type): Declare. + (build_artificial_parm): Declare. + (do_friend): Remove quals parameter. + * decl.c (build_this_parm): New function. + (grokfndecl): Use it. Do not pass quals to grokclassfn. + (grokdeclarator): Rename quals to memfn_quals. Avoid allocating + unnecessary TYPE_DECLs. Correct qualification of member function + types. Tidy. + * method.c (implicitly_declare_fn): Use build_this_parm. + * friend.c (do_friend): Remove quals parameter. + * decl2.c (grok_method_quals): Remove. + (build_memfn_type): New function. + (build_artificial_parm): Give it external linkage. + (grokclassfn): Remove quals parameter. Do not build "this" + PARM_DECL here. + + PR c++/26534 + * cp-tree.h (is_bitfield_expr_with_lowered_type): New function. + * typeck.c (is_bitfield_expr_with_lowered_type): New function. + (decay_conversion): Convert bitfield expressions to the correct + type. + (build_modify_expr): Remove spurious conversions. + * class.c (layout_class_type): Modify the type of bitfields to + indicate a limited range. + * call.c (standard_conversion): Adjust the type of bitfield + expressions used in an rvalue context. + (build_conditional_expr): Likewise. + +2006-04-22 Kazu Hirata + + * decl.c: Fix comment typos. + +2006-04-21 Eric Christopher + + * decl.c: Fix typo in function name. + +2006-04-19 Volker Reichelt + + PR c++/26558 + * parser.c (cp_parser_class_name): Check for invalid typenames. + Rearrange code. + + PR c++/26739 + * pt.c (tsubst_friend_function): Return early if + pushdecl_namespace_level fails. + + PR c++/26036 + * typeck.c (convert_arguments): Return error_mark_node instead of + error_mark_list. + * cp-tree.h (error_mark_list): Remove declaration. + * decl.c (error_mark_list): Remove definition. + (cxx_init_decl_processing): Do not initialize error_mark_list. + + PR c++/10385 + * rtti.c (build_dynamic_cast_1): Check for invalid conversions + before calling convert_to_reference. + * cvt.c (convert_to_reference): Assert that reftype is a + REFERENCE_TYPE. + +2006-04-19 Mark Mitchell + + PR c++/27102 + * class.c (currently_open_class): Tidy. + * decl.c (grokdeclarator): If we encounter an erroneous + declarator, assume that we have already issued an error message + and return. Return error_mark_node instead of NULL_TREE in more + places. Issue errors about function definitions that do not have + a function declarator. Check for complete types for all function + definitions. + * cp-tree.h (cp_error_declarator): Remove. + (currently_open_class): Change return type. + * parser.c (cp_parser_id_expression): Add optional_p parameter. + (cp_parser_parse_diagnose_invalid_type_name): Adjust calls. + (cp_parser_id_expression): Likewise. + (cp_parser_unqualified_id): If the name is optional, return + NULL_TREE. + (cp_parser_postfix_dot_deref_expression): Adjust calls. + (cp_parser_type_parameter): Likewise. + (cp_parser_unqualified_id): Likewise. + (cp_parser_direct_declarator): Likewise. + (cp_parser_declarator_id): Add optional_p parameter. + (cp_parser_function_definition_from_specifiers_and_declarator): + Assume that start_function indicates failure only if it has issued + an error. + (cp_parser_omp_var_list_no_open): Adjust calls. + +2006-04-17 Janis Johnson + + PR c++/26114, c++/26115 + * typeck.c (cxx_mark_addressable): Restore check for extra_warnings. + * class.c (check_field_decls): Ditto. + +2006-04-17 Volker Reichelt + + * init.c (build_offset_ref): Remove superfluous temporary. + +2006-04-16 Mark Mitchell + + PR c++/26365 + * typeck.c (finish_class_member_access_expr): Robustify + +2006-04-15 Kazu Hirata + + * Make-lang.in (cp/pt.o): Depend on vecprim.h. + * pt.c: Include vecprim.h. + (inline_parm_levels): Change the type to VEC(int,heap) *. + (inline_parm_levels_used): Remove. + (maybe_begin_member_template_processing, + maybe_end_member_template_processing): Use VEC instead of + VARRAY. + + * cp/call.c: Fix comment typos. + +2006-04-12 Mark Mitchell + + * parser.c (cp_parser_init_declarator): Initialize local variables + aggressively. + +2006-04-12 Roger Sayle + + * parser.c (cp_parser_init_declarator): Initialise + is_parenthesized_init to false to avoid compiler warning. + +2006-04-11 Mark Mitchell + + * cp-tree.h (build_operator_new_call): Adjust prototype. + (build_new_method_call): Likewise. + (build_op_delete_call): Likewise. + * init.c (build_raw_new_expr): New function. + (build_new_1): Pass information as parameters, rather than + bundling it into a NEW_EXPR. + (build_new): Adjust accordingly. + (build_vec_delete_1): Adjust for changes to build_op_delete_call. + (build_delete): Likewise. + * decl.c (finish_destructor_body): Likewise. + * call.c (build_operator_new_call): Return the allocation function + used. + (build_op_delete_call): Take allocation function as parameter. + (build_special_member_call): Adjust call to build_new_method_call. + (build_new_method_call): Return function called. + * pt.c (tsubst_copy_and_build): Adjust call to + build_new_method_call. + * semantics.c (finish_call_expr): Likewise. + * parser.c (cp_parser_postfix_expression): Likewise. + * typeck2.c (cxx_incomplete_type_diagnostic): Refer to + "incomplete", not "undefined", types. + + PR c++/26295 + * decl.c (grokdeclarator): Remove namespace-handling code for + pointers-to-members. + * parser.c (cp_parser_ptr_operator): Check for qualified names + using namespaces. + + PR c++/26122 + * parser.c (cp_parser_init_declarator): Adjust logic for deciding + whether or not to look for a pure-specifier. + (cp_parser_member_declaration): Likewise. + +2006-04-08 Kazu Hirata + + * decl2.c, pt.c, semantics.c: Fix comment typos. + +2006-04-06 Roger Sayle + + * call.c (null_ptr_cst_p): Add explicit TREE_CONSTANT_OVERFLOW check. + +2006-04-05 Jason Merrill + + * name-lookup.c (push_namespace_with_attribs): Temporarily disable + default hidden visibility for anonymous namespace. + +2006-03-29 Roger Sayle + + PR c++/22494 + * init.c (build_vec_delete_1): Convert BASE pointer's type to + the base pointer type to avoid a type mismatch in the EQ_EXPR. + +2006-03-24 Carlos O'Donell + + * search.c (maybe_suppress_debug_info): If + flag_emit_class_debug_always then don't suppress. + +2006-03-22 Jason Merrill + + * name-lookup.c (push_namespace_with_attribs): Only apply hidden + visibility to anonymous namespaces if HAVE_GAS_HIDDEN. + +2006-03-21 Jakub Jelinek + + PR c++/26691 + * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle default arguments. + +2006-03-21 Jason Merrill + + PR c++/21581 + * parser.c (cp_parser_declaration): Support attributes on + anonymous namespaces. + * name-lookup.c (push_namespace_with_attribs): Anonymous + namespaces default to hidden visibility. + +2006-03-20 Jason Merrill + + PR c++/21764, c++/19238 + * decl.c (cp_finish_decl): Call determine_visibility later. + (start_preparsed_function): Likewise. + * cp-tree.h (CP_TYPE_CONTEXT, TYPE_NAMESPACE_SCOPE_P): New macros. + (TYPE_CLASS_SCOPE_P, TYPE_FUNCTION_SCOPE_P): New macros. + * name-lookup.h (struct cp_binding_level): Add has_visibility + bitfield. + * name-lookup.c: Include c-pragma.h. + (push_namespace_with_attribs): Split out from push_namespace. + Push visibility if appropriate. Set TREE_PUBLIC on namespaces. + (leave_scope): Pop visibility if appropriate. + * decl2.c (determine_visibility_from_class): Split out from... + (determine_visibility): ...here. Handle function scope and + nested classes. + (import_export_decl): Move visibility handling to + determine_visibility_from_class. + * parser.c (cp_parser_declaration, cp_parser_namespace_name): Allow + attributes on namespace declarations. + +2006-03-15 Volker Reichelt + + PR c++/6634 + * decl.c (grokdeclarator): Do not accept long long double. + Reorganize checks for invalid (combinations of) type modifiers. + Quote modifiers in messages. + +2006-03-09 Jason Merrill + + PR c++/16387, c++/16389 + * typeck.c (cxx_alignof_expr, cxx_sizeof_expr): New functions. + (cxx_sizeof_or_alignof_expr): Split out from here. + +2006-03-09 Diego Novillo + + Merge from gomp-20050608-branch + + 2006-02-02 Diego Novillo + + * decl.c (pop_labels_1): Use appropriate pointer casting. + (poplevel_named_label_1): Likewise. + (named_label_entry_hash): Likewise. + (named_label_entry_eq): Likewise. + (check_goto): Likewise. + (define_label): Likewise. + + 2006-01-26 Diego Novillo + + * cp-tree.h (CP_OMP_CLAUSE_INFO): Use TREE_TYPE instead + of TREE_BLOCK. + * pt.c: Use OMP_CLAUSE_CODE and OMP_CLAUSE_OPERAND + instead of TREE_CODE/TREE_OPERAND. + * semantics.c: Likewise. + * parser.c: Likewise. + + 2005-11-10 Diego Novillo + + * parser.c (cp_parser_omp_threadprivate): Emit diagnostic if + target does not support TLS. + + 2005-11-09 Jakub Jelinek + + * decl.c (redeclaration_error_message): Don't error about + DECL_THREAD_LOCAL_P mismatches if CP_DECL_THREADPRIVATE_P + (olddecl). + + 2005-11-08 Jakub Jelinek + + PR c++/24735 + * semantics.c (finish_omp_barrier, finish_omp_flush): New + functions. + * parser.c (cp_parser_omp_barrier): Call finish_omp_barrier. + (cp_parser_omp_flush): Call finish_omp_flush. + * cp-tree.h (finish_omp_barrier, finish_omp_flush): New + prototypes. + + PR c++/24734 + * pt.c (tsubst_expr): Handle OMP_MASTER and OMP_ORDERED. + + 2005-11-03 Jakub Jelinek + + * semantics.c (finish_omp_threadprivate): Error on class-scope + variables. + + 2005-11-02 Jakub Jelinek + + * parser.c (cp_parser_omp_all_clauses): If some clause + type is not allowed, don't remove just one of the + clauses, but all clauses added in that loop round. + + * semantics.c (finish_omp_clauses): Fix function + comment. Don't handle non-const or mutable specially, + as const and not mutable is predetermined shared and + that leads to double error. Don't ICE if copyin var is + PARM_DECL. + + PR c++/24613 + * parser.c (cp_parser_pragma): Diagnose + PRAGMA_OMP_SECTION outside of PRAGMA_OMP_SECTIONS + construct. + + * semantics.c (finish_omp_threadprivate): Error if V + is automatic variable or has incomplete type. + + 2005-11-01 Diego Novillo + + * parser.c (cp_parser_omp_all_clauses): Use + OMP_CLAUSE_CHAIN instead of TREE_CHAIN. + + 2005-11-01 Diego Novillo + + * parser.c (cp_parser_omp_all_clauses): When emitting an + error message, remove the invalid clause from the list. + + 2005-10-31 Diego Novillo + + * parser.c (cp_parser_omp_parallel): Do not allow 'nowait' in + combined parallel+workshare directives. + + 2005-10-31 Richard Henderson + + * cp-objcp-common.h (LANG_HOOKS_OMP_CLAUSE_DTOR): + Use cxx_omp_clause_dtor. + * cp-tree.h (CP_OMP_CLAUSE_INFO): New. + (cxx_omp_clause_dtor): New. + * cp-gimplify.c (cxx_omp_clause_apply_fn): New. + (cxx_omp_clause_default_ctor): Use it. + (cxx_omp_clause_copy_ctor, cxx_omp_clause_assign_op): + Likewise. + (cxx_omp_clause_dtor): New. + * semantics.c (finish_omp_clauses): Rewrite cdtor + checking to fill in CP_OMP_CLAUSE_INFO. Don't + specialcase LASTPRIVATE for removal. + (cxx_omp_clause_default_ctor, cxx_omp_clause_copy_ctor, + cxx_omp_clause_assign_op): Move to cp-gimplify.c. + + 2005-10-28 Jakub Jelinek + + * semantics.c (finish_omp_threadprivate): If + DECL_RTL_SET_P, call make_decl_rtl again so that + encode_section_info can update SYMBOL_REF's flags. + + 2005-10-26 Jakub Jelinek + + * semantics.c (finish_omp_for): Don't segfault if COND + or INCR is NULL. If not calling c_finish_omp_for + right away and one of COND and INCR is NULL, issue + error and don't expand anything. + + PR c++/24512 + * cp-tree.h (finish_omp_for): Add PRE_BODY argument. + * semantics.c (finish_omp_for): Likewise. Set + OMP_FOR_PRE_BODY to PRE_BODY if deferring, add it + into the current statement list if not processing + template decl or pass it to c_finish_omp_for. + + * parser.c (cp_parser_omp_for_loop): Expand optional DECL_EXPRs + into PRE_BODY statement list. Pass it to finish_omp_for. + * pt.c (tsubst_expr) : tsubst_expr also + OMP_FOR_PRE_BODY into PRE_BODY stmt list, pass it to + finish_omp_for. Put all the statements into sk_omp + scope. + + 2005-10-25 Jakub Jelinek + + PR c++/24516 + * parser.c (struct cp_parser): Rename in_iteration_statement + field to in_statement. + (IN_SWITCH_STMT, IN_ITERATION_STMT): Define. + (IN_OMP_BLOCK, IN_OMP_FOR): Change values. + (cp_parser_new, cp_parser_begin_omp_structured_block, + cp_parser_end_omp_structured_block, + cp_parser_omp_for_loop): Adjust for + in_iteration_statement renaming. + (cp_parser_selection_statement): Save + parser->in_iteration, or it temporarily with + IN_SWITCH_STMT for the + cp_parser_implicitly_scoped_statement call. + (cp_parser_iteration_statement): Adjust for + in_iteration_statement renaming. Use + IN_ITERATION_STMT rather than true. + (cp_parser_jump_statement): Adjust for + in_iteration_statement renaming and new values. Don't + error on break in a switch statement within OMP_FOR or + OpenMP structured block. + + PR c++/24513 + * parser.c (cp_parser_cache_group): Don't stop if next + token is CPP_PRAGMA_EOL and end is CPP_PRAGMA_EOL as + well. If current token is CPP_PRAGMA, consume + everything until CPP_PRAGMA_EOL inclusive. + + 2005-10-24 Jakub Jelinek + + PR c++/24502 + * semantics.c (finish_omp_for): Handle MODOP_EXPR in + addition to MODIFY_EXPR. + + 2005-10-23 Richard Henderson + + * cp-gimplify.c (struct cp_gimplify_ctx): Remove. + (bc_label): New. + (begin_bc_block, finish_bc_block): Use it. + (push_context, pop_context): Remove. + (cp_genericize): Don't use them. Assert bc_label is null. + * semantics.c (finish_omp_clauses): Create a fake data + element of TYPE for probing ctors. + + 2005-10-23 Richard Henderson + + * cp-objcp-common.h (LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR): New. + (LANG_HOOKS_OMP_CLAUSE_COPY_CTOR): New. + (LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP): New. + (LANG_HOOKS_OMP_CLAUSE_DTOR): New. + * semantics.c (finish_omp_clauses): Look through + arrays when looking up special member calls. Also + remove FIRSTPRIVATE when LASTPRIVATE fails. + (cxx_omp_clause_default_ctor, cxx_omp_clause_copy_ctor): New. + (cxx_omp_clause_assign_op): New. + * cp-tree.h: Declare them. + + 2005-10-21 Richard Henderson + + * decl.c (check_previous_goto_1): Return false if error. + (check_switch_goto): Likewise. + (finish_case_label): Don't emit the case label on error. + * parser.c (struct cp_parser): Revert + in_switch_statement_p changes. + (cp_parser_labeled_statement, + cp_parser_selection_statement): Likewise. + (cp_parser_begin_omp_structured_block): Don't save... + (cp_parser_end_omp_structured_block): or restore + in_switch_statement_p. + + 2005-10-21 Richard Henderson + + * semantics.c (finish_omp_threadprivate): Set + decl_flags.u2sel when necessary. + + 2005-10-21 Richard Henderson + + * decl.c (poplevel_named_label_1): Restore creation of the + bad_decls list. + (decl_jump_unsafe): Check for error_mark_node types. + (check_goto): Don't check cdtor_label. Don't use identify_goto. + * semantics.c (finish_return_stmt): Do check_omp_return before + converting to cdtor_label goto. + + 2005-10-21 Richard Henderson + + PR c++/24451 + * decl.c (check_omp_return): Return false on error. + * cp-tree.h (check_omp_return): Update decl. + * semantics.c (finish_return_stmt): Avoid adding + return on error. + + 2005-10-21 Richard Henderson + + * cp-tree.h (struct language_function): Remove + x_named_label_uses. + Change x_named_labels to a hashtable. + (check_omp_return): Declare. + * decl.c (struct named_label_use_entry): Rename from + named_label_use_list. Remove label_decl. + (struct named_label_entry): Rename from + named_label_list. Remove old_value and next. Change + in_try_scope and in_catch_scope to bool. Add + in_omp_scope. + (pop_labels_1): New. + (pop_labels): Use it. + (pop_local_label, poplevel_named_label_1): New. + (poplevel): Use them. + (named_label_entry_hash, named_label_entry_eq): New. + (make_label_decl): Create named_labels. Move label + creation bits from lookup_label. + (declare_local_label): Tidy. + (identify_goto): Split out from ... + (check_previous_goto_1): Add exited_omp argument. + Handle omp scopes. + + (use_label): Merge into... + (check_goto): ... here. Handle omp scopes. + (check_omp_return): New. + (check_previous_gotos): Merge into... + (define_label): ... here. + (save_function_data): Remove x_named_label_uses reference. + (finish_function): Likewise. + * name-lookup.h (sk_omp): New. + * name-lookup.c (begin_scope): Handle it. + * parser.c (cp_parser_omp_for): Don't create extra + compound stmt. + + (cp_parser_omp_sections): Likewise. + * semantics.c (finish_return_stmt): Call check_omp_return. + (begin_omp_structured_block): Use sk_omp. + (finish_omp_structured_block): Use do_poplevel. Don't build a + MUST_NOT_THROW expression here. + (begin_omp_parallel, finish_omp_parallel): Don't create extra + compound statements. + + 2005-10-21 Diego Novillo + + PR 24455 + * cp/cp-tree.h (struct lang_decl_flags): Add field + threadprivate_p. + (CP_DECL_IS_THREADPRIVATE): Define. + * cp/semantics.c (finish_omp_threadprivate): Set. Do + not error out if CP_DECL_IS_THREADPRIVATE is set + already. + * cp/decl.c (duplicate_decls): Merge + CP_DECL_THREADPRIVATE_P. + + 2005-10-20 Richard Henderson + + * cp-gimplify.c (cp_gimplify_omp_for): New. + (cp_gimplify_expr): Call it. + * cp-tree.h (OMP_FOR_GIMPLIFYING_P): New. + * parser.c (struct cp_parser): Rename + in_iteration_statement_p to in_iteration_statement and + change to unsigned char. Similarly with + in_switch_statement. Update all users. + (IN_OMP_BLOCK, IN_OMP_FOR): New. + (cp_parser_labeled_statement): Diagnose case labels + binding closer to an openmp block nested than the + switch. + (cp_parser_jump_statement): Diagnose break and + continue labels binding closer to an openmp block than + an iteration or switch. + (cp_parser_omp_for_loop): Mark in_iteration_statement + for an omp for. + (cp_parser_begin_omp_structured_block): New. + (cp_parser_end_omp_structured_block): New. + (cp_parser_omp_structured_block): Use them. + (cp_parser_omp_for, cp_parser_omp_sections_scope): Likewise. + (cp_parser_omp_parallel): Likewise. + + 2005-10-20 Richard Henderson + + * semantics.c (begin_omp_structured_block): New. + (finish_omp_structured_block): New. + (begin_omp_parallel, finish_omp_parallel): Use them. + * parser.c (cp_parser_omp_structured_block): Likewise. + (cp_parser_omp_for): Likewise. + (cp_parser_omp_sections_scope): Likewise. + * cp-tree.h: Declare them. + + 2005-10-20 Richard Henderson + + * parser.c (cp_parser_omp_master): Return the statement. + (cp_parser_omp_ordered): Likewise. + (cp_parser_omp_construct): Set the locus for them. + + 2005-10-19 Richard Henderson + + * semantics.c (finish_omp_atomic): Revert to + uses_template_parms. + + 2005-10-19 Richard Henderson + + * semantics.c (finish_omp_clauses): Avoid + DECL_THREAD_LOCAL_P on a PARM_DECL. Remove some + stub asserts guaranteed to fail. + + 2005-10-19 Richard Henderson + + * cp-tree.h (OMP_ATOMIC_DEPENDENT_P, OMP_ATOMIC_CODE): New. + (finish_omp_clauses, finish_omp_for, finish_omp_atomic): New. + * parser.c (cp_parser_omp_clause_copyin): Remove. + (cp_parser_omp_all_clauses): Use cp_parser_omp_var_list instead. + Call finish_omp_clauses. + (cp_parser_omp_clause_if): Don't do error checking here. + (cp_parser_omp_clause_num_threads): Likewise. + (cp_parser_omp_clause_schedule): Likewise. + (cp_parser_omp_atomic): Use finish_omp_atomic. + (cp_parser_omp_for_loop): Don't discard DECL_EXPR. + Don't decompose assignment statment here. Use + finish_omp_for. + + * pt.c (tsubst_omp_clauses): New. + (tsubst_expr): Handle OMP_PARALLEL, OMP_FOR, OMP_SECTIONS, + OMP_SINGLE, OMP_SECTION, OMP_CRITICAL, OMP_ATOMIC. + * semantics.c (finish_omp_clauses): New. + (begin_omp_parallel, finish_omp_parallel): Know Less about the + internals of the stmt_list stack. + (finish_omp_for, finish_omp_atomic): New. + + 2005-10-18 Jakub Jelinek + + * semantics.c (cxx_omp_predetermined_sharing): New function. + * cp-tree.h (cxx_omp_predetermined_sharing): New prototype. + * cp-objcp-common.h + (LANG_HOOKS_OMP_PREDETERMINED_SHARING): Redefine. + + 2005-10-18 Richard Henderson + + * parser.c (cp_parser_omp_single): Use make_node and accessors + instead of build. + + 2005-10-17 Richard Henderson + + * parser.c (cp_parser_omp_for_loop): Handle declarations. + + 2005-10-12 Richard Henderson + + * Make-lang.in (CXX_C_OBJS): Add c-omp.o. + * cp-tree.h (begin_omp_parallel, finish_omp_parallel): Declare. + (finish_omp_threadprivate): Declare. + * parser.c (struct cp_lexer): Add in_pragma. + (cp_lexer_consume_token): Don't consume a PRAGMA_EOL + when in_pragma. + (cp_parser_skip_to_closing_parenthesis): Stop at PRAGMA_EOL. + (cp_parser_skip_to_end_of_statement): Likewise. + (cp_parser_skip_to_end_of_block_or_statement): Likewise. + (cp_parser_skip_to_closing_brace): Likewise. + (cp_parser_skip_to_pragma_eol): Reset in_pragma. + (cp_parser_require_pragma_eol): New. + (cp_parser_statement): Add in_compound argument; + update all callers. + Restart if a non-statement pragma seen outside a + compound. + (cp_parser_statement_seq_opt): Stop at PRAGMA_EOL. + (cp_parser_declaration_seq_opt): Likewise. + (cp_parser_member_specification_opt): Likewise. + (cp_parser_function_definition_after_decl): Likewise. + (cp_parser_skip_until_found): Likewise. + (cp_parser_cache_group): Likewise. + (enum pragma_omp_clause, cp_parser_omp_clause_name, + check_no_duplicate_clause, + cp_parser_omp_var_list_no_open, + cp_parser_omp_var_list, cp_parser_omp_clause_copyin, + cp_parser_omp_clause_default, cp_parser_omp_clause_if, + cp_parser_omp_clause_nowait, + cp_parser_omp_clause_num_threads, + cp_parser_omp_clause_ordered, + cp_parser_omp_clause_reduction, + cp_parser_omp_clause_schedule, + cp_parser_omp_all_clauses, + cp_parser_omp_structured_block, cp_parser_omp_atomic, + cp_parser_omp_barrier, cp_parser_omp_critical, + cp_parser_omp_flush, cp_parser_omp_for_loop, + cp_parser_omp_for, cp_parser_omp_master, + cp_parser_omp_ordered, cp_parser_omp_sections_scope, + cp_parser_omp_sections, cp_parser_omp_parallel, + cp_parser_omp_single, cp_parser_omp_threadprivate, + cp_parser_omp_construct): New. + (cp_parser_pragma): Handle OpenMP pragmas. + * semantics.c (finish_omp_threadprivate): New. + (begin_omp_parallel, finish_omp_parallel): New. + + 2005-10-11 Richard Henderson + + * parser.c (struct cp_token): Add pragma_kind. + (eof_token): Initialize it. + (cp_lexer_handle_pragma): Remove. + (cp_parser_initial_pragma): New. + (cp_lexer_new_main): Use it. + (cp_lexer_get_preprocessor_token): Initialize pragma_kind. + (cp_lexer_print_token): Don't handle CPP_PRAGMA. + (cp_parser_skip_to_pragma_eol): New. + (cp_parser_error): Use it. + (pragma_lex): New. + + 2005-10-09 Richard Henderson + + * lex.c (parse_strconst_pragma): Update for c_lex name change. + (handle_pragma_java_exceptions): Likewise. + * parser.c (cp_lexer_new_main): Likewise. + + 2005-10-06 Richard Henderson + + * parser.c (cp_lexer_new_main): Comment out defer_pragmas. + (cp_lexer_handle_pragma): Comment out + cpp_handle_deferred_pragma. + + 2005-10-01 Richard Henderson + + * name-lookup.c (lookup_name): Remove prefer_type argument. + (lookup_name_prefer_type): New function. + * name-lookup.h (lookup_name_prefer_type): Declare it. + * decl.c (lookup_and_check_tag): Use it. + * pt.c (tsubst_friend_class): Likewise. Update for + lookup_name change. + (lookup_template_class, tsubst_copy_and_build): Likewise. + +2006-03-06 Volker Reichelt + + PR c++/15759 + * tree.c (bot_manip): Don't call mark_used. + +2006-03-02 Mike Stump + + * decl2.c (import_export_decl): Remove redundant call to + targetm.cxx.key_method_may_be_inline (). + +2006-03-02 Richard Sandiford + + * decl.c (start_decl): Use have_global_bss_p when deciding + whether to make the decl common. + +2006-03-01 Mike Stump + + PR darwin/25908 + * decl2.c (import_export_decl): Fix ABI breakage on darwin. + +2006-02-24 Geoffrey Keating + + * except.c (expand_start_catch_block): Handle + flag_use_cxa_get_exception_ptr. + +2006-02-22 Volker Reichelt + + PR c++/26291 + * decl.c (grok_op_properties): Check for ellipsis in arguments of + operators. + +2006-02-20 Rafael Ávila de EspĂ­ndola + + * Make-lang.in (C++): Remove. + (.PHONY): Remove C++. + +2006-02-18 Mark Mitchell + + PR c++/26266 + * cp-tree.h (cp_finish_decl): Adjust declaration. + (grokbitfield): Likewise. + (finish_static_data_member_decl): Likewise. + * init.c (constant_value_1): Ensure processing_template_decl when + folding non-dependent initializers for static data members of + dependent types. Return error_mark_node for erroneous + initailizers. + * class.c (get_vtable_decl): Use finish_decl, not cp_finish_decl. + * decl.c (cp_make_fname_decl): Adjust call to cp_finish_decl. + (cp_finish_decl): Add init_const_expr_p parameter. Set + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P here. + (finish_decl): Adjust call to cp_finish_decl. + (compute_array_index_type): Robustify. + (start_method): Use finish_decl, not cp_finish_decl. + * rtti.c (emit_tinfo_decl): Likewise. + * except.c (initialize_handler_parm): Adjust call to + cp_finish_decl. + (expand_start_catch_block): Likewise. + * cvt.c (build_up_reference): Adjust call to cp_finish_decl. + * pt.c (instantiate_class_template): Adjust call to + finish_static_data_member_decl. + (tsubst_expr): Use finish_decl, not cp_finish_decl. + (instantiate_decl): Adjust call to cp_finish_decl. + * name-lookup.c (pushdecl_top_level_1): Use finish_decl, not + cp_finish_decl. + * decl2.c (finish_static_data_member_decl): Add init_const_expr_p + parameter. + (grokfield): Likewise. + * parser.c (cp_parser_condition): Check for constant initializers. + (cp_parser_init_declarator): Adjust calls to grokfield and + cp_finish_decl. Don't set + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P here. + (cp_parser_member_declaration): Likewise. + (cp_parser_objc_class_ivars): Likewise. + +2006-02-14 Volker Reichelt + + * call.c (standard_conversion): Return NULL instead of 0. + (build_user_type_conversion_1): Likewise. + (tourney): Likewise. + * decl.c (redeclaration_error_message): Likewise. + * error.c (language_to_string): Likewise. + +2006-02-13 Volker Reichelt + + * cp-tree.h (warn_hidden): Remove prototype. + * class.c (warn_hidden): Make static. + + * cp-tree.h (build_type_conversion): Remove prototype. + * cvt.c (build_type_conversion): Add prototype, make static. + + * cp-tree.h (push_tinst_level): Remove prototype. + (pop_tinst_level): Likewise. + * pt.c (push_tinst_level): Add prototype, make static. + (pop_tinst_level): Likewise. + +2006-02-13 Volker Reichelt + + * decl.c (grokdeclarator): Return NULL_TREE instead of 0. + * typeck.c (unary_complex_lvalue): Likewise. + +2006-02-13 Volker Reichelt + + * lex.c (parse_strconst_pragma): Return error_mark_node instead of + "(tree)-1" to indicate failure. Simplify. + (handle_pragma_interface): Test for error_mark_node instead of + "(tree)-1". + (handle_pragma_implementation): Likewise. + +2006-02-13 Volker Reichelt + + PR c++/26151 + * parser.c (cp_parser_decl_specifier_seq): Check for duplicate + decl-specifiers. Remove extra check for duplicate 'friend'. + * decl.c (grokdeclarator): Remove check for duplicate + decl-specifiers. Set longlong together with long_p. + +2006-02-12 Jason Merrill + + PR c++/24996 + * except.c (build_throw): Add a CLEANUP_POINT_EXPR inside the + TRY_CATCH_EXPR or MUST_NOT_THROW_EXPR. + +2006-02-10 Volker Reichelt + + * class.c (debug_class): Remove extern. + (debug_thunks): Likewise. + +2006-02-09 Gabriel Dos Reis + + * typeck.c (string_conv_p): Don't test for flag_const_strings. + +2006-02-08 Jason Merrill + + PR c++/25979 + * cp-gimplify.c (cp_gimplify_expr): Don't call + cp_gimplify_init_expr for MODIFY_EXPRs. + * typeck2.c (split_nonconstant_init_1): Use INIT_EXPR. + +2006-02-08 Volker Reichelt + + PR c++/26071 + * decl.c (grokdeclarator): Set dname also for destructor. + + PR c++/26070 + * decl.c (grokdeclarator): Clear storage_class together with staticp. + +2006-02-07 Gabriel Dos Reis + + * cp-tree.h (tf_warning_or_error): Renamed from tf_warn_or_error. + (cp_build_qualified_type): Propogate renaming. + * call.c (convert_like_real): Likewise. + * cvt.c (cp_convert_to_pointer, convert_to_reference): Likewise. + * decl.c (make_typename_type, grokdeclarator): Likewise. + * pt.c (tsubst_friend_function, instantiate_class_template, + tsubst_default_argument, instantiate_decl, + tsubst_initializer_list, tsubst_enum): Likewise. + * semantics.c (finish_template_type): Likewise. + * typeck.c (build_ptrmemfunc, convert_for_assignment): Likewise. + +2006-02-07 Dirk Mueller + + * typeck.c (build_binary_op): Annotate div-by-zero + warnings to make -Wno-div-by-zero have an effect. + +2006-02-07 Mark Mitchell + + PR c++/9737 + * pt.c (coerce_template_template_parms): Do not templates with + excess default arguments to match template template parameters + with fewer parameters. + (coerce_template_parms): Add use_default_args parameter; use + default arguments only when true. + (lookup_template_class): Adjust call to coerce_template_parms. + (fn_type_unification): Likewise. + (unify): Likewise. + (get_bindings): Likewise. + (dependent_type_p): Add assertions. + +2006-02-06 Roger Sayle + + * decl.c (grokdeclarator): Don't bother checking for CHAR_TYPE. + * rtti.c (typeinfo_in_lib_p): Likewise. + * cp-tree.h (INTEGRAL_CODE_P, CP_INTEGRAL_TYPE_P): Likewise. + * name-lookup.c (arg_assoc_type): Likewise. + +2006-02-04 Gabriel Dos Reis + + * cp-tree.h (tf_warn_or_error): New substituion flag. + (cp_build_qualified_type): Use it. + * call.c (convert_like_real): Likewise. + * cvt.c (cp_convert_to_pointer): Likewise. + (convert_to_reference): Likewise. + * decl.c (make_typename_type): Likewise. + (grokdeclarator): Likewise. + * pt.c (tsubst_friend_function): Likewise. + (tsubst_friend_class): Likewise. + (instantiate_class_template): Likewise. + (tsubst_default_argument): Likewise. + (instantiate_decl): Likewise. + (tsubst_initializer_list): Likewise. + (tsubst_enum): Likewise. + * semantics.c (finish_template_type): Likewise. + * typeck.c (build_ptrmemfunc): Likewise. + (convert_for_assignment): Likewise. + +2006-02-03 Lee Millward + + * typeck.c (string_conv_p): Pass appropiate + OPT_Wxxxx values when calling warning(). + (build_array_ref, cxx_mark_addressable): Likewise. + (check_return_expr): Likewise. + + * init.c (perform_member_init): Likewise. + (sort_mem_initializers, emit_mem_initializers): Likewise. + + * class.c (check_field_decls): Likewise. + (warn_about_ambiguous_bases): Likewise. + + * decl.c (pop_label, poplevel): Likewise. + (duplicate_decls, grok_op_properties): Likewise. + (start_preparsed_function, finish_function): Likewise. + + * name-lookup.c (pushdecl_maybe_friend): Likewise. + (pushdecl_maybe_friend): Likewise. + + * parser.c (cp_parser_warn_min_max): Likewise. + (cp_parser_cast_expression): Likewise. + + * method.c (lazily_declare_fn): Likewise. + * cvt.c (convert_to_void): Likewise. + * mangle.c (finish_mangling): Likewise. + * cp-gimplify.c (gimplify_expr_stmt): Likewise. + +2006-02-03 Mark Mitchell + + * name-lookup.c (do_class_using_decl): Use IDENTIFIER_TYPENAME_P, + not IDENTIFIER_OPNAME_P. + +2006-01-31 Mark Mitchell + + PR c++/25342 + * cp-tree.h (DECL_TEMPLATE_SPECIALIZATIONS): Revise + documentation. + * pt.c (determine_specialization): Use INNERMOST_TEMPLATE_PARMS, + not TREE_VALUE. + (instantiate_class_template): Simplify. + (verify_class_unification): Remove. + (unify): Document parameters. Use INNERMOST_TEMPLATE_ARGS to + permit multiple levels of template arguments. + (more_specialized_class): Simplify. + (get_class_bindings): Pass full arguments to unify. Fold + verify_class_unification into this function. Return full + arguments. + (most_specialized_class): Adjust for changes to + get_class_bindings. Issue errors here for ambiguity. Return the + fully deduced arguments for the most specialized class, in + addition to the partial specialization. + +2006-01-31 Ben Elliston + + * mangle.c: Comment fix. + +2006-01-29 Gabriel Dos Reis + + * Make-lang.in (cp-warn): Include CXX_COMPAT_WARN. + * repo.c (extract_string, afgets): Use cast when converting from + void *. + +2006-01-29 Gabriel Dos Reis + + * call.c (alloc_conversion): Use cast when converting from void *. + (alloc_conversions): Likewise. + (add_candidate): Likewise. + (print_z_candidates): Likewise. + (add_warning): Likewise. + * pt.c (retrieve_local_specialization): Likewise. + (process_partial_specialization): Likewise. + (mangle_class_name_for_template): Likewise. + (tsubst_template_args): Likewise. + * typeck2.c (pat_calc_hash): Likewise. + (pat_compare): Likewise. + (abstract_virtuals_error): Likewise. + * class.c (method_name_cmp): Likewise. + (resort_method_name_cmp): Likewise. + (get_vfield_name): Likewise. + * decl2.c (generate_ctor_and_dtor_functions_for_priority): Likewise. + * lex.c (init_reswords): Likewise. + * rtti.c (create_pseudo_type_info): Likewise. + * search.c (dfs_lookup_base): Likewise. + (dfs_dcast_hint_pre): Likewise. + (dfs_dcast_hint_post): Likewise. + * tree.c (hash_tree_cons): Likewise. + * repo.c (extract_string): Likewise. + (afgets): Likewise. + * cp-objcp-common.c (decl_shadowed_for_var_lookup): Likewise. + * g++spec.c (lang_specific_driver): Likewise. + +2006-01-28 Gabriel Dos Reis + + * call.c (joust): Pass option code to warning. Use inform for + explanation. + * class.c (check_bases): Likewise. + (maybe_warn_about_overly_private_class): Likewise. + (check_field_decls): Likewise. + (layout_empty_base): Likewise. + (layout_virtual_bases): Likewise. + (layout_class_type): Likewise. + +2006-01-28 Mark Mitchell + + PR c++/25999 + * decl.c (start_preparsed_function): Call maybe_apply_pragma_weak + here, not ... + (start_function): ... here. + +2006-01-28 Mark Mitchell + + PR c++/25855 + * class.c (resolve_address_of_overloaded_function): Adjust use of + return value from most_specialized_instantiation. + * pt.c (determine_specialization): Avoid multiple calls to + get_bindings. + (most_specialized_instantiation): When a tie occurs, set the + current presumed champion to the next template. Return the + TREE_LIST node containing the template, rather than the template + itself. + (most_specialized): Remove. + * name-lookup.c (push_overloaded_decl): When duplicate_decls + indicates a failed redeclaration, report that to callers. + +2006-01-26 Jason Merrill + + PR c++/16021 + * name-lookup.c (parse_using_directive): Require strong using to + name a nested namespace. + +2006-01-25 Volker Reichelt + + Revert: + * cp-tree.h (do_poplevel): Remove prototype. + * semantics.c (do_poplevel): Add prototype. Make static. + + Revert: + * cp-tree.h (default_conversion): Remove prototype. + * typeck.c (default_conversion): Make static. + +2006-01-25 Volker Reichelt + + * cp-tree.h (get_primary_binfo): Remove prototype. + (push_using_decl): Likewise. + (current_template_args): Likewise. + (more_specialized_class): Likewise. + (mark_class_instantiated): Likewise. + (default_conversion): Likewise. + (pfn_from_ptrmemfunc): Likewise. + * class.c (get_primary_binfo): Add prototype, make static, simplify. + * name-lookup.c (push_using_decl): Make static. + * pt.c (current_template_args): Likewise. + (more_specialized_class): Likewise. + (mark_class_instantiated): Likewise. + * typeck.c (default_conversion): Make static. + (pfn_from_ptrmemfunc): Add prototype, make static. + +2006-01-24 Dirk Mueller + + * typeck.c (build_binary_op): Use OPT_Wfloat_equal in warning(). + +2006-01-24 Volker Reichelt + + PR c++/25552 + * parser.c (cp_parser_unqualified_id): Check that destructor name + and scope match. + * call.c (check_dtor_name): Do not expect a BIT_NOT_EXPR. + Adjust comment. Return early if possible. + Use same_type_p to compare types. + * typeck.c (lookup_destructor): Adjust call to check_dtor_name. + +2006-01-24 Mark Mitchell + + * semantics.c: Remove outdated comment. + +2006-01-23 Volker Reichelt + + * cp-tree.h (do_poplevel): Remove prototype. + * semantics.c (do_poplevel): Add prototype. Make static. + + * cp-tree.h (original_type): Remove prototype. + * typeck.c (original_type): Make static. + + * cp-tree.h (declare_global_var): Remove prototype. + * decl.c (declare_global_var): Make static. + + * cp-tree.h (implicitly_declare_fn): Remove prototype. + * method.c (implicitly_declare_fn): Make static. + + * cp-tree.h (fold_decl_constant_value): Remove prototype. + * pt.c (fold_decl_constant_value): Make static. + + * cp-tree.h (build_x_delete): Remove prototype. + * init.c (build_vec_delete_1): Call build_op_delete_call directly + and not via build_x_delete. + (build_x_delete): Remove. + + * cp-tree.h (get_vtt_name): Remove prototype. + * class.c (get_vtt_name): Remove. + (build_vtt): Call mangle_vtt_for_type instead of get_vtt_name. + +2006-01-22 Gabriel Dos Reis + + * rtti.c (build_dynamic_cast): Fix comment. + +2006-01-22 Gabriel Dos Reis + + PR c++/10891 + * rtti.c (build_dynamic_cast): Reject dynamic_cast use if + -fno-rtti. + +2006-01-21 Mark Mitchell + + PR c++/25895 + * class.c (build_base_path): Generate a NOP_EXPR instead of a + COMPONENT_REF if the base and derived classes are at the same + address. + + PR c++/25856 + * decl.c (begin_destructor_body): Robustify. + + PR c++/25858 + * parser.c (cp_parser_direct_declarator): Robustify. + +2006-01-20 Volker Reichelt + + * parser.c (cp_lexer_next_token_is_keyword): Simplify. + + * parser.c (clear_decl_specs): Remove prototype. + + * parser.c (cp_parser_expression_fn): Remove. + + * call.c (add_builtin_candidates): Remove superfluous return. + * name-lookup.c (do_toplevel_using_decl): Likewise. + * parser.c (cp_parser_type_specifier_seq): Likewise. + (cp_parser_save_default_args): Likewise. + +2006-01-20 Dirk Mueller + + PR c++/5520 + * semantics.c (finish_if_stmt): Call empty_body_warning. + * parser.c (cp_parser_implicitly_scoped_statement): + Mark empty statement with an empty stmt. + +2006-01-19 Mark Mitchell + + PR c++/22136 + * name-lookup.c (do_class_using_decl): Don't try to look up base + classes in templates with dependent base types. + +2006-01-19 Volker Reichelt + + PR c++/25854 + * pt.c (maybe_process_partial_specialization): Return early on + error_mark_node. + +2006-01-19 Volker Reichelt + + PR c++/16829 + * decl.c (start_preparsed_function): Check default arguments + unconditionally. + * name-lookup.c (pushdecl_maybe_friend): Check default arguments + of all functions and function templates. + * parser.c (cp_parser_late_parsing_default_args): Check default + arguments. + * decl2.c (check_default_args): Set missing default arguments to + error_mark_node. + +2006-01-18 Mark Mitchell + + PR c++/25836 + * cp-tree.h (push_class_stack): New function. + (pop_class_stack): Likewise. + * class.c (class_stack_node): Add hidden field. + (pushclass): Clear it. + (push_class_stack): New function. + (pop_class_stack): Likewise. + (currently_open_class): Ignore hidden classes. + (currently_open_derived_class): Likewise. + * name-lookup.c (push_to_top_level): Call push_class_stack. + (pop_from_top_level): Call pop_class_stack. + +2006-01-18 Kazu Hirata + + * tree.c (find_tree_t, find_tree): Remove. + * cp-tree.h: Remove the prototype for find_tree. + +2006-01-18 Jakub Jelinek + + * search.c (lookup_conversions_r): Fix a pasto. + +2006-01-17 Eric Christopher + + * call.c (convert_like_real): When issuing conversion + warnings, depend on OPT_Wconversion. + * cvt.c (build_expr_type_conversion): Ditto. + +2006-01-17 Kazu Hirata + + * name-lookup.c (lookup_namespace_name): Remove. + * name-lookup.h: Remove the prototype for + lookup_namespace_name. + +2006-01-17 Jakub Jelinek + + PR c/25682 + * decl.c (compute_array_index_type): After issuing not an integral + constant-expression error, set size to 1 to avoid ICEs later on. + +2006-01-16 Ian Lance Taylor + + * parser.c: Include "cgraph.h". + (cp_parser_asm_definition): Call cgraph_add_asm_node rather than + assemble_asm. + +2006-01-16 Rafael Ávila de EspĂ­ndola + + * g++spec.c (lang_specific_spec_functions): Remove. + +2006-01-15 Gabriel Dos Reis + + * decl.c (check_initializer): Fix thinko. + +2006-01-14 Mark Mitchell + + PR c++/25663 + * parser.c (cp_parser_direct_declarator): Use cp_parser_error + instead of error. + +2006-01-13 Jason Merrill + + * pt.c (check_explicit_specialization): Use CP_DECL_CONTEXT even more. + + * name-lookup.c (set_decl_namespace): Use CP_DECL_CONTEXT. + * pt.c (check_explicit_specialization): Likewise. + +2006-01-12 Jason Merrill + + PR libstdc++/24660 + * pt.c (check_explicit_specialization): Handle namespace + association. + * name-lookup.c (set_decl_namespace): Likewise. + +2006-01-12 Nathan Sidwell + + PR c++/24824 + * class.c (handle_using_decl): Pass correct scope to + cp_emit_debug_info_for_using. + +2006-01-11 Nathan Sidwell + + PR c++/25386 + * tree.c (lvalue_p_1): Any part of a COMPONENT_REF affects + packedness. + +2006-01-06 Gabriel Dos Reis + + * parser.c (cp_parser_primary_expression): Document the grammar + for the built-in offsetof, a GNU extension. + +2006-01-04 Zdenek Dvorak + + PR c++/25632 + * init.c (constant_value_1): Unshare use of DECL_INITIAL. Fix a typo + in condition. + +2006-01-04 Chris Lattner + + * typeck2.c: update copyright to 2006 + (split_nonconstant_init_1): Set TREE_CONSTANT to true. + +2006-01-04 Mark Mitchell + + PR c++/24782 + * parser.c (cp_parser_nested_name_specifier_opt): Preserve access + checks, even when parsing tentatively. + +2006-01-04 Richard Henderson + + Merge from gomp branch. + * lex.c (handle_pragma_java_exceptions): Fix whitespace. + * parser.c (struct cp_token): Add pragma_kind. + (eof_token): Update to match. + (struct cp_lexer): Add in_pragma; rearrange next for better packing. + (cp_parser_initial_pragma): New. + (cp_lexer_new_main): Use it. Don't bother clearing + c_lex_return_raw_strings. + (cp_lexer_get_preprocessor_token): Always initialize keyword + and pragma_kind fields. Handle CPP_PRAGMA. + (cp_lexer_consume_token): Don't allow CPP_PRAGMA_EOL when + in_pragma is set. + (cp_lexer_handle_pragma): Remove. Update callers to cp_parser_pragma. + (cp_lexer_print_token) : Don't print as a string. + (cp_parser_skip_to_pragma_eol): New. + (cp_parser_error): Use it. + (cp_parser_skip_to_closing_parenthesis): Stop at CPP_PRAGMA_EOL; + rearrange with switch statement. + (cp_parser_skip_to_end_of_statement): Likewise. + (cp_parser_skip_to_end_of_block_or_statement): Likewise. + (cp_parser_skip_to_closing_brace): Likewise. + (cp_parser_skip_until_found): Likewise. + (cp_parser_statement): Add in_compound argument; update callers. + Use it to decide how to handle pragma parsing. + (cp_parser_labeled_statement): Add in_compound argument; pass + it on to cp_parser_statement. + (cp_parser_statement_seq_opt): Stop at CPP_PRAGMA_EOL. + (cp_parser_declaration_seq_opt): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_member_specification_opt): Likewise. + (cp_parser_function_definition_after_decl): Likewise. + (cp_parser_cache_group): Handle CPP_PRAGMA/CPP_PRAGMA_EOL pairs. + (cp_parser_pragma): New. + (pragma_lex): New. + +2006-01-04 Dirk Mueller + + * decl.c (finish_constructor_body): create simple + compound stmt instead of a if(1) { } construct. + +2006-01-03 Mark Mitchell + + PR c++/25492 + * name-lookup.c (push_class_level_binding): When a derived class + provides a type binding, eliminate any type binding from a base + class. + + PR c++/25625 + * repo.c (repo_emit_p): Always instantiate static data members + initialized by constant expressions, so that there values are + available. + +2006-01-02 Mark Mitchell + + PR c++/25635 + * class.c (add_method): Set TYPE_HAS_CONVERSION for classes with a + conversion operator. + * decl.c (grokdeclarator): Do not set TYPE_HAS_CONVERSION here. + + PR c++/25638 + * class.c (add_method): Never associate more than one destructor + with a single class. + + PR c++/25637 + * cp-tree.h (do_friend): Adjust prototype. + * decl.c (grokfndecl): Make funcdef_flag a bool, not an int. + (grokdeclarator): Likewise. Refine check for invalid + declarations/definitions of member functions outside of their own + class. + * friend.c (do_friend): Make funcdef_flag a bool, not an int. + + PR c++/25633 + * parser.c (cp_parser_mem_initializer_list): Check result of + cp_parser_mem_initializer against error_mark_node, not NULL_TREE. + (cp_parser_mem_initializer): Return error_mark_node for failure. + + PR c++/25634 + * parser.c (cp_parser_template_parameter_list): Call + begin_template_parm_list and end_template_parm_list here. + (cp_parser_type_parameter): Not here. + (cp_parser_template_declaration_after_export): Or here. + (cp_parser_elaborated_type_specifier): Call + cp_parser_check_template_parameters. + + * tree.c (build_target_expr_with_type): Use force_target_expr. + + * decl2.c (mark_used): Fix typo in comment. + +2006-01-02 Volker Reichelt + + * parser.c (cp_parser_using_declaration): Skip name-lookup on + invalid scope. + + + +Copyright (C) 2006 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2007 b/gcc/cp/ChangeLog-2007 new file mode 100644 index 000000000..817bab6db --- /dev/null +++ b/gcc/cp/ChangeLog-2007 @@ -0,0 +1,3343 @@ +2007-12-20 Jason Merrill + + PR c++/34111 + * call.c (standard_conversion): Derived-to-base is considered a + standard conversion. + +2007-12-19 Jakub Jelinek + + PR c++/34513 + * parser.c (cp_parser_omp_parallel): For non-combined parallel + call cp_parser_statement rather than + cp_parser_already_scoped_statement. + +2007-12-18 Jason Merrill + + PR c++/34206 + * pt.c (tsubst_aggr_type): Do nothing if the type already doesn't + use template parms. + (dependent_type_p_r): Handle the domain of an array. + +2007-12-18 Douglas Gregor + Jakub Jelinek + + PR c++/32565 + PR c++/33943 + PR c++/33965 + * pt.c (template_template_parm_bindings_ok_p): New; verifies + bindings of template template parameters after all template + arguments have been deduced. + (coerce_template_parms): Don't complain when COMPLAIN doesn't + include tf_error. + (fn_type_unification): Use template_template_parm_bindings_ok_p. + (unify): Deal with variadic, bound template template parameters. + (get_class_bindings): Use template_template_parm_bindings_ok_p. + +2007-12-18 Jakub Jelinek + + PR c++/34488 + * decl.c (grokdeclarator): Reject friend sfk_constructor + FUNCTION_TYPE. + +2007-12-17 Jakub Jelinek + + PR c/34506 + * parser.c (cp_parser_omp_all_clauses): Accept optional comma + in between clauses. + +2007-12-15 Alexandre Oliva + + PR debug/7081 + * cp-lang.c (cp_classify_record): New. + (LANG_HOOKS_CLASSIFY_RECORD): Override. + +2007-12-11 Jakub Jelinek + + PR c++/34238 + * decl2.c (cp_write_global_declarations): Revert 2007-11-22 change. + + PR c++/34364 + * rtti.c (build_dynamic_cast): Call convert_from_reference even for + dynamic_cast in a template. + +2007-12-10 Simon Martin + + PR c++/34059 + * typeck.c (build_class_member_access_expr): Compute MEMBER_SCOPE from + MEMBER's BASELINK_ACCESS_BINFO instead of its BASELINK_BINFO. + +2007-12-10 Jakub Jelinek + + PR c++/34395 + * error.c (dump_type_prefix, dump_type_suffix): Handle + TYPE_PACK_EXPANSION. + + PR c++/34394 + * error.c (dump_expr): Handle ABS_EXPR. + +2007-12-09 Jakub Jelinek + + PR c++/34178 + PR c++/34340 + * repo.c (repo_emit_p): Return 2 for DECL_INTEGRAL_CONSTANT_VAR_P + in class scope rather than DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P. + Return 2 also if DECL_EXPLICIT_INSTANTIATION. + * decl2.c (import_export_decl): Don't make VAR_DECLs import_p when + flag_use_repository and repo_emit_p returned 2. + +2007-12-06 Jakub Jelinek + + PR c++/34336 + * tree.c (stabilize_call, stabilize_init): Do nothing if + processing_template_decl. + +2007-12-05 Jakub Jelinek + + PR c++/34271 + * semantics.c (finish_decltype_type): For SCOPE_REF issue an + error instead of assertion failure. + * parser.c (cp_parser_decltype): If closing paren is not found, + return error_mark_node. + +2007-12-04 Douglas Gregor + + PR c++/34101 + * name-lookup.c (arg_assoc_template_arg): Recurse on argument + packs. + (arg_assoc_type): We don't need to handle TYPE_ARGUMENT_PACK here, + since arg_assoc_template_arg will deal with them (better). + +2007-12-04 Douglas Gregor + + PR c++/33509 + * pt.c (tsubst_exception_specification): Handle substitutions into + member templates, where tsubst_pack_expansion returns a + TYPE_PACK_EXPANSION. + +2007-12-04 Douglas Gregor + + PR c++/33091 + * pt.c (unify_pack_expansion): If we didn't deduce any actual + bindings for the template parameter pack, don't try to keep the + empty deduced arguments. + (unify): If a parameter is a template-id whose template argument + list contains a pack expansion that is not at the end, then we + cannot unify against that template-id. + +2007-12-02 Paolo Carlini + + PR c++/34061 + * pt.c (current_template_args): Use error_operand_p. + +2007-12-02 Paolo Carlini + + PR c++/34273 + * error.c (dump_decl): Handle TREE_BINFO. + +2007-12-01 Ollie Wild + + PR c++/8171 + * typeck.c (build_binary_op): Add conversion of pointers to function + members appearing as operands to the equality operators. + +2007-11-30 Jakub Jelinek + + PR c++/34275 + * error.c (dump_expr): Handle OBJ_TYPE_REF. + +2007-11-29 Jakub Jelinek + + PR c++/34270 + * tree.c (lvalue_p_1) : Handle x ?: y + in templates. + * typeck.c (is_bitfield_expr_with_lowered_type) : + Likewise. + + PR c++/34267 + PR c++/34268 + * parser.c (cp_parser_decltype): Don't call finish_id_expression + on ~type. + * semantics.c (finish_decltype_type): Issue error on types, TYPE_DECLs + and ~type early. + +2007-11-27 Jakub Jelinek + + PR tree-optimization/34181 + * method.c (use_thunk): Don't inline the call in the thunk. + + PR c++/34213 + * tree.c (decl_linkage): Static data members and static member + functions in anonymous ns classes are lk_external. + +2007-11-26 Andreas Krebbel + + PR c++/34081 + * decl.c (start_preparsed_function): Pass + processing_template_decl for the new allocate_struct_function + parameter. + +2007-11-25 Richard Guenther + + * decl.c (poplevel): Use BLOCK_CHAIN. + +2007-11-24 Ollie Wild + + * typeck.c (delta_from_ptrmemfunc): New function. + (get_member_function_from_ptrfunc): Call delta_from_ptrmemfunc. + (build_binary_op): Call delta_from_ptrmemfunc. + +2007-11-23 Jakub Jelinek + + PR c++/30293 + PR c++/30294 + * decl.c (cp_finish_decl): Disallow variable or field + definitions if extern "Java" aggregates. + (grokparms): Disallow parameters with extern "Java" + aggregates. + (check_function_type): Disallow function return values + with extern "Java" aggregates. + * init.c (build_new_1): Disallow placement new with + extern "Java" aggregates. + +2007-11-23 Mark Mitchell + Manuel Lopez-Ibanez + + PR c++/5310 + * call.c (convert_like_real): Build a zero constant when __null is + converted to an integer type. + +2007-11-22 Jakub Jelinek + + PR c++/34094 + * decl2.c (cp_write_global_declarations): Issue error about static + data members in anonymous namespace which are declared and used, + but not defined. + +2007-11-20 Jakub Jelinek + + PR c++/34089 + * parser.c (cp_parser_class_head): Reject function template ids. + + PR c++/28879 + * tree.c (build_cplus_array_type_1): Don't pass any VLA types + when processing_template_decl to build_array_type. + + PR c++/33962 + * pt.c (more_specialized_fn): Don't segfault if one or + both argument list end with ellipsis. + +2007-11-18 Jakub Jelinek + + PR c++/30988 + * semantics.c (finish_call_expr): Set + current_function_returns_abnormally if fn is noreturn FUNCTION_DECL + or OVERLOAD with all noreturn functions. + +2007-11-16 Jakub Jelinek + + PR c++/34100 + * pt.c (apply_late_template_attributes): Do nothing if decl's type is + error_mark_node. + +2007-11-13 Jakub Jelinek + + PR c++/34054 + PR c++/34056 + PR c++/34057 + PR c++/34058 + PR c++/34060 + * pt.c (find_parameter_packs_r): If ppd->set_packs_to_error, + set to error_mark_node the outermost POINTER_TYPE to the pack if + it is seen in a POINTER_TYPE. + (push_template_decl_real): If check_for_bare_parameter_packs + fails for function return type, set the return type to + integer_type_node. If check_for_bare_parameter_packs failed + for non-function, return error_mark_node. + + PR c++/29225 + * call.c (build_new_op): Call resolve_args before calling + build_over_call. + +2007-11-11 Tom Tromey + + PR c++/17577: + * lex.c (handle_pragma_implementation): Use cpp_included_before. + +2007-11-12 Manuel Lopez-Ibanez + + PR c++/8570 + * pt.c (redeclare_class_template): Update error message. Use a + note to show the previous declaration. + (tsubst_friend_class): Use the location of the friend template as + the input location before calling redeclare_class_template. + +2007-11-11 Jakub Jelinek + + PR c++/34068 + * semantics.c (finish_pseudo_destructor_expr): Handle + object == error_mark_node. + +2007-11-10 Jakub Jelinek + + PR c++/32241 + * pt.c (tsubst_copy_and_build) : If object_type + is not scalar type, let finish_class_member_access_expr handle + diagnostics. Pass BIT_NOT_EXPR argument to + finish_pseudo_destructor_expr. Handle SCOPE_REF properly. + +2007-11-09 Douglas Gregor + + PR c++/33510 + * decl.c (cp_complete_array_type): If any of the initializer + elements are pack expansions, don't compute the array size yet. + +2007-11-08 Andrew Pinski + + PR c++/30297: + * tree.c (decl_linkage): Fields have no linkage. + +2007-11-08 Daniel Jacobowitz + + * class.c (build_ctor_vtbl_group): Lay out the new type and decl. + +2007-11-07 Douglas Gregor + + PR c++/33045 + PR c++/33837 + PR c++/33838 + * semantics.c (finish_decltype_type): See through INDIRECT_REFs. + Be careful with ERROR_MARK_NODEs. + * parser.c (cp_parser_check_access_in_redeclaration): Handle NULL + argument. + +2007-11-07 Jakub Jelinek + + PR c++/33501 + * call.c (build_over_call): Don't check TREE_ADDRESSABLE + on incomplete type. + +2007-11-06 Douglas Gregor + + PR c++/33977 + PR c++/33886 + * tree.c (c_build_qualified_type): Define bridge to + cp_build_qualified_type. + +2007-11-06 Douglas Gregor + + PR c++/31439 + PR c++/32114 + PR c++/32115 + PR c++/32125 + PR c++/32126 + PR c++/32127 + PR c++/32128 + PR c++/32253 + PR c++/32566 + * typeck.c (check_return_expr): Pass address of retval to + check_for_bare_parameter_packs. + * class.c (build_base_field): Tolerate bases that have no layout + due to errors. + (end_of_base): Ditto. + * tree.c (canonical_type_variant): Be careful with + ERROR_MARK_NODE. + * cp-tree.h (check_for_bare_parameter_packs): Now accepts a + tree*. + * pt.c (find_parameter_pack_data): Add set_packs_to_error field, + which states whether parameter packs should be replaced with + ERROR_MARK_NODE. + (find_parameter_packs_r): Pass addresses to cp_walk_tree wherever + possible. If set_packs_to_error is set true, replace the parameter + pack with ERROR_MARK_NODE. Manage our own pointer sets. + (uses_parameter_packs): Don't set parameter packs to + ERROR_MARK_NODE. + (check_for_bare_parameter_packs): Now takes a pointer to a tree, + which may be modified (if it is a parameter pack). Instructs + find_parameter_packs_r to replace parameter packs with + ERROR_MARK_NODE (so that they won't cause errors later on). + (process_template_parm): Pass pointer to + check_for_bare_parameter_packs. + (process_partial_specialization): Replace pack expansions before + the end of the template argument list with ERROR_MARK_NODE. + (push_template_decl_real): Pass pointer to + check_for_bare_parameter_packs. Replace parameter packs not at the + end of the template parameter list with ERROR_MARK_NODE. + (convert_template_argument): Be more careful about using DECL_NAME + on only declarations. + (unify): Can't unify against ERROR_MARK_NODE. + * semantics.c (finish_cond): Pass pointer to + check_for_bare_parameter_packs. + (finish_expr_stmt): Ditto. + (finish_for_expr): Ditto. + (finish_switch_cond): Pass pointer to + check_for_bare_parameter_packs, and call it before we put the + condition into the statement. + (finish_mem_initializers): Pass pointer to + check_for_bare_parameter_packs. + (finish_member_declaration): Ditto. + * parser.c (cp_parser_base_clause): Ditto. + +2007-11-06 Jakub Jelinek + + PR target/33168 + * decl.c (cp_finish_decl): Call make_rtl_for_nonlocal_decl already + with the final TREE_READONLY flag in place. processing_template_decl + is known to be 0 in this part of function. + + PR c++/33894 + * cp-tree.h: Update comment - TYPE_LANG_FLAG_0 is not + OMP_ATOMIC_DEPENDENT_P in OMP_ATOMIC. + * pt.c (tsubst_expr): Assert OMP_ATOMIC_DEPENDENT_P. + * semantics.c (finish_omp_atomic): Revert most of the + 2007-02-05 changes, just keep the new representation of + OMP_ATOMIC_DEPENDENT_P OMP_ATOMIC. + +2007-11-05 H.J. Lu + + PR c++/33871 + * decl2.c (constrain_visibility): Clear DECL_ONE_ONLY if marked + local. + +2007-11-05 Douglas Gregor + + PR c++/33996 + PR c++/33235 + PR c++/33930 + * typeck.c (merge_types): Don't lose rvalue references when + merging types. + * call.c (build_over_call): Don't elide move constructors just + because the copy constructor is trivial (!). + (compare_ics): If comparing cv-qualifiers fails, we can still order + based on binding lvalues vs. rvalues. + +2007-11-05 Douglas Gregor + + PR c++/33939 + * pt.c (unify_pack_expansion): bring handling of function call + arguments into line with type_unification_real. + +2007-11-05 Manuel Lopez-Ibanez + + * typeck.c (build_binary_op): Use pedwarn instead of error for + consistency. + +2007-11-05 Jakub Jelinek + + PR c++/33836 + * parser.c (cp_parser_unary_expression): For &&label call + cp_parser_non_integral_constant_expression and return error_mark_node + if it returned true. + + PR c++/33969 + * decl.c (grokdeclarator): Don't call build_memfn_type if type + is neither FUNCTION_TYPE nor METHOD_TYPE. + +2007-11-02 Jakub Jelinek + + PR c++/33516 + * parser.c (cp_parser_nested_name_specifier_opt): Use + TYPE_MAIN_VARIANT (new_scope) as scope if new_scope is an incomplete + typedef of currently open class. + +2007-11-02 Paolo Carlini + + PR c++/33495 + * error.c (dump_expr): Deal specially with statements. + +2007-11-01 Jason Merrill + + PR c++/30897 + * pt.c (push_template_decl_real): Set DECL_CONTEXT on template + template parms. + (lookup_template_class): Use it to get the outer template args + for instantiating one. + + PR c++/29236 + * pt.c (reduce_template_parm_level): tsubst the parameters + of a template template parm. + +2007-11-01 Douglas Gregor + + PR c++/33955 + * pt.c (find_parameter_packs_r): Handle TYPENAME_TYPE. + +2007-11-01 Jakub Jelinek + + PR c++/32384 + * parser.c (cp_parser_postfix_dot_deref_expression): If + POSTFIX_EXPRESSION is type dependent, try to parse it as pseudo dtor + first and if that succeeds and type is SCALAR_TYPE_P, create + PSEUDO_DTOR_EXPR. + + PR c++/32260 + * rtti.c (enum_tinfo_kind): Fix TK_TYPE_INFO_TYPE comment. + (typeid_ok_p): Use the same alias set for abi::__type_info_pseudo + as for std::type_info. + +2007-10-31 Paolo Carlini + + PR c++/33494 + * cxx-pretty-print.c (pp_cxx_typeid_expression, + pp_cxx_delete_expression): Change to static linkage. + * cxx-pretty-print.h: Adjust declarations. + * error.c (dump_expr, case EXPR_PACK_EXPANSION, TYPEID_EXPR, + MEMBER_REF, DOTSTAR_EXPR, DELETE_EXPR, VEC_DELETE_EXPR, + MODOP_EXPR): Forward to pp_expression. + + * cxx-pretty-print.c (pp_cxx_expression, case NON_DEPENDENT_EXPR): + Fix typo. + +2007-10-31 Christian Bruel + Mark Mitchell + + PR c++/19531 + * typeck.c (check_return_expr): Don't set named_return_value_okay_p + if retval is volatile. + +2007-10-30 Jakub Jelinek + + PR c++/33616 + * decl2.c (build_offset_ref_call_from_tree): Call + build_non_dependent_expr on object prior to building ADDR_EXPR from it + if FN is DOTSTAR_EXPR. + +2007-10-30 Douglas Gregor + + PR c++/31993 + PR c++/32252 + * pt.c (find_parameter_packs_r): Fix typo in comment. + (convert_template_argument): Look at the pattern of a pack + expansion to determine what kind of entity we're converting. + (coerce_template_parameter_pack): When we have coerced a non-type + template parameter pack, substitute into the type of that pack. + (tsubst_pack_expansion): When our substitution of a parameter pack + is a "trivial" substitution of itself, just substitute into the + pack expansion rather than actually expanding. + +2007-10-29 Jakub Jelinek + + PR c++/33841 + * class.c (check_bitfield_decl): Don't set field's type to error_mark_node + for non-integral type bitfields. Return true if bitfield is correct, false + error has been diagnosed. + (check_field_decls): If check_bitfield_decl returned false, call also + check_field_decl. + +2007-10-28 Paolo Carlini + Mark Mitchell + + PR c++/30659 + * pt.c (do_decl_instantiation): If the VAR_DECL is not a + class member error out and return. + +2007-10-27 Jakub Jelinek + + * error.c (reinit_cxx_pp): Initialize cxx_pp->enclosing_scope + to current_function_decl rather than 0. + + PR c++/33844 + * cxx-pretty-print.c (pp_cxx_pm_expression) : Print + ->* rather than .*. + * error.c (dump_expr): Handle MEMBER_REF and DOTSTAR_EXPR. + +2007-10-27 Jason Merrill + + PR c++/5247 + * call.c (convert_default_arg): Detect recursion. + +2007-10-27 Jakub Jelinek + + PR c++/33842 + * cxx-pretty-print.h (pp_cxx_offsetof_expression): New prototype. + * cxx-pretty-print.c (pp_cxx_primary_expression): Handle + OFFSETOF_EXPR. + (pp_cxx_offsetof_expression_1, pp_cxx_offsetof_expression): New + functions. + * error.c (dump_expr): Handle OFFSETOF_EXPR. + +2007-10-26 Jason Merrill + + PR c++/24791 + * pt.c (get_template_info): New fn. + (template_class_depth): Use it. + (push_template_decl_real): Check that the template args of the + definition match the args of the previous declaration. + +2007-10-26 Paolo Carlini + + PR c++/31988 + * decl2.c (coerce_new_type): Do not allow a default argument for + the first parameter. + +2007-10-26 Douglas Gregor + + PR c++/33839 + * parser.c (cp_parser_decltype): Return ERROR_MARK_NODE if we + don't see the leading '('. Only lookup names if we get an + IDENTIFIER_NODE. + +2007-10-26 Jakub Jelinek + + PR c++/33744 + * parser.c (cp_parser_parenthesized_expression_list): Set + greater_than_is_operator_p to true in between the parens. + +2007-10-26 Paolo Carlini + + PR c++/31747 + * decl.c (grokdeclarator): In case of conflicting specifiers + just return error_mark_node. + +2007-10-26 Ollie Wild + + * expr.c (cxx_expand_expr): Removed. + * cp-tree.h (exx_expand_expr): Removed. + * cp-objcp-common.h (LANK_HOOKS_EXPAND_EXPR): Replace cxx_expand_expr + with c_expand_expr. + +2007-10-25 Paolo Carlini + + PR c++/33843 + * cxx-pretty-print.c (pp_cxx_unqualified_id): Deal with BIT_NOT_EXPR. + +2007-10-23 Jason Merrill + + PR c++/25950 (DR 391) + * call.c (struct conversion): Remove check_copy_constructor_p. + (reference_binding): Always bind a reference directly to a + compatible class rvalue. Pass down LOOKUP_NO_TEMP_BIND during + temporary creation. + (check_constructor_callable): Remove. + (convert_like_real): Don't call it. + (initialize_reference): Don't call check_constructor_callable. + (standard_conversion): Check LOOKUP_NO_CONVERSION instead of + LOOKUP_CONSTRUCTOR_CALLABLE. Don't require a temporary for base + conversions if LOOKUP_NO_TEMP_BIND. + (implicit_conversion): Pass through LOOKUP_NO_TEMP_BIND. + (build_user_type_conversion_1): Pass through LOOKUP_NO_TEMP_BIND for + second conversion. + * cp-tree.h (LOOKUP_CONSTRUCTOR_CALLABLE): Remove. + +2007-10-22 Jakub Jelinek + + PR c++/33372 + * semantics.c (finish_omp_clauses): Check !type_dependent_expression_p + before checking if its type is integral. + +2007-10-22 Jason Merrill + + PR c++/33620 + * class.c (finish_struct_bits): Copy TYPE_ATTRIBUTES. + * pt.c (apply_late_template_attributes): Splice out dependent + attributes from DECL_ATTRIBUTES. + + * decl.c (cxx_maybe_build_cleanup): Use build_address. + +2007-10-17 Manuel Lopez-Ibanez + + * typeck.c (build_binary_op) : Use appropriate warning option + instead of unnamed warning. + +2007-10-16 Paolo Carlini + + PR c++/31446 + * pt.c (current_template_args): Do not change TREE_LIST elements + with a TREE_VALUE of error_mark_node. + +2007-10-16 Mark Mitchell + + * typeck.c (cp_apply_type_quals_to_decl): Expand documentation. + * decl.c (start_decl): Tidy. + (start_decl_1): Call cp_apply_type_quals_to_decl after completing + the type. + (grokdeclarator): Clarify comment. + +2007-10-14 Andrew Pinski + + PR c++/30303 + * decl.c (grokfndecl): Return NULL after the "definition of + implicitly-declared" error happened. + +2007-10-12 Simon Martin + + PR c++/26698 + * call.c (build_user_type_conversion_1): Do not consider conversion + functions to convert a (possibly cv-qualified) object to the (possibly + cv-qualified) same object type (or a reference to it), to a (possibly + cv-qualified) base class of that type (or a reference to it). + +2007-10-12 Paolo Carlini + + * pt.c (tsubst): Use template_parm_level_and_index. + +2007-10-12 Jakub Jelinek + + PR c++/32121 + * parser.c (cp_parser_compound_statement): Handle label-declarations + at the beginning of the compound statement. + (cp_parser_block_declaration): Issue diagnostics about __label__ + not at the beginning of a block. + +2007-10-11 Paolo Carlini + + PR c++/33461 + * pt.c (coerce_template_parameter_pack): Do not pass error_mark_node + to convert_template_argument. + (coerce_template_parms): Return error_mark_node after fixed-length + error. + (tsubst_decl): Check for error_mark_node the return value of the + first tsubst in 'case VAR_DECL'. + +2007-10-08 Ollie Wild + + * typeck2.c (digest_init): Call cplus_expand_constant after + convert_for_initialization. + * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed. + * expr.c (cplus_expand_constant): Updated function description. + +2007-10-04 Jason Merrill + + PR c++/20416 + * call.c (initialize_reference): Handle local static reference + temps properly. + +2007-10-03 Jason Merrill + + PR c++/32470 + * name-lookup.c (push_namespace_with_attrs): Fold back into... + (push_namespace): Here. + (handle_namespace_attrs): New fn for the attr code. + (leave_scope): Don't pop_visibility. + * name-lookup.h (struct cp_binding_level): Remove has_visibility. + * parser.c (cp_parser_namespace_definition): Call + handle_namespace_attrs and pop_visibility as appropriate. + + PR c++/11756 + * mangle.c (write_type) [TYPEOF_TYPE]: Just sorry. + +2007-10-03 Alexandre Oliva + + * decl.c (duplicate_decls): Preserve linkage flags for mere + redeclarations of gnu_inline definitions. + +2007-10-03 Jason Merrill + + PR c++/15764 + * decl.c (wrap_cleanups_r): New fn. + (wrap_temporary_cleanups): New fn. + (initialize_local_var): Call it. + +2007-09-29 Jason Merrill + + PR c++/33094 + * decl.c (make_rtl_for_nonlocal_decl): It's ok for a member + constant to not have DECL_EXTERNAL if it's file-local. + +2007-09-28 Ollie Wild + + Revert + 2007-09-27 Ollie Wild + + * typeck2.c (digest_init): Call cplus_expand_constant after + convert_for_initialization. + * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed. + * expr.c (cplus_expand_constant): Updated function description. + +2007-09-28 Jason Merrill + + PR c++/10179 + * class.c (layout_empty_base): Take rli parameter, update + rli->record_align if empty base has user-specified alignment. + (build_base_field): Pass rli to it. + +2007-09-28 Paolo Carlini + + PR c++/33213 + * error.c (dump_decl): Deal with TYPE_PACK_EXPANSION. + +2007-09-28 Paolo Carlini + + PR c++/33118 + * error.c (dump_expr): Deal with ARGUMENT_PACK_SELECT. + (dump_type): Use dump_template_argument for TYPE_ARGUMENT_PACK. + (dump_parameters): Just call dump_type for argument packs too. + +2007-09-28 Jakub Jelinek + + PR c++/31434 + * tree.c (cp_build_qualified_type_real): Handle TYPE_PACK_EXPANSION + qualification by creating qualified PACK_EXPANSION_PATTERN and + then calling make_pack_expansion on it. + +2007-09-27 Ollie Wild + + * typeck2.c (digest_init): Call cplus_expand_constant after + convert_for_initialization. + * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed. + * expr.c (cplus_expand_constant): Updated function description. + +2007-09-27 Jason Merrill + + PR c++/33571 + * decl2.c (is_late_template_attribute): Don't crash on unknown + attribute. + +2007-09-27 Paolo Carlini + + PR c++/33493 + * error.c (dump_expr): Deal with DELETE_EXPR and VEC_DELETE_EXPR. + * cxx-pretty-print.c (pp_cxx_delete_expression): Add missing + spaces in the formatting. + * cxx-pretty-print.h (pp_cxx_delete_expression): Declare. + +2007-09-27 Jakub Jelinek + + * error.c (cxx_print_error_function): Add third argument, pass + it over to lhd_print_error_function. + (cp_print_error_function): If diagnostic->abstract_origin, print + virtual backtrace. + * cp-tree.h (struct diagnostic_info): New forward decl. + (cxx_print_error_function): Add third argument. + +2007-09-25 Simon Martin + + PR c++/33207 + * name-lookup.c (pushtag): Do not create an implicit typedef before + the associated type declaration is known to be valid. + +2007-09-25 Jakub Jelinek + + * tree.c (cxx_printable_name): Compare FUNCTION_DECL uids + rather than pointers. + +2007-09-24 Danny Smith + + PR c++/14688 + * search.c (check_final_overrider): Fail if + targetm.comp_type_attributes returns 0. + +2007-09-24 Jason Merrill + + PR c++/33239 + * pt.c (resolve_typename_type): Don't look things up in the original + template if it would mean losing template arguments. + +2007-09-24 Jakub Jelinek + + PR c++/33506 + * cp-tree.h (cxx_type_hash_eq): New prototype. + * cp-objcp-common.h (LANG_HOOKS_TYPE_HASH_EQ): Redefine. + * tree.c (cxx_type_hash_eq): New function. + +2007-09-24 Douglas Gregor + + PR c++/33185 + * tree.c (cp_build_qualified_type_real): Build a canonical + ARRAY_TYPE if the original ARRAY_TYPE was not a canonical type. + +2007-09-24 Douglas Gregor + + PR c++/33112 + PR c++/33185 + * tree.c (cplus_array_compare): Compare pointers, not types. + (build_cplus_array_type_1): Store new array type into the hash + table before building the canonical type; build the canonical type + correctly. + (cp_build_qualified_type_real): Put all of the array types with + cv-qualified element types into the C++ array hash table, built as + variants of the unqualified versions. + +2007-09-23 Jason Merrill + + PR c++/16370 + * decl.c (grokdeclarator): Look through implicit TYPE_DECLs + for deprecation warnings. + +2007-09-22 Jason Merrill + + PR c++/15269 + * call.c (build_over_call): Warn about deprecated virtuals. + + PR c++/19407 + * cp-tree.h (ATTR_IS_DEPENDENT): New macro. + (MAYBE_TAGGED_TYPE_P): Remove. + * pt.c (apply_late_template_attributes): Check ATTR_IS_DEPENDENT + instead of calling is_late_template_attribute again. + (tsubst_decl) [TYPE_DECL]: Just check if the name is the tag. + (tsubst): A typedef is a TYPE_NAME != TYPE_MAIN_DECL. + Don't crash on typedefs from non-template classes. + * decl2.c (grokfield): Don't sorry about attrs on template parms. + (is_late_template_attribute): All attributes applied to template + parms or typename types are dependent. Static. + (splice_template_attributes): Pass decl through. + (save_template_attributes): Likewise. + +2007-09-20 Jakub Jelinek + + PR c++/33496 + * pt.c (tsubst_copy) : Handle error_mark_node + returned from tsubst_pack_expansion. + (tsubst_copy_and_build) : Likewise. + (tsubst_copy_and_build) : Likewise. + +2007-09-20 Paolo Carlini + + PR c++/33460 + * semantics.c (finish_id_expression): Use consistently + context_for_name_lookup. + * decl.c (fixup_anonymous_aggr): Fix error message for + anonymous struct (vs union). + +2007-09-19 Jason Merrill + + PR c++/7586 + * pt.c (tsubst): Handle typedefs by looking for the specialization. + (retrieve_specialization): Only tagged types use + DECL_TEMPLATE_INSTANTIATIONS. + (instantiate_class_template): Push nested classes too. + (tsubst_decl) [TYPE_DECL]: Only check for canonical decl for + tagged types. + * cp-tree.h (MAYBE_TAGGED_TYPE_P): New macro. + * init.c (is_aggr_type): Remove redundant tests. + * class.c (push_nested_class): Use CLASS_TYPE_P. + +2007-09-20 Paolo Carlini + + PR c++/33459 + * init.c (build_zero_init): If, recursively, build_zero_init + returns a NULL_TREE, do not append it to the VEC of constructors. + +2007-09-18 Jason Merrill + + PR c++/17743 + * pt.c (apply_late_template_attributes): Set processing_template_decl. + (tsubst_decl) [TYPE_DECL]: Preserve naming typedef, pass + ATTR_FLAG_TYPE_IN_PLACE. + (tsubst): Do unqualified lookup to find typedefs from current class. + [ARRAY_TYPE]: Propagate alignment info. + * decl2.c (is_late_template_attribute): Only defer handling of + attribute aligned if the expression is dependent. + (save_template_attributes): If we're deferring any attributes, + make this a naming typedef. + +2007-09-18 Paolo Carlini + + PR c++/33462 (again) + * cxx-pretty-print.c (pp_cxx_va_arg_expression): Print + va_arg instead of __builtin_va_arg. + +2007-09-18 Paolo Carlini + + PR c++/33462 + * cxx-pretty-print.c (pp_cxx_va_arg_expression): Add. + (pp_cxx_primary_expression): Use it. + * cxx-pretty-print.h (pp_cxx_va_arg_expression): Declare. + * error.c (dump_expr): Use it. + +2007-09-18 Paolo Carlini + + PR c++/33463 + * cxx-pretty-print.c (pp_cxx_postfix_expression): Split + out case TYPEID_EXPR to... + (pp_cxx_typeid_expression): ... here; use pp_cxx_left_paren + and pp_cxx_right_paren. + * cxx-pretty-print.h (pp_cxx_typeid_expression): Declare. + * error.c (dump_expr): Use it. + +2007-09-18 Paolo Carlini + + PR c++/33464 + * cxx-pretty-print.c (pp_cxx_trait_expression): Add. + (pp_cxx_primary_expression): Use it. + * cxx-pretty-print.h (pp_cxx_trait_expression): Declare. + * error.c (dump_expr): Use it. + +2007-09-16 Paolo Carlini + + PR c++/33124 + * init.c (build_new): Remove warning for zero-element + allocations. + +2007-09-16 Nathan Sidwell + + PR c++/32756 + * call.c (maybe_handle_implicit_object): Set this_p, clear + rvaluedness_matches_p. + (compare_ics): Do not compare rvaluedness matching when one of the + operands is an implicit object. + +2007-09-14 Jason Merrill + + PR c++/17743, c++/19163 + * decl2.c (is_late_template_attribute): New fn. + (splice_template_attributes, save_template_attributes): New fns. + (cplus_decl_attributes): Call save_template_attributes. + * pt.c (apply_late_template_attributes): New fn. + (instantiate_class_template, tsubst_decl): Use it. + * cp-tree.h: Declare is_late_template_attribute. + +2007-09-13 Tom Tromey + + * parser.c (cp_lexer_new_main): Don't use + c_lex_return_raw_strings. + (cp_lexer_get_preprocessor_token): Update. Add special case when + lexer is NULL. + +2007-09-11 Jan Hubicka + + * method.c (use_thunk): Use tree_rest_of_compilation + * cp-objecp-common.h (LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION): Kill. + (LANG_HOOKS_CALLGRAPH_EMIT_ASSOCIATED_THUNKS): Define. + * cp-tree.h (expand_body): Kill. + (emit_associated_thunks): Declare. + * semantics.c (emit_associated_thunks): Export. + (expand_body): Kill. + +2007-09-09 David Daney + + PR c++/33324 + * init.c (build_new_1): Use POINTER_PLUS_EXPR instead of MINUS_EXPR + to calculate cookie_ptr. + +2007-09-08 Jason Merrill + + PR c++/33342 + * pt.c (most_specialized_class): Set processing_template_decl + while tsubsting partial spec args. + +2007-09-06 Jason Merrill + + * decl2.c (get_guard): Copy visibility from the guarded variable. + +2007-09-06 Jan Hubicka + + * semantics.c (expand_body): Do not mark arguments of clones used. + +2007-09-06 Paolo Carlini + + PR c++/32674 + * decl.c (cp_finish_decl): When processing_template_decl, + deal correctly with init as TREE_LIST. + +2007-09-06 Tom Tromey + + * decl.c (finish_function): Put return's location on line zero of + file. + +2007-09-05 Jason Merrill + + PR c++/15745 + * except.c (prepare_eh_type): Use type_decays_to. + + PR c++/15097 + * init.c (build_delete): Use build_headof to get the address of the + complete object if we aren't using the deleting destructor. + * rtti.c (build_headof): No longer static. + * cp-tree.h: Declare it. + +2007-09-06 Jakub Jelinek + + * decl.c (duplicate_decls): Set TREE_NOTHROW on __builtin_XX + decl if a prototype for XX is provided with throw(). + + PR c++/33289 + * decl.c (builtin_function_1): Set DECL_ANTICIPATED also + on __*_chk non-__builtin_* decls. + +2007-09-05 Paolo Carlini + + PR c++/30302 + * semantics.c (finish_id_expression): Use context_for_name_lookup + insted of DECL_CONTEXT, to see through anonymous structs and unions. + * class.c (finish_struct_anon): Deal correctly with anonymous + structs (vs unions, as GNU extension) in error messages. + +2007-09-05 Jan Hubicka + + * sematics.c (expand_body): Remove unnecesary import_export_decl + call, DECL_EXTERNAL checks and current_function_decl saving. + +2007-09-05 Paolo Carlini + + PR c++/29731 (again) + * parser.c (cp_parser_primary_expression): Return error_mark_node + when a statement-expression is found in a template-argument list. + +2007-09-04 Jason Merrill + + * except.c (initialize_handler_parm): Use + fold_build_cleanup_point_expr. + + PR c++/31419 + * call.c (reference_binding): Don't look for user-defined conversions + to the same type. + + PR c++/31411 + * except.c (initialize_handler_parm): Put a CLEANUP_POINT_EXPR inside + the MUST_NOT_THROW_EXPR. + +2007-09-04 Richard Sandiford + + * decl.c (cp_finish_decl): Call determine_visibility before + make_rtl_for_nonlocal_decl. + +2007-09-04 Jason Merrill + + PR c++/14032 + * pt.c (most_specialized_class): Substitute outer template + arguments into the arguments of a member template partial + specialization. + (strip_innermost_template_args): New fn. + +2007-09-03 Daniel Jacobowitz + + * Make-lang.in (g++spec.o): Remove SHLIB_MULTILIB. + +2007-09-03 Kaveh R. Ghazi + + * call.c (name_as_c_string): Supply a TYPE for CONST_CAST. + * decl.c (cp_make_fname_decl): Likewise, + * parser.c (cp_parser_string_literal): Likewise, + * tree.c (pod_type_p, zero_init_p): Use CONST_CAST_TREE. + * typeck.c (cp_type_quals, cp_type_readonly, cp_has_mutable_p): + Likewise, + +2007-09-02 Paolo Carlini + + PR c++/33208 + * typeck.c (build_unary_op): Fix error message for + Boolean expression as operand to operator--. + +2007-09-01 Kaveh R. Ghazi + + * tree.c (pod_type_p, zero_init_p): Use strip_array_types. + * typeck.c (cp_type_quals, cp_type_readonly, cp_has_mutable_p): + Likewise. + +2007-08-31 Douglas Gregor + + PR c++/32597 + * init.c (build_default_init): Make extern. + * cp-tree.h (build_default_init): Declare here. + * pt.c (tsubst_expr): When the instantiation of the initializer of + a variable results in an empty list, default-initialize the + variable. + (tsubst_copy_and_build): When the instantiation of the initializer + in a new expression results in an empty initializer list, + default-initialize it. + +2007-08-31 Douglas Gregor + + * mangle.c (write_type): Change mangling of rvalue reference from + `RR' to `O'. + +2007-08-31 Jakub Jelinek + + * decl.c (duplicate_decls): Remove duplicated line. + +2007-08-31 Paolo Carlini + + PR c++/33210 + * cxx-pretty-print.c (pp_cxx_unqualified_id): Deal with + BOUND_TEMPLATE_TEMPLATE_PARM. + +2007-08-31 Paolo Carlini + + PR c++/32113 + * search.c (lookup_member): Check the name argument for + error_mark_node. + +2007-08-31 Paolo Carlini + + PR c++/33212 + * parser.c (cp_parser_trait_expr): Check rerurn value of + cp_parser_type_id. + +2007-08-30 Ollie Wild + + * cvt.c (cp_convert_to_pointer): Remove force parameter. Call + convert_ptrmem for pointer to member conversions. + (convert_to_pointer_force): Update cp_convert_to_pointer call. + (ocp_convert): Update cp_convert_to_pointer call. + * typeck.c (convert_ptrmem): Add conditional for null pointers to + members. + (build_static_cast_1): Check can_convert for conversions in either + direction. + (get_delta_difference_1): New function. + (get_delta_difference): Refactor to call get_delta_difference_1. + +2007-08-30 Jakub Jelinek + + * decl.c (start_preparsed_function): Set + DECL_DISREGARD_INLINE_LIMITS for GNU_INLINE_P functions. + +2007-08-28 Paolo Carlini + + PR c++/33209 + * error.c (dump_expr): Deal with TEMPLATE_TYPE_PARM and + BOUND_TEMPLATE_TEMPLATE_PARM. + +2007-08-28 Jakub Jelinek + + PR c++/32596 + PR c++/32400 + * pt.c (check_explicit_specialization): Set DECL_INTERFACE_KNOWN + and DECL_NOT_REALLY_EXTERN if tmpl_func is not public. + +2007-08-27 Jason Merrill + + PR c++/29000 + * pt.c (build_non_dependent_expr, type_dependent_expression_p): + Look inside STMT_EXPR. + * semantics.c (stmt_expr_value_expr): New fn. + * cp-tree.h: Declare it. + + PR c++/28558 + * decl.c (groktypename): Ignore attributes applied to class type. + +2007-08-28 Richard Guenther + + * decl.c (duplicate_decls): Merge DECL_DISREGARD_INLINE_LIMITS. + +2007-08-28 Gabriel Dos Reis + + * error.c (dump_expr): Handle COMPLEX_CST. + * cxx-pretty-print.c (pp_cxx_primary_expression): Likewise. + (pp_cxx_expression): Likewise. + +2007-08-27 Alexandre Oliva + + * decl.c (GNU_INLINE_P): New. + (duplicate_decls): Handle gnu_inline. Merge attributes and + some flags in overriding definitions. + (redeclaration_error_message): Handle gnu_inline. + (start_preparsed_function): Likewise. + +2007-08-25 Kaveh R. Ghazi + + * call.c (sufficient_parms_p): Constify. + * class.c (same_signature_p): Likewise. + * cp-gimplify.c (is_invisiref_parm, + cxx_omp_privatize_by_reference): Likewise. + * cp-objcp-common.c (has_c_linkage): Likewise. + * cp-tree.h (NON_THUNK_FUNCTION_CHECK, THUNK_FUNCTION_CHECK, + sufficient_parms_p, same_signature_p, copy_fn_p, move_fn_p, + grok_ctor_properties, nothrow_libfn_p, skip_artificial_parms_for, + num_artificial_parms_for, comp_template_parms, + template_parameter_pack_p, any_dependent_template_arguments_p, + any_type_dependent_arguments_p, any_value_dependent_elements_p, + repo_export_class_p, cxx_omp_privatize_by_reference, pod_type_p, + zero_init_p, member_p, cp_lvalue_kind, + builtin_valid_in_constant_expr_p, decl_anon_ns_mem_p, + varargs_function_p, is_dummy_object, special_function_kind, + string_conv_p, type_unknown_p, comp_except_specs, compparms, + comp_cv_qualification, is_bitfield_expr_with_lowered_type, + unlowered_expr_type, ptr_reasonably_similar, cp_type_readonly, + cp_has_mutable_p, at_least_as_qualified_p, + invalid_nonstatic_memfn_p, lvalue_or_else, lvalue_p): Likewise. + * decl.c (copy_fn_p, move_fn_p, grok_ctor_properties): Likewise. + * except.c (nothrow_libfn_p): Likewise. + * method.c (skip_artificial_parms_for, num_artificial_parms_for): + Likewise. + * pt.c (comp_template_parms, template_parameter_pack_p, + any_type_dependent_arguments_p, any_value_dependent_elements_p, + any_dependent_template_arguments_p): Likewise. + * repo.c (repo_export_class_p): Likewise. + * semantics.c (anon_aggr_type_p): Likewise. + * tree.c (lvalue_p_1, real_lvalue_p, lvalue_p, + builtin_valid_in_constant_expr_p, decl_anon_ns_mem_p, + varargs_function_p, member_p, is_dummy_object, pod_type_p, + zero_init_p, special_function_p): Likewise. + * typeck.c (comp_array_types, type_unknown_p, comp_except_specs, + comp_array_types, at_least_as_qualified_p, comp_cv_qualification, + compparms, invalid_nonstatic_memfn_p, + is_bitfield_expr_with_lowered_type, unlowered_expr_type, + string_conv_p, ptr_reasonably_similar, cp_type_readonly, + cp_has_mutable_p, lvalue_or_else): Likewise. + +2007-08-25 Paolo Bonzini + + * decl.c (cp_tree_node_structure): Kill TINST_LEVEL case. + * cp-objcp-common.c (cp_tree_size): Ditto. + * tree.c (cp_walk_subtrees): Ditto + * cp-tree.def (TINST_LEVEL): Go away. + * cp-tree.h (struct tinst_level_s): Rename to struct tinst_level, + move together with other non-tree structs. + (enum cp_tree_node_structure_enum): Nuke TS_CP_TINST_LEVEL. + (union lang_tree_node): Eliminate tinst_level field. + (TINST_DECL, TINST_LOCATION, TINST_IN_SYSTEM_HEADER_P): Annihilate. + (current_instantiation, outermost_tinst_level): Return + a "struct tinst_level *". + + * error.c (print_instantiation_partial_context): Change second + parameter to a "struct tinst_level *". Replace accessor macros + with field access. + (print_instantiation_full_context): Likewise. + * lex.c (in_main_input_context): Likewise. + + * pt.c (struct pending_templates): New. + (pending_templates, last_pending_template): Use it as a type. + (current_tinst_level): Change typo to "struct tinst_level *" + (reopen_tinst_level): Accept "struct tinst_level *", return decl. + (add_pending_template): Construct a "struct pending_template". + Replace TINST_LEVEL accessor macros with field access. + (push_tinst_level): Likewise, using GGC_NEW instead of make_node. + (pop_tinst_level): Likewise. + (instantiate_pending_templates): Likewise. Factor common code used + when an instantiation has been done. + (outermost_tinst_level): Replace tree_last with loop. + (current_instantiation): Return a "struct tinst_level *". + +2007-08-24 Ollie Wild + + * name-lookup.c (add_decl_to_level): Remove addition to vtables chain. + * name-lookup.h (cp_binding_level): Remove vtables member. + +2007-08-24 Richard Guenther + + * tree.c (cp_cannot_inline_tree_fn): Remove. + * cp-tree.h (cp_cannot_inline_tree_fn): Likewise. + * cp-objcp-common.h (LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN): + Remove define. + +2007-08-24 Jakub Jelinek + + PR c++/32567 + * typeck.c (build_unary_op) : Return + error_mark_node right away if build_expr_type_conversion + returned it. + + PR c++/32898 + * name-lookup.c (set_decl_namespace): lookup_qualified_name failure + is error_mark_node rather than NULL_TREE. + * pt.c (check_explicit_specialization): Likewise. + + PR c++/31941 + * error.c (resolve_virtual_fun_from_obj_type_ref): Handle + TARGET_VTABLE_USES_DESCRIPTORS targets properly. + +2007-08-22 Jason Merrill + + PR c++/29365 + * pt.c (outermost_tinst_level): New function. + * lex.c (in_main_input_context): New function. + * cp-tree.h: Declare it. + * decl2.c (constrain_class_visibility): Use it to avoid warning + about uses of the anonymous namespace in the main input file. + +2007-08-21 Jakub Jelinek + + * init.c (build_new_1): Use get_target_expr instead of save_expr. + +2007-08-20 Pawel Sikora + + PR c++/7302 + * class.c (finish_struct_1): Warn when a class has virtual + functions and accessible non-virtual destructor. + +2007-08-20 Richard Guenther + + PR c++/22369 + PR c++/22451 + * call.c (build_new_method_call): Convert initializer to + the basetype. + * init.c (build_aggr_init): Do not fiddle with types. + (build_vec_delete_1): Use correct type for POINTER_PLUS_EXPR. + * except.c (build_throw): Do not drop qualifiers for the + pointer type. + * typeck.c (get_member_function_from_ptrfunc): Do not + fiddle with types, instead convert. + (build_ptrmemfunc1): Convert to the target type for + initialization. + (gfc_trans_allocate): Convert result to target type. + * cp-objcp-common.c (cxx_get_alias_set): Pointers to + pointer-to-member structures shall have alias set zero as well. + +2007-08-20 Richard Guenther + + * cp-objcp-common.h (LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P): + Remove. + * cp-tree.h (cp_auto_var_in_fn_p): Remove. + (nonstatic_local_decl_p): Likewise. + * tree.c (cp_auto_var_in_fn_p): Remove. + * decl.c (nonstatic_local_decl_p): Remove. + +2007-08-20 Richard Guenther + + * cp-objcp-common.h (LANG_HOOKS_TREE_INLINING_WALK_SUBTREES): + Remove define. + * tree.h (cp_walk_tree): New define to walk_tree_1 with + cp_walk_subtrees lh parameter. + (cp_walk_tree_without_duplicates): New define to + walk_tree_without_duplicates_1 with cp_walk_subtrees lh parameter. + * tree.c (count_trees): Call + cp_walk_tree_without_duplicates. + (verify_stmt_tree): Call cp_walk_tree. + (break_out_target_exprs): Likewise. + (WALK_SUBTREE): Likewise. + * cp-gimplify.c (cp_genericize): Likewise. + * cp-pt.c (find_parameter_packs_r): Likewise. + (uses_parameter_packs): Likewise. + (make_pack_expansion): Likewise. + (check_for_bare_parameter_packs): Likewise. + (for_each_template_parm): Likewise. + * decl.c (check_default_argument): Call + cp_walk_tree_without_duplicates. + * except.c (build_throw): Likewise. + * decl2.c (type_visibility): Likewise. + * semantics.c (expand_or_defer_fn): Likewise. + (finalize_nrv): Call cp_walk_tree. + +2007-08-20 Jakub Jelinek + + PR c++/33025 + * init.c (build_new_1): Rename placement_var variable to placement_expr. + Initialize it with save_expr rather than get_temp_regvar. + +2007-08-17 Andrew Pinski + + PR c++/28989 + * tree.c (lvalue_p_1 ): SAVE_EXPRs are never + lvalues. + +2007-08-17 Ollie Wild + + PR c++/31749 + * name-lookup.c (do_nonmember_using_decl): Shift implicit type + declarations into appropriate slots for comparison. Fix type + comparison. + +2007-08-17 Paolo Carlini + + PR c++/32112 + * error.c (dump_decl): Deal with UNBOUND_CLASS_TEMPLATE. + * cxx-pretty-print.c (pp_cxx_unqualified_id): Likewise. + +2007-08-17 Paolo Carlini + + PR c++/32870 + * parser.c (cp_parser_class_head): Improve error message. + +2007-08-16 Seongbae Park + + * pt.c (instantiate_decl): Set input_location + for the function end. + +2007-08-16 Kaveh R. Ghazi + + * cp-objcp-common.c (cxx_warn_unused_global_decl, cp_expr_size): + Constify. + * cp-tree.h (local_variable_p, nonstatic_local_decl_p, + class_tmpl_impl_spec_p, cp_auto_var_in_fn_p, cp_type_quals, + cxx_incomplete_type_diagnostic, cxx_incomplete_type_error, + cxx_warn_unused_global_decl, cp_expr_size): Likewise. + * decl.c (local_variable_p, nonstatic_local_decl_p): Likewise. + * tree.c (class_tmpl_impl_spec_p, cp_auto_var_in_fn_p): Likewise. + * typeck.c (cp_type_quals): Likewise. + * typeck2.c (cxx_incomplete_type_diagnostic, + cxx_incomplete_type_error): Likewise. + +2007-08-16 Paolo Carlini + + PR c++/31132 + * pt.c (tsubst_friend_function): When check_classfn + returns error_mark_node likewise return it. + +2007-08-15 Jakub Jelinek + + PR c++/32992 + * typeck.c (check_return_expr): Don't NRV optimize vars in + anonymous unions. + * decl.c (finish_function): Comment fix. + +2007-08-15 Paolo Carlini + + PR c++/33035 + * pt.c (push_template_decl_real): Depending on TYPE_P + use either TYPE_CONTEXT or DECL_CONTEXT. + +2007-08-14 Mark Mitchell + + * semantics.c (finish_omp_clauses): Strip a NOP_EXPR if + constructors and destructors return this. + +2007-08-14 Paolo Carlini + + PR c++/27211 + * decl2.c (check_classfn): Return error_mark_node in case of error; + in that case, do not call add_method. + * decl.c (start_decl): Deal with check_classfn returning + error_mark_node. + (grokfndecl): Likewise. + * pt.c (tsubst_friend_function): Likewise. + +2007-08-14 Andrew Pinski + + PR c++/30428 + * typeck.c (build_binary_op): Disallow vector float types with + BIT_IOR_EXPR, BIT_AND_EXPR, and BIT_XOR_EXPR. + +2007-08-11 Ian Lance Taylor + + * cp-objcp-common.c (cxx_get_alias_set): Change return type to + alias_set_type. + * cp-tree.h (cxx_get_alias_set): Update declaration. + +2007-08-10 Ollie Wild + + * name-lookup.c (do_nonmember_using_decl): Print an error for ambiguous + type lookups. + (ambiguous_decl): Construct tree of ambiguous types. Remove extaneous + function parameter. + (unqualified_namespace_lookup): Fix ambiguous_decl call. + (lookup_using_namespace): Fix ambiguous_decl call. + (qualified_lookup_using_namespace): Fix ambiguous_decl call. + +2007-08-10 Kaveh R. Ghazi + + * call.c (name_as_c_string): Use CONST_CAST. + * decl.c (build_decl): Likewise. + * parser.c (cp_parser_string_literal): Likewise. + +2007-08-10 Paolo Carlini + + PR c++/17763 + * error.c (dump_expr): Consistently use the *_cxx_* + variants of the pretty-print functions. + +2007-08-10 Paolo Carlini + + PR c++/22256 + * decl.c (check_special_function_return_type): Just error + on return type specified for conversion operator. + +2007-08-09 Daniel Berlin + + * typeck2.c (readonly_error): Handle general expressions. + * error.c (dump_expr): Handle POINTER_PLUS_EXPR + +2007-08-06 Dan Hipschman + + * method.c (use_thunk): Use DECL_NAME instead of DECL_RTL to + access function name. + +2007-08-04 Alfred Minarik + + PR pch/13676 + * lang-specs.h: Add .hp, .hxx, .hpp, .h, .HPP, .tcc as c++ header. + * g++spec.c (lang_specific_driver): Check them. + +2007-08-06 Paolo Carlini + + PR c++/19532 + * pt.c (inline_needs_template_parms): Fix comment; change return type + to bool. + +2007-08-05 Volker Reichelt + + Revert: + 2007-03-26 Dirk Mueller + + * parser.c (cp_parser_member_declaration): Pedwarn + about stray semicolons after member declarations. + +2007-08-02 Lee Millward + + PR c++/30849 + PR c++/30850 + PR c++/30851 + * parser.c (cp_parser_asm_definition): Detect and discard asm + statements with invalid inputs or outputs. + (cp_parser_asm_operand_list): Return error mark node if any + of the operands are invalid. Adjust documentation. + +2007-08-02 Nick Clifton + + * typeck.c: Change copyright header to refer to version 3 of the + GNU General Public License and to point readers at the COPYING3 + file and the FSF's license web page. + * optimize.c, lang-specs.h, init.c, class.c, repo.c, decl.c, + config-lang.in, cp-tree.def, call.c, decl.h, ptree.c, + Make-lang.in, method.c, rtti.c, cp-objcp-common.c, g++spec.c, + cp-objcp-common.h, except.c, error.c, operators.def, cvt.c, + tree.c, mangle.c, cp-tree.h, dump.c, search.c, friend.c, expr.c, + cp-gimplify.c, cxx-pretty-print.c, cp-lang.c, typeck2.c, pt.c, + cxx-pretty-print.h, semantics.c, name-lookup.c, lex.c, decl2.c, + name-lookup.h, parser.c: Likewise. + +2007-08-01 Kaveh R. Ghazi + + PR middle-end/32668 + * call.c (magic_varargs_p): Honor the "type generic" attribute. + +2007-07-30 Paolo Carlini + + PR c++/32108 + * semantics.c (finish_label_stmt): Reject the __label__ + extension outside function scopes. + +2007-07-29 Kaveh R. Ghazi + + * parser.c (eof_token): Un-constify. + (cp_lexer_new_main, cp_lexer_new_from_tokens, VEC_alloc, + cp_lexer_consume_token, cp_lexer_purge_token): Remove spurious + casts. + +2007-07-28 Kazu Hirata + + * pt.c, tree.c, typeck2.c: Fix comment typos. + +2007-07-28 Simon Martin + Mark Mitchell + + PR c++/30917 + * name-lookup.c (lookup_name_real): Non namespace-scope bindings can be + hidden due to friend declarations in local classes. + +2007-07-27 Douglas Gregor + + * typeck.c (structural_comptypes): Compare DECLTYPE_TYPE nodes. + * cp-tree.def (DECLTYPE_TYPE): New. + * error.c (dump_type): Dump DECLTYPE_TYPE nodes. + (dump_type_prefix): Ditto. + (dump_type_suffix): Ditto. + * tree.c (DECLTYPE_TYPE): Walk DECLTYPE_TYPE nodes. + * mangle.c (write_type): Handle DECLTYPE_TYPE. + * cp-tree.h (IS_AGGR_TYPE): DECLTYPE_TYPE nodes can be aggregate + types. + (DECLTYPE_TYPE_EXPR): New. + (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P): New. + (finish_declared_type): Declare. + * cxx-pretty-print.c (pp_cxx_type_specifier_seq): Print + DECLTYPE_TYPE nodes. + (pp_cxx_type_id): Ditto. + * pt.c (for_each_template_parm_r): Walk DECLTYPE_TYPE children. + (tsubst): Substitute into a DECLTYPE_TYPE node. + (tsubst_copy): Ditto. + (unify): Cannot deduce anything from TYPEOF_TYPE or DECLTYPE_TYPE + nodes. + (dependent_type_p_r): DECLTYPE_TYPE types are always dependent. + * semantics.c (finish_typeof): TYPEOF_TYPE types need to use + structural equality (because we can't hash the expressions). + (finish_declared_type): New. + * lex.c (reswords): Add "decltype" keyword. + * parser.c cp_lexer_next_token_is_decl_specifier_keyword + (cp_parser_postfix_expression): Add member_access_only_p to + restrict postfix expression to member access expressions. + (cp_parser_unary_expression): Update call to + cp_parser_postfix_expression to reflect new parameter. + (cp_parser_declared_type): New. + (cp_parser_simple_type_specifier): Parse decltype types. + +2007-07-27 Mark Mitchell + + PR c++/32346 + * call.c (convert_for_arg_passing): Only widen bitfields to their + declared types if necessary. + +2007-07-25 Kaveh R. Ghazi + + * parser.c (cp_parser_string_literal, cp_parser_sizeof_operand): + Constify. + +2007-07-25 Kaveh R. Ghazi + + * decl.c (typename_hash, typename_compare): Constify. + * mangle.c (hash_type, compare_type): Likewise. + * pt.c (eq_local_specializations, hash_local_specialization): + Likewise. + * tree.c (cplus_array_hash, cplus_array_compare, list_hash_eq, + list_hash): Likewise. + * typeck2.c (pat_compare): Likewise. + +2007-07-24 Nathan Sidwell + + * method.c (implicitly_declare_fn): Increase alignment if member + function pointer format requires it. + +2007-07-24 Paolo Carlini + + PR c++/29001 + * typeck.c (check_return_expr): Do not pass a null argument + to null_ptr_cst_p. + +2007-07-24 Paolo Carlini + + PR c++/32561 + * decl.c (redeclaration_error_message): Call DECL_ANON_UNION_VAR_P + only on VAR_DECL. + +2007-07-22 Nathan Sidwell + + PR c++/32839 + * typeck.c (convert_arguments): Only use default args if we have + a function decl. + + PR c++/30818 + * typeck.c (structural_comptypes): No need to check + resolve_typename_type return value here. + * cp-tree.h (TYPENAME_IS_RESOLVING_P): New. + * pt.c (resolve_typename_type): Follow typename typedefs. Return + original type rather than error_mark_node in case of failure. + * parser.c (cp_parser_nested_name_specifier_opt): Adjust + resolve_typename_type result check. + (cp_parser_direct_declarator, cp_parser_head, + cp_parser_constructor_declarator_p): Likewise. + +2007-07-12 Kazu Hirata + + * pt.c (template_parms_variadic_p): Remove. + * cp-tree.h: Remove the prototype for template_parms_variadic_p. + +2007-07-12 Jakub Jelinek + + PR c++/30854 + * error.c (dump_expr) : Pass true as last + argument to dump_aggr_init_expr_args instead of false. + +2007-07-11 Douglas Gregor + + * typeck.c (comptypes): When USE_CANONICAL_TYPES, use the + canonical types; otherwise, fall back to structural type + comparisons. If ENABLE_CHECKING and USE_CANONICAL_TYPES, give an + internal compiler error if the canonical types are wrong. + +2007-07-11 Paolo Carlini + + PR c++/32560 + * parser.c (cp_parser_make_indirect_declarator): When the + the code argument is ERROR_MARK return cp_error_declarator. + +2007-07-09 Geoffrey Keating + + PR 32617 + * decl.c (cxx_init_decl_processing): Don't set + force_align_functions_log. + (grokfndecl): Honour ptrmemfunc_vbit_in_pfn. + * typeck.c (cxx_alignof_expr): When alignof is used on a plain + FUNCTION_DECL, return its alignment. + +2007-07-09 Richard Guenther + + * decl.c (start_preparsed_function): Do not promote return type. + +2007-07-08 Paolo Carlini + + PR c++/30535 + * pt.c (unify): Never pass error_mark_node to template_decl_level. + +2007-07-07 Mark Mitchell + + PR c++/32232 + * pt.c (resolve_overloaded_unification): Robustify. Return a + bool, not an int. + (type_unification_real): Adjust accordingly. + +2007-07-06 Richard Guenther + + * init.c (build_new_1): Use the correct pointer type. + * typeck2.c (build_m_component_ref): Likewise. + +2007-07-05 Mark Mitchell + + PR c++/32245 + * init.c (build_zero_init): Always build an initializer for + non-static storage. + * typeck2.c (build_functional_cast): Use build_zero_init. + + PR c++/32251 + * init.c (build_new_1): Always pass the allocation function to + build_op_delete_call. + * call.c (build_op_delete_call): Handle operator delete with a + variable-argument list. Do not issue an error when no matching + deallocation function is available for a new operator. + + PR c++/31992 + * cp-tree.h (any_value_dependent_elements_p): Declare it. + * decl.c (value_dependent_init_p): New function. + (cp_finish_decl): Use it. + * pt.c (value_dependent_expression_p): Use + any_value_dependent_elements_p. + * parser.c (cp_parser_primary_expression): Add comment about + treating dependent qualified names as integral + constant-expressions. + +2007-07-04 Douglas Gregor + + * decl.c (build_ptrmemfunc_type): Always use structural equality + tests when comparing pointer-to-member-function types, because the + handling of TYPE_GET_PTRMEMFUNC_TYPE currently defeats canonical + types. + +2007-07-03 Mark Mitchell + + * init.c (build_new): Tweak comment. + +2007-06-29 Dave Brolley + + PR c++/31743 + * parser.c (cp_parser_new_type_id): Don't reduce a named array + type to its base type and number of elements here. + * init.c (build_new): Call complete_type_or_else to ensure that the + type is complete and to issue a diagnostic if it is not. + (build_new_1): Don't call complete_type_or_else here. + +2007-07-03 Richard Guenther + + PR c++/32609 + * class.c (fixed_type_or_null): Re-lookup the hashtable slot + after recursing. + +2007-07-02 Simon Baldwin + + * parser.c (cp_parser_elaborated_type_specifier): Added a warning + for inner-style nested forward declarations that don't declare + anything useful. + +2007-07-02 Jakub Jelinek + + PR c++/31748 + * semantics.c (finish_omp_clauses): Use %qD instead of %qE for + DECL_P in not a variable and appears more than once error messages. + +2007-07-01 Ollie Wild + + * name-lookup.c (ambiguous_decl): Fix case when new->value is hidden. + (select_decl): Remove function. + (unqualified_namespace_lookup): Populate binding by calling + ambiguous_decl. Remove select_decl call. + (lookup_qualified_name): Remove select_decl call. + * decl.c (lookup_and_check_tag): Check for ambiguous references. + * parser.c (cp_parser_elaborated_type_specifier): Skip redundant error + generation when name lookup is ambiguous. + +2007-06-29 Douglas Gregor + + PR c++/31724 + * init.c (build_new_1): Use structural equality on the copy of the + array type. + +2007-06-28 Geoffrey Keating + + * decl2.c (determine_visibility): Implement + flag_visibility_ms_compat effect on type info. + * decl.c (cxx_init_decl_processing): Implement + global effect of flag_visibility_ms_compat. + +2007-06-28 Geoffrey Keating + + * decl2.c (start_objects): Mark constructor-running function + as artificial. + +2007-06-26 Simon Martin + + PR c++/32111 + * decl.c (grokdeclarator): Reset friendp for member functions declared + friend of their own class. + +2007-06-23 Mark Mitchell + + * decl2.c (determine_visibility): Don't look for dllexport here. + (determine_visibility_from_class): Tidy. + +2007-06-18 Simon Baldwin + + PR c++/31923 + * parser.c (cp_parser_single_declaration): Added check for storage + class other than sc_none in parsed declaration, and a flag to indicate + if the call is part of an explicit template specialization parse. + * (cp_parser_explicit_specialization): Specialization check flag added + to call to cp_parser_single_declaration(), set true. + * (cp_parser_template_declaration_after_export): Specialization check + flag added to call to cp_parser_single_declaration(), set false. + * pt.c (check_explicit_specialization): Added code to copy visiblity + and linkage from the templated function to the explicit specialization. + +2007-06-15 Andrew Pinski + + * typeck.c (build_binary_op): For templates build the + expression in pieces to avoid the assert in build2_stat. + (get_member_function_from_ptrfunc): + Change over to using POINTER_PLUS_EXPR and convert + the second operand to sizetype. + * typeck2.c (build_m_component_ref): Likewise. + * init.c (expand_virtual_init): Create a POINTER_PLUS_EXPR + instead of PLUS_EXPR for pointers. + (build_new_1): Likewise. + (build_vec_delete_1): Likewise. + (build_vec_delete): Likewise. + * class.c (build_base_path): Likewise. + (build_base_path): Likewise. + (convert_to_base_statically): Likewise. + (fixed_type_or_null): Handle POINTER_PLUS_EXPR. + (get_vtbl_decl_for_binfo): Handle POINTER_PLUS_EXPR + instead of PLUS_EXPR. + (dfs_accumulate_vtbl_inits): Create a POINTER_PLUS_EXPR + instead of PLUS_EXPR for pointers. + * call.c (build_special_member_call): Likewise. + * rtti.c (build_headof): Likewise. + Use sizetype instead of ptrdiff_type_node. + (tinfo_base_init): Create a POINTER_PLUS_EXPR + instead of PLUS_EXPR for pointers. + * except.c (expand_start_catch_block): Do a + NEGATIVE and then a POINTER_PLUS_EXPR instead + of a MINUS_EXPR. + * cp-gimplify.c (cxx_omp_clause_apply_fn): Convert + PLUS_EXPR on pointer types over to use + POINTER_PLUS_EXPR and remove the conversion + to the pointer types. + * method.c (thunk_adjust): Use POINTER_PLUS_EXPR for + adding to a pointer type. Use size_int instead of + ssize_int. Convert the index to sizetype before + adding it to the pointer. + +2007-06-15 Mark Mitchell + + * cp-tree.h (DECL_VAR_MARKED_P): Remove. + (DECL_ANON_UNION_VAR_P): New macro. + * class.c (fixed_type_or_null): Tidy. Use a hash table, rather + than DECL_VAR_MARKED_P, to keep track of which variables we have + seen. + * decl.c (redeclaration_error_message): Complain about redeclaring + anonymous union members at namespace scope. + * decl2.c (build_anon_union_vars): Set DECL_ANON_UNION_VAR_P. + +2007-06-14 Geoff Keating + + * decl2.c (determine_visibility): Ensure that functions with + hidden types as parameters are hidden. + + PR 31093 + * decl2.c (determine_visibility): Remove duplicate code for + handling type info. + +2007-06-12 Ian Lance Taylor + + PR libstdc++/29286 + * init.c (avoid_placement_new_aliasing): New static function. + (build_new_1): Call it. + +2007-06-11 Rafael Ávila de EspĂ­ndola + + * cp-objcp-common.h (LANG_HOOKS_SIGNED_TYPE): Remove. + (LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE): Remove. + +2007-06-08 Jakub Jelinek + + PR c++/32177 + * semantics.c (finish_omp_for): Call fold_build_cleanup_point_expr + on init, the non-decl cond operand and increment value. + +2007-06-07 Simon Martin + + PR c++/30759 + * decl.c (check_initializer): Report an error when a brace enclosed + initializer is used for a non-aggregate type in C++98. + (redeclaration_error_message): Rewrote flag_cpp0x in terms of + cxx_dialect. + (grokdeclarator): Likewise. + (move_fn_p): Likewise. + * typeck.c (check_return_expr): Likewise. + * call.c (reference_binding): Likewise. + * error.c (cp_cpp_error): Likewise. + * pt.c (check_default_tmpl_args): Likewise. + (tsubst): Likewise. + * lex.c (init_reswords): Likewise. + * parser.c (p_parser_primary_expression): Likewise. + (TOKEN_PRECEDENCE): Likewise. + (cp_parser_init_declarator): Likewise. + (cp_parser_ptr_operator): Likewise. + (cp_parser_parameter_declaration): Likewise. + (cp_parser_enclosed_template_argument_list): Likewise. + (cp_parser_skip_to_end_of_template_parameter_list): Likewise. + (cp_parser_next_token_ends_template_argument_p): Likewise. + +2007-06-04 Simon Baldwin + + * decl.c (grokdeclarator): Readability change. Moved case labels + into direct switch statement scope. + +2007-06-04 Paolo Carlini + + * call.c (convert_like_real): Remove pointless code. + +2007-05-31 Mark Mitchell + + * decl.c (get_atexit_fn_ptr_type): New function. + (get_atexit_node): Use it. + (start_cleanup_fn): Likewise. + (register_dtor_fn): Use the object's destructor, instead of a + separate cleanup function, where possible. + * cp-tree.h (CPTI_ATEXIT_FN_PTR_TYPE): New enumerator. + (atexit_fn_ptr_type_node): New macro. + * decl2.c (build_cleanup): Use build_address. + +2007-05-31 Daniel Berlin + + * typeck.c (build_binary_op): Include types in error. + +2007-05-31 Jakub Jelinek + + PR c++/31806 + * decl.c (cp_finish_decl): Also clear was_readonly if a static var + needs runtime initialization. + +2007-05-31 Paolo Carlini + + PR c++/32158 + * semantics.c (finish_trait_expr): Complete the types. + +2007-05-30 Russell Yanofsky + Douglas Gregor + Pedro Lamarao + Howard Hinnant + + PR c++/7412 + PR c++/29939 + * typeck.c (comptypes): Don't consider rvalue and lvalue + reference types to be equivalent. + (check_return_expr): Move from certain lvalues when returning + them. + * decl.c (grokdeclarator): Implement reference collapsing. + (copy_fn_p): Don't consider constructors taking rvalue references + to be copy constructors. + (move_fn_p): New. + * call.c (conversion): New "rvaluedness_matches_p" member. + (convert_class_to_reference): Require reference type as first + parameter instead of base type. + (reference_binding): Add logic to handle rvalue references. + (implicit_conversion): Update inaccurate comment. + (convert_like_real): Disable creation of temporaries that are + impossible to initialize for types with move constructors. + (build_over_call): Elide move constructors when possible. + (maybe_handle_implicit_object): Set "rvaluedness_matches_p". + (maybe_handle_ref_bind): Return conversion instead of type node. + (compare_ics): Add logic to use "rvaluedness_matches_p" values to + determine preferred conversion sequences. + * cp-tree.h (TYPE_REF_IS_RVALUE): New. + (LOOKUP_PREFER_RVALUE): New. + (DECL_MOVE_CONSTRUCTOR_P): New. + (struct cp_declarator): Add "reference" member for reference + types, with new "rvalue_ref" flag. + (cp_build_reference_type): Declare. + (move_fn_p): Declare. + * error.c (dump_type_prefix): Format rvalue reference types + correctly in error messages. + * except.c (build_throw): Move from certain lvalues when + throwing. + * mangle.c (write_type): Mangle rvalue references differently + than regular references. + * parser.c (make_reference_declarator): Add boolean parameter for + rvalue references. + (cp_parser_make_indirect_declarator): New. + (cp_parser_new_declarator_opt): Call + cp_parser_make_indirect_declarator. + (cp_parser_conversion_declarator_opt): Ditto. + (cp_parser_declarator): Ditto. + (cp_parser_ptr_operator): Parse "&&" tokens into rvalue reference + declarators. + * pt.c (tsubst): Implement reference collapsing. + (maybe_adjust_types_for_deduction): Implement special template + parameter deduction rule for rvalue references. + (type_unification_real): Update calls to + maybe_adjust_types_for_deduction. + (try_one_overload): Ditto. + (unify_pack_expansion): Ditto. + * tree.c (lvalue_p_1): Handle rvalue reference types. + (cp_build_reference_type): New. + +2007-05-30 Jakub Jelinek + + PR c++/31809 + * decl.c (cp_finish_decl): Clear TREE_READONLY flag on TREE_STATIC + variables that need runtime initialization. + +2007-05-28 Andrew Pinski + + PR c++/31339 + * typeck.c (build_unary_op ): Return the error_mark_node + if either the real or imaginary parts would an + error_mark_node. + +2007-05-25 Simon Martin + Manuel Lopez-Ibanez + + PR c++/31745 + * parser.c (cp_parser_skip_to_closing_brace): Return true if the next + token is a closing brace, false if there are no tokens left. + (cp_parser_namespace_alias_definition): Only consume the next token if + it is a closing brace. + + * parser.c (cp_parser_class_specifier): Likewise. + +2007-05-25 H.J. Lu + + * semantics.c (finish_member_declaration): Fix a typo in the + last checkin. + +2007-05-25 Douglas Gregor + + PR c++/31431 + PR c++/31432 + PR c++/31434 + PR c++/31435 + PR c++/31437 + PR c++/31438 + PR c++/31442 + PR c++/31443 + PR c++/31444 + PR c++/31445 + * error.c (dump_type): Dump TYPE_ARGUMENT_PACK nodes. + * cp-tree.h (check_for_bare_parameter_packs): Returns bool. + * pt.c (check_for_bare_parameter_packs): Return bool indicated + whether everything was okay. Fix indentation. + (push_template_decl_real): Check for bare parameter packs in + function parameters; where errors occur, mark the parameter types + with ERROR_MARK_NODEs to avert ICEs. + (coerce_template_parameter_pack): New. + (coerce_template_parms): Moved parameter pack coercion into + coerce_template_parameter_pack, and permit it anywhere in the + template parameter list (not just at the end). Parameter and + argument indices can vary (somewhat) separately now, so add + PARM_IDX and ARG_IDX. + (fn_type_unification): Don't set an argument pack as incomplete if + no argument pack was deduced. + (type_unification_real): If a type parameter is a parameter pack + and has not otherwise been deduced, it will be deduced to an empty + parameter pack. + (more_specialized_fn): Use the actual lengths of the argument + lists when comparing against expansions. + * semantics.c (finish_member_declaration): If a field's type has + bare parameter packs, error and set its type to ERROR_MARK_NODE. + +2007-05-24 Danny Smith + + PR target/27067 + * mangle.c (mangle_decl): Call targetm.mangle_decl_assembler_name. + +2007-05-22 Ollie Wild + + * name-lookup.c (ambiguous_decl): Adds check for hidden types. + (unqualified_namespace_lookup): Adds check for hidden types. + +2007-05-22 Ollie Wild + + * decl.c (duplicate_decls): Verify namespace names are unique. + +2007-05-21 Mark Mitchell + + * decl.c (cxx_maybe_build_cleanup): Handle + __attribute__((cleanup)). + +2007-05-19 Manuel Lopez-Ibanez + + * cvt.c (cp_convert_and_check): Don't check warnings if the + conversion failed. + +2007-05-18 Geoffrey Keating + + * mangle.c (write_real_cst): Use 'unsigned long' for %lx. + +2007-05-14 Paolo Carlini + + PR c++/29928 + * rtti.c (get_tinfo_decl_dynamic, get_typeid): Try to complete the + type only if is a class type (5.2.8/4). + +2007-05-14 Rafael Ávila de EspĂ­ndola + + * cp-objcp-common.h (LANG_HOOKS_UNSIGNED_TYPE): Remove. + * decl.c (grokdeclarator): Use unsigned_type_for instead of + c_common_unsigned_type. + +2007-05-11 Silvius Rus + + * typeck.c (build_indirect_ref): Add call to + strict_aliasing_warning. + (build_reinterpret_cast_1): Condition call to + strict_aliasing_warning. + +2007-05-11 Jan Hubicka + + * semantics.c (expand_or_defer_fn): Do not call c_record_cdtor_fn. + * decl2.c (start_objects): ctors and dtors are no longer public. + (cp_write_global_declarations): Do not call c_build_cdtor_fns. + +2007-05-07 Andrew Pinski + + * typeck.c (build_unary_op): Remove code that used to + handle non lvalue increments/decrements. + +2007-05-07 Mike Stump + + * parser.c (check_empty_body): Add. + (cp_parser_iteration_statement): Add call to check_empty_body. + +2007-05-05 Geoffrey Keating + + PR 31775 + * mangle.c (write_mangled_name): Mangle static variable names. + (write_unqualified_name): Use local-source-name for + namespace-scope static variables. + +2007-05-04 Dirk Mueller + + * cp-tree.h (DECL_MAIN_P): only if -ffreestanding is + not in effect. + +2007-05-02 Seongbae Park + + PR c++/31663 + * decl2.c (constrain_class_visibility): + Use strip_pointer_or_array_types instead of strip_array_types. + +2007-04-28 Andrew Pinski + + PR C++/30221 + * decl.c (reshape_init_r): Don't reshape the first element if it + is a pointer to member function. + +2007-04-27 Simon Baldwin + + * decl.c (grokparms): Changed message format from %qD to %qE. + +2007-04-27 Douglas Gregor + + * error.c (maybe_warn_variadic_templates): Variadic templates are + now in C++0x, so only warn about them in C++98 mode. + +2007-04-26 Andrew Pinski + + PR C++/30016 + * typeck.c (build_reinterpret_cast_1): Only allow conversion to + integeral types from vectors types. + +2007-04-26 Jakub Jelinek + + PR c++/31598 + * semantics.c (finish_omp_clauses): Don't create CP_OMP_CLAUSE_INFO + for type dependent OMP_CLAUSE_DECLs. + +2007-04-24 Mark Mitchell + + PR c++/31338 + * cp-tree.h (ARITHMETIC_TYPE): Include COMPLEX_TYPE. + * typeck.c (type_after_usual_arithmetic_conversions): Adjust, as + COMPLEX_TYPE is now an ARITHMETIC_TYPE. + * init.c (build_zero_init): Adjust, as + COMPLEX_TYPE is now a SCALAR_TYPE. + * typeck2.c (digest_init): Allow brace-enclosed initializers for + COMPLEX_TYPE, even though that is now a SCALAR_TYPE. + +2007-04-25 Paolo Carlini + + * semantics.c (classtype_has_nothrow_copy_or_assign_p): Adjust + per N2255; rename as classtype_has_nothrow_assign_or_copy_p. + (trait_expr_value): Adjust. + +2007-04-23 Simon Baldwin + + * decl.c (grokparms): Added new error for duplicate function + parameters names in function prototypes, to match gcc behavior. + +2007-04-23 Jan Hubicka + + * decl2.c (finish_objects): Do not call target constructor/destructor + bits dirrectly. + +2007-04-21 Andrew Pinski + + * cp-tree.h (lang_tree_node): Use GENERIC_NEXT + instead of checking GIMPLE_STMT_P in chain_next. + +2007-04-17 Mark Mitchell + + PR c++/31513 + * call.c (convert_for_arg_passing): Convert bitfields to their + declared types. + +2007-04-17 Simon Martin + + PR c++/31517 + * pt.c (value_dependent_expression_p): Handle MODOP_EXPRs. + +2007-04-16 Seongbae Park + + PR c++/29365 + * decl2.c (constrain_class_visibility): + Do not warn about the use of anonymous namespace in the main input file. + +2007-04-15 Mark Mitchell + + * cp-tree.h (current_template_parms): Fix typo in comment. + +2007-04-15 Kazu Hirata + + * cp-tree.h, error.c: Fix comment typos. + +2007-04-13 Jason Merrill + + PR c++/31074 + * call.c (reference_binding): Add c_cast_p parm. If true, + add quals to TO as needed to make it reference-compatible. + +2007-04-11 Jan Hubicka + + * class.c (convert_to_base_statically): Fold produced tree; verify + that we are not processing template_decl. + +2007-04-09 Mark Mitchell + + PR c++/31449 + * class.c (build_base_path): Ensure that the converted pointer has + the same cv-qualification as the input. + +2007-04-09 Paolo Carlini + + * tree.c (cp_tree_equal): Deal with TRAIT_EXPR. + +2007-04-08 Steven Bosscher + + * cp-objcp-common.h (LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS): + Do not set it. + (LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P): Do not set it. + * tree.c (cp_add_pending_fn_decls): Remove. + * cp-tree.h (cp_add_pending_fn_decls): Remove prototype. + +2007-04-07 Daniel Berlin + + Revert change removing staticp. + +2007-04-06 Daniel Berlin + + * cp-objcp-common.c (cxx_staticp): Remove. + * cp-objcp-common.h (LANG_HOOKS_STATICP): Remove. + * cp-tree.h (cxx_staticp): + +2007-04-04 Danny Smith + + * class.c (check_for_override): Don't remove dllmport attribute + of virtual methods. + +2007-04-03 Jakub Jelinek + + PR c++/30847 + * typeck.c (build_modify_expr): For COND_EXPR on LHS, if RHS has void + type issue error and return early. + +2007-03-30 Jason Merrill + + PR c++/31187 + * typeck.c (cp_type_readonly): New fn. + * cp-tree.h: Declare it. + * decl.c (start_decl): Set implicit DECL_THIS_STATIC here. + (cp_finish_decl): Not here. + +2007-03-31 Richard Guenther + + * optimize.c (maybe_clone_body): Replace splay-tree usage by + pointer-map. + +2007-03-31 Douglas Gregor + + PR c++/31138 + PR c++/31140 + PR c++/31141 + * parser.c (declarator_can_be_parameter_pack): New. + (cp_parser_template_parameter): Only parse the `...' if the + declarator can be a parameter pack. + (cp_parser_parameter_declaration): Ditto. Also, handle when TYPE + is NULL. + * pt.c (find_parameter_packs_r): Look into the bounds on integer + types (they could be used as array bounds). + (check_for_bare_parameter_packs): Deal with TEMPLATE_PARM_INDEX. + (tsubst_pack_expansion): Handle failure to expand parameter + packs. + +2007-03-30 Paolo Carlini + + PR c++/26099 + * cp-tree.h (enum cp_trait_kind, struct tree_trait_expr, + TRAIT_EXPR_TYPE1, TRAIT_EXPR_TYPE2, TRAIT_EXPR_KIND): Add. + (enum cp_tree_node_structure_enum, union lang_tree_node): Update. + (CLASS_TYPE_NON_UNION_P): Add. + (struct lang_type_class): Add has_complex_dflt. + (TYPE_HAS_COMPLEX_DFLT, TYPE_HAS_TRIVIAL_DFLT): Add. + (locate_copy, locate_ctor, locate_dtor, finish_trait_expr): Declare. + * cp-tree.def: Add TRAIT_EXPR. + * cp-objcp-common.c (cp_tree_size): Add TRAIT_EXPR case. + * lex.c (struct resword): Add __has_nothrow_assign, + __has_nothrow_constructor, __has_nothrow_copy, __has_trivial_assign, + __has_trivial_constructor, __has_trivial_copy, + __has_trivial_destructor, __has_virtual_destructor, __is_abstract, + __is_base_of, __is_class, __is_convertible_to, __is_empty, __is_enum, + __is_pod, __is_polymorphic, __is_union. + * parser.c (cp_parser_primary_expression): Deal with the new RIDs. + (cp_parser_trait_expr): New. + * semantics.c (finish_trait_expr, trait_expr_value + classtype_has_nothrow_copy_or_assign_p): New. + * method.c (locate_copy, locate_ctor, locate_dtor): Do not define + as static. + * decl.c (cp_tree_node_structure): Add TRAIT_EXPR. + * class.c (check_bases, check_field_decl, check_bases_and_members): + Deal with TYPE_HAS_COMPLEX_DFLT (t) too. + * pt.c (uses_template_parms, tsubst_copy_and_build, + value_dependent_expression_p, type_dependent_expression_p): Deal with + TRAIT_EXPR. + * tree.c (cp_walk_subtrees): Deal with TRAIT_EXPR. + +2007-03-29 Richard Guenther + + * tree.c (cp_walk_subtrees): Do not set input_location. + +2007-03-28 Simon Martin + + PR c++/29077 + * decl.c (grokfndecl): Properly setup decl if it is a constructor or a + destructor. + +2007-03-28 Douglas Gregor + + * parser.c (struct cp_parser): Update comment for + greater_than_is_operator_p. + (cp_parser_primary_expression): In C++0x mode, a cast operator can + be terminated with a `>>' token when !GREATER_THAN_IS_OPERATOR_P. + (TOKEN_PRECEDENCE): In C++0x mode, `>>' is treated like `>' when + !GREATER_THAN_IS_OPERATOR_P. + (cp_parser_binary_expression): When -Wc++0x-compat, warn about + `>>' operators that will become two `>' tokens in C++0x. + (cp_parser_parameter_declaration): Treat `>>' like `>' in C++0x + mode, allowing it to terminate default arguments. + (cp_parser_enclosed_template_argument_list): In C++0x mode, treat + `>>' like two consecutive `>' tokens. + (cp_parser_skip_to_end_of_template_parameter_list): Ditto. + (cp_parser_next_token_ends_template_argument_p): In C++0x, `>>' + ends a template argument. + +2007-03-28 Douglas Gregor + + * decl.c (redeclaration_error_message): Complain when redeclaring + a friend function with default template arguments (C++0x mode only). + * cp-tree.h (check_default_tmpl_args): Declare. + * pt.c (check_default_tmpl_args): In C++0x mode, permit default + template arguments in function templates. Add support for checking + the default template arguments of friend templates. + (push_template_decl_real): Fix call to check_default_tmpl_args. + (type_unification_real): If a template parameter has not been + deduced but provides a default template argument, substitute into + that default template argument. + * parser.c (cp_parser_init_declarator): When declaring (but not + defining!) a function template in C++0x mode, check for default + template arguments. + +2007-03-28 Douglas Gregor + + PR c++/29993 + * decl.c (grokdeclarator): Deal with cv-qualified function type + typedefs in the same way for member and non-member functions. + +2007-03-26 Dirk Mueller + + * parser.c (cp_parser_member_declaration): Pedwarn + about stray semicolons after member declarations. + +2007-03-26 Paolo Carlini + + PR c++/30500 + * pt.c (instantiate_decl): Set in_system_header. + +2007-03-22 Mark Mitchell + + * cp-tree.h (current_tempalte_parms): Improve documentation. + * pt.c (current_template_args): Likewise. + + PR c++/30863 + * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): Do + not consume tokens when failing. + +2007-03-22 Jim Wilson + Mark Mitchell + + PR c++/31273 + * call.c (standard_conversion): Use type_decays_to. Keep FCODE + consistent with FROM. + +2007-03-22 Gabriel Dos Reis + + * error.c (dump_expr): Handle dependent names that designate types. + * cxx-pretty-print.c (pp_cxx_unqualified_id): Handle TYPENAME_TYPE. + +2007-03-17 Kazu Hirata + + * cp-tree.def, parser.c, pt.c: Fix comment typos. + +2007-03-16 Manuel Lopez-Ibanez + + * cvt.c (cp_convert_and_check) : Define. + * cp-tree.h (cp_convert_and_check): Declare. + * call.c (convert_conversion_warnings): Rename to + conversion_null_warnings. The warning for floating-point to + integer is handled by convert_and_check in convert_like_real. + (convert_like_real): convert_conversion_warnings was renamed as + conversion_null_warnings. + * typeck.c (build_binary_op): Use cp_convert_and_check to warn for + overflow and changes of value during conversion. + +2007-03-15 Manuel Lopez-Ibanez + + PR c++/30891 + * parser.c (cp_parser_statement): If 'namespace' is found, this + only can be a namespace alias definition, so parse it now. + (cp_parser_namespace_alias_definition): if we find an open brace + instead of '=', then this is actually a misplaced namespace + definition. + +2007-03-15 Manuel Lopez-Ibanez + + PR c++/24924 + * decl.c (cxx_init_decl_processing): Move command-line options + processing to c-opts.c. + +2007-03-15 Douglas Gregor + + * ptree.c (cxx_print_type): Use formatting markup for integers + when printing template parameter index/level/orig level. + (cxx_print_xnode): Ditto. + * cp-tree.h (TEMPLATE_PARM_PARAMETER_PACK): Use TREE_LANG_FLAG_0. + (struct template_parm_index_s): Remove the PARAMETER_PACK member. + Make INDEX, LEVEL, and ORIG_LEVEL integers instead of + HOST_WIDE_INTs. + (struct saved_scope): Make X_PROCESSING_TEMPLATE_DECL an int, + rather than a HOST_WIDE_INT. + Turn X_PROCESSING_EXPLICIT_INSTANTIATION, SKIP_EVALUATION, and + NEED_POP_FUNCTION_CONTEXT into bool bitfields; reorder fields for + better bit-packing. + (struct language_function): Make RETURNS_VALUE, RETURNS_NULL, + RETURNS_ABNORMALLY, IN_FUNCTION_TRY_HANDLER, and + IN_BASE_INITIALIZER bool bitfields. + (struct cp_declarator): Make KIND a 4-bit field. Make + PARAMETER_PACK_P a bool bitfield just after KIND. + * pt.c (uses_parameter_packs): Destroy the pointer set. + (make_pack_expansion): Ditto. + (check_for_bare_parameter_packs): Ditto. + * name-lookup.c (push_to_top_level): Make need_pop a bool value. + +2007-03-14 Andrew Pinski + + PR c++/31165 + * call.c (convert_default_arg): Instead of copying the node, + unshare it. + +2007-03-15 Dirk Mueller + + PR c++/30860 + * call.c (convert_conversion_warnings): New.. + (convert_like_real): .. factored out from here. + (convert_conversion_warnings): Add warning about + false being converted to NULL in argument passing. + +2007-03-14 Dirk Mueller + + * semantics.c (c_finish_if_stmt): Call empty_if_body_warning. + (finish_do_body): Warn about empty body in do/while statement. + +2007-03-14 Manuel Lopez-Ibanez + + * class.c (warn_hidden): Add OPT_Woverloaded_virtual to warning. + +2007-03-14 Manuel Lopez-Ibanez + + PR c/21438 + * typeck.c (build_binary_op): Call warn_for_div_zero instead of + warning. + +2007-03-13 Alexandre Oliva + + * repo.c (init_repo): Initialize random_seed saved options. + (finish_repo): Adjust. + +2007-03-13 Mark Mitchell + + PR bootstrap/30899 + * Make-lang.in (doc/g++.1): Use $< to specify the location from + which to copy. + +2007-03-12 Seongbae Park + + * decl.c (compute_array_index_type): New warning flag warn_vla. + +2007-03-12 Mark Mitchell + + PR c++/30108 + * call.c (convert_default_arg): Copy non-constant arguments. + +2007-03-11 Mark Mitchell + + PR c++/31038 + * parser.c (cp_parser_postfix_expression): Disallow compound + literals in constant expressions. + + PR c++/30328 + * semantics.c (finish_typeof): Use unlowered_expr_type. + +2007-03-10 Mark Mitchell + + PR c++/30274 + * cp-tree.h (unlowered_expr_type): New function. + * typeck.c (is_bitfield_expr_with_lowered_type): Handle + COMPOUND_EXPR, MODIFY_EXPR, and SAVE_EXPR. + (unlowered_expr_type): New function. + (build_unary_op): Disallow predecrements of bool bitfields. + * call.c (build_conditional_expr): Use unlowered_expr_type. + * pt.c (type_unification_real): Likewise. + +2007-03-09 Douglas Gregor + + PR c++/20599 + * typeck.c (check_return_expr): Check for bare parameter packs. + (comptypes): Compare template parameter packs and + type pack expansions. + * decl.c (grokdeclarator): Deal with the declaration of function + parameter packs. + (grokparms): Verify that the (optional) function parameter pack is + at the end of the parameter list. + (xref_basetypes): Handle pack expansions in the base class. + (cp_tree_node_structure): Handle ARGUMENT_PACK_SELECT. + * cp-tree.def (TYPE_ARGUMENT_PACK): New. + (NONTYPE_ARGUMENT_PACK): New. + (TYPE_PACK_EXPANSION): New. + (EXPR_PACK_EXPANSION): New. + (ARGUMENT_PACK_SELECT): New. + * cp-objcp-common.c (cp_tree_size): Compute size of + (NON)TYPE_ARGUMENT_PACK, (TYPE|EXPR)_PACK_EXPANSION, and + ARGUMENT_PACK_SELECT. + * error.c (dump_template_argument): Print template argument packs. + (dump_template_argument_list): Ditto. + (dump_template_parameter): Dump `...' for template type parameter + packs. + (dump_type): Dump TYPE_PACK_EXPANSION nodes. + (dump_parameters): Print function parameter packs. + (dump_template_parms): Print template argument packs. + (dump_expr): Dump EXPR_PACK_EXPANSION nodes. + (maybe_warn_variadic_templates): New. + * operators.def: Add ellipsis operator for EXPR_PACK_EXPANSION. + * tree.c (cp_walk_subtrees): Walk BASELINK, TYPE_ARGUMENT_PACK, + NONTYPE_ARGUMENT_PACK, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION, + CAST_EXPR. + * mangle.c (write_type): Mangle TYPE_PACK_EXPANSION. + (write_template_arg): Write argument packs as separate arguments. + * cp-tree.h (struct template_parm_index_s): Add flag that + indicates that the template parameter is actually a parameter + pack. + (struct tree_argument_pack_select): New. + (enum cp_tree_node_structure_enum): Add TS_CP_ARGUMENT_PACK_SELECT. + (union lang_tree_node): Add argument_pack_select. + (FUNCTION_PARAMETER_PACK_P): New. + (PACK_EXPANSION_P): New. + (PACK_EXPANSION_PATTERN): New. + (SET_PACK_EXPANSION_PATTERN): New. + (PACK_EXPANSION_PARAMETER_PACKS): New. + (ARGUMENT_PACK_P): New. + (ARGUMENT_PACK_ARGS): New. + (SET_ARGUMENT_PACK_ARGS): New. + (ARGUMENT_PACK_INCOMPLETE_P): New. + (ARGUMENT_PACK_EXPLICIT_ARGS): New. + (TEMPLATE_PARM_PARAMETER_PACK): New. + (TEMPLATE_TYPE_PARAMETER_PACK): New. + (ARGUMENT_PACK_SELECT_FROM_PACK): New. + (ARGUMENT_PACK_SELECT_INDEX): New. + (ARGUMENT_PACK_SELECT_ARG): New. + (struct cp_declarator): Add parameter_pack_p flag. + (maybe_warn_variadic_templates): Declare. + (process_template_parm): Add bool parameter IS_PARAMETER_PACK, to + indicate a template parameter pack. + (uses_parameter_packs): Declare. + (template_parameter_pack_p): Declare. + (template_parms_variadic_p): Declare. + (make_pack_expansion): Declare. + (check_for_bare_parameter_packs): Declare. + * cxx-pretty-print.c (pp_cxx_unary_expression): Print + sizeof... expressions. + (pp_cxx_expression): Print pack expansions and non-type argument + packs. + (pp_cxx_exception_specification): Print pack expansions. + (pp_cxx_direct_declarator): Print ellipsis for parameter packs. + (pp_cxx_ctor_initializer): Print pack expansions. + (pp_cxx_type_id): Print pack expansions. + (pp_cxx_template_argument_list): Print argument packs. + (pp_cxx_template_parameter): Print ellipsis for template parameter + packs. + * pt.c (comp_template_parms): Compare template parameter packs. + (template_parameter_pack_p): New. + (template_parms_variadic_p): New. + (template_args_variadic_p): New. + (make_ith_pack_parameter_name): New. + (struct find_parameter_pack_data): New. + (find_parameter_packs_r): New. + (uses_parameter_packs): New. + (make_pack_expansion): New. + (check_for_bare_parameter_packs): New. + (expand_template_argument_pack): New. + (reduce_template_parm_level): Propagate parameter pack flag. + (process_template_parm): Add is_parameter_pack parameter to state + when the parameter is actually a parameter pack. Create template + parameter packs when is_parameter_pack is true. + (current_template_args): The argument for a template parameter + pack is an argument pack containing a single pack expansion. + (process_partial_specialization): When checking that non-type + argument expressions do not involve template parameters, loop over + the arguments in argument packs separately. + (push_template_decl_real): Check that the type of the declaration + does not have any bare parameter packs. Check that primary + templates have no more than one parameter pack, and that it comes + at the end of the template parameter list. + (convert_template_argument): Handle coercions for pack expansion + expressions by coercing the pattern then rebuilding the expansion. + (coerce_template_parms): When coercing the arguments for a + variadic template, pack "extra" arguments into an argument pack. + (coerce_template_template_parms): Cannot coerce between parameter + packs and non-pack parameters. + (template_args_equal): Compare PACK_EXPANSION_P expressions. + (comp_template_args): Expand all template arguments packs before + comparing template argument lists. + (mangle_class_name_for_template): Make argument packs as separate + template arguments. + (for_each_template_parm_r): No need to handle BASELINK. + (instantiate_class_template): Handle pack expansions in the base + class list. + (tsubst_pack_expansion): New. + (tsubst_template_args): Handle substitutions of argument packs and + pack expansion into template argument lists. + (tsubst_decl): Expand function parameter packs into separate + function parameters. + (tsubst_arg_types): Expand a type pack expansion into separate + argument types. + (tsubst_exception_specification): Handle pack expansions in + exception specifiers. + (tsubst): See through ARGUMENT_PACK_SELECT arguments when + replacing a template parameter with its argument. If we encounter + a substitution for an argument pack, just return the parameter + itself. + (tsubst_copy): sizeof(X...) returns the number of elements in + parameter pack X. See through ARGUMENT_PACK_SELECT when the + PARM_DECL is a parameter pack. + (tsubst_expr): Expression pack expansions and argument packs + cannot show up here; they will all be handled through function + calls, sizeof, and template argument lists. + (tsubst_copy_and_build): sizeof(X...) returns the number of + elements in parameter pack X. Handle pack expansions in TREE_LIST + and CONSTRUCTOR nodes. + (fn_type_unification): Handle "incomplete" explicit template + argument lists that specify some of the arguments for a template + parameter pack. + (type_unification_real): Unify arguments against pack expansions. + (template_parm_level_and_index): New, helper function. + (unify_pack_expansion): New. + (unify): Unify argument packs on an argument-by-argument basis, + handling variadic argument packs as well. + (more_specialized_fn): Handle unification of function parameter + packs. All things being equal, prefer non-variadic function + templates to variadic function templates. + (more_specialized_class): Prefer the variadic class template + partial specialization that binds fewer arguments to a parameter + pack. + (regenerate_decl_from_template): Expand function parameter packs + into separate parameters. + (instantiate_decl): Ditto. + (tsubst_initializer_list): Handle pack expansions for base-class + initializers. + (dependent_type_p_r): Determine dependent types in argument packs + and pack expansions. + (value_dependent_expression_p): Determine value-dependence of + non-type argument packs. + (dependent_template_arg_p): Handle argument packs. + * semantics.c (finish_cond): Check for bare parameter packs. + (finish_expr_stmt): Ditto. + (finish_for_expr): Ditto. + (finish_switch_cond): Ditto. + (finish_mem_initializers): Ditto. + * name-lookup.c (arg_assoc_type): Handle pack expansions and + argument packs. + * decl2.c (cp_build_parm_decl): Mark function parameter packs. + * parser.c (make_declarator): Declarator is not an expansion. + (make_pointer_declarator): Transfer parameter pack flag to outer + declarator. + (make_reference_declarator): Ditto. + (make_ptrmem_declarator): Ditto. + (make_call_declarator): Ditto. + (make_array_declarator): Ditto. + (cp_parser_postfix_expression): Allow pack expansion expressions + in the argument list for a call expression. + (cp_parser_parenthesized_expression_list): Add new parameter + ALLOW_EXPANSION_P. When true, parse the ellipsis to mean "expand + into separate arguments." + (cp_parser_new_placement): Allow pack expansion expressions. + (cp_parser_new_initializer): Ditto. + (cp_parser_mem_initializer_list): Allow ellipsis to create a + base-class initializer expansion. + (cp_parser_mem_initializer): Ditto. + (cp_parser_template_parameter_list): Keep track of whether the + template parameter is a template parameter pack. + (cp_parser_template_parameter): Parse the ellipsis to indicate a + template parameter pack. + (cp_parser_type_parameter): Ditto. + (cp_parser_template_argument_list): Parse the ellipsis to indicate + a pack expansion. + (cp_parser_direct_declarator): Parse the ellipsis to indicate that + this declarator is a parameter pack. + (cp_parser_parameter_declaration): The ellipsis does not end the + parameter declaration, because it might be a parameter pack. Parse + the ellipsis to indicate a parameter pack. + (cp_parser_initializer): Allow pack expansions. + (cp_parser_initializer_list): Allow ellipsis to create an + initializer expansion. + (cp_parser_base_clause): Allow ellipsis to create a base specifier + expansion. + (cp_parser_type_id_list): Allow ellipsis to create an exception + specifier expansion. + (cp_parser_attribute_list): Don't allow pack expansions. + (cp_parser_functional_cast): Allow pack expansions. + (cp_parser_sizeof_operand): Allow ellipsis following "sizeof" to + compute the length of a parameter pack. + (cp_parser_next_token_ends_template_argument_p): An ellipsis can + end a template argument. + * tree.c (cp_walk_subtrees): Walk BASELINK, TYPE_ARGUMENT_PACK, + NONTYPE_ARGUMENT_PACK, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION, + CAST_EXPR. + +2007-03-09 Dirk Mueller + + * call.c (build_new_op): Call warn_logical_operator. + +2007-03-08 Volker Reichelt + + PR c++/30852 + * semantics.c (finish_offsetof): Handle COMPOUND_EXPR. + + PR c++/30534 + * pt.c (any_template_arguments_need_structural_equality_p): + Robustify. + +2007-03-08 Alexandre Oliva + + * decl.c (grokdeclarator): Disable warnings for anonymous + bitfields. + +2007-03-05 Volker Reichelt + + * typeck2.c (readonly_error): Always emit a hard error. + Remove last argument. + * cp-tree.h (readonly_error): Adjust prototype. + * semantics.c (finish_asm_stmt): Adjust call to readonly_error. + * typeck.c (build_unary_op): Likewise. + (build_modify_expr): Likewise. + +2007-03-04 Simon Martin + + PR c++/30895 + * tree.c (cp_tree_equal): Properly handle COMPLEX_CST trees. + +2007-03-03 Manuel Lopez-Ibanez + + PR c++/15787 + * parser.c (struct cp_parser): New IN_IF_STMT. + (cp_parser_statement_seq_opt): Handle an unexpected 'else', + returning if parsing the body of an 'if' statement or issuing an + error and continuing. + (cp_parser_selection_statement): Set IN_IF_STMT bit when parsing + body of 'if'. + (cp_parser_jump_statement): Mask new IN_IF_STMT bit. + +2007-03-02 Simon Martin + + PR c++/28253 + * class.c (update_vtable_entry_for_fn): Properly handle invalid overriders + for thunks. + +2007-03-02 Geoffrey Keating + + * g++spec.c (lang_specific_driver): Add -lstdc++ when compiling + Objective-C++. Don't exit early if -shared-libgcc needs to be + added. + +2007-03-02 Manuel Lopez-Ibanez + + * typeck.c (common_base_type): Delete unused function. + +2007-03-01 Brooks Moses + + * Make-lang.in: Add dummy lang.install-pdf target. + +2007-03-01 Simon Baldwin + + PR c++/23689 + * decl.c (check_tag_decl): Added new warning for typedef ignored + when it precedes an otherwise valid non-typedef declaration. + +2007-02-28 Sandra Loosemore + + * typeck.c (build_function_call): Store converted arguments + in a stack-allocated array instead of building a list. + (convert_arguments): Store arguments in the array passed in as an + argument, and return the actual number of arguments. + * call.c (build_call): Delete, and replace with... + (build_call_n, build_call_a): New. + (build_op_delete_call): Rewrite to avoid constructing argument lists. + (build_over_call): Store converted arguments in a stack-allocated + array instead of building a list. + (build_cxx_call): Pass arguments in an array instead of as a list. + (build_java_interface_fn_ref): Rewrite to avoid constructing + argument lists. + * tree.h: Update declarations to reflect above changes. + * method.c (use_thunk): Use a stack-allocated array to hold + the arguments instead of a list. + * rtti.c (throw_bad_cast): Update call to cxx_call. + (throw_bad_typeid): Likewise. + (build_dynamic_cast_1): Likewise. + * init.c (build_builtin_delete_call): Use build_call_n. + * decl.c (expand_static_init): Likewise. + * except.c (cp_protect_cleanup_actions): Likewise. + * cp-gimplify.c (genericize_eh_spec_block): Likewise. + (gimplify_must_not_throw_expr): Likewise. + (cxx_omp_apply_fn): Use build_call_a. + +2007-02-26 Mark Mitchell + + * semantics.c (expand_or_defer_fn): Call c_record_cdtor_fn. + * decl2.c (cp_write_gloabl_declarations): Call c_build_cdtor_fns. + +2007-02-25 Mark Mitchell + + * cp-tree.h (static_ctors): Remove. + * cp-tree.h (static_dtors): Likewise. + * cp-objcp-common.c (decl_shadowed_for_var_lookup): Adjust for + refactoring of tree_map hierarchy. + (decl_shadowed_for_var_insert): Likewise. + * semantics.c (expand_body): Use c_expand_body. + (expand_or_defer_fn): Don't update static_ctors or static_dtors. + * decl2.c (static_ctors): Remove. + (static_dtors): Likewise. + (generate_ctor_or_dtor_function): Pass NULL_TREE to + objc_generate_static_init_call. Do not call static_[cd]tors. + (generate_ctor_and_dtor_functions_for_priority): Do not check for + static_[cd]tors. + (cp_write_global_declarations): Likewise. + +2007-02-23 Richard Guenther + + * class.c (note_name_declared_in_class): Make declaration + changes meaning a pedwarn. + +2007-02-22 Michael Matz + + PR c++/29433 + * cp-tree.h (TFF_UNQUALIFIED_NAME): New formatting flag. + * error.c (dump_aggr_type, dump_simple_decl, dump_decl, + dump_function_decl): Guard emitting outer scopes by new flag. + * cp-lang.c (cxx_dwarf_name): New function. + (LANG_HOOKS_DWARF_NAME): Define to cxx_dwarf_name. + * pt.c (classtype_mangled_name, mangle_class_name_for_template): + Remove functions. + (push_template_decl_real, lookup_template_class): Remove calls + to above functions. + +2007-02-19 Mark Mitchell + + * call.c (build_new_method_call): Ensure that explicit calls of + destructors have type "void". + +2007-02-19 Manuel Lopez-Ibanez + + * typeck.c (build_binary_op): Replace -Wstring-literal-comparison + and -Walways-true with -Waddress. + * cvt.c (convert_to_void): Replace unconditional warning with + -Waddress. + +2007-02-18 Kazu Hirata + + * decl.c, tree.c: Fix comment typos. + +2007-02-15 Andrew Pinski + + PR C++/30158 + * semantics.c (finish_stmt_expr_expr): Set TREE_TYPE of the + statement expression if we had an error mark node. + +2007-02-15 Sandra Loosemore + Brooks Moses + Lee Millward + + * cp-tree.def (AGGR_INIT_EXPR): Adjust documentation. + Change class to tcc_vl_exp. + + * call.c (build_call): Use build_call_list instead + of build3. + (build_over_call): Likewise. + (build_new_method_call): Use build_min_non_dep_call_list + instead of build_min_non_dep. + + * error.c (dump_call_expr_args): New function. + (dump_aggr_init_expr_args): New function. + (dump_expr) : Use them. + Update to use new CALL_EXPR and AGGR_INIT_EXPR accessor macros. + + * cvt.c (convert_to_void): Use build_call_array instead + of build3; use new AGGR_INIT_EXPR accessor macros. + + * mangle.c (write_expression): Use TREE_OPERAND_LENGTH + instead of TREE_CODE_LENGTH. + + * dump.c (cp_dump_tree) : Update to use new + AGGR_INIT_EXPR accessor macros. + + * cp-gimplify.c (cp_gimplify_init_expr): Use + AGGR_INIT_EXPR_SLOT to set the slot operand. + + * cp-tree.h (AGGR_INIT_EXPR_FN): New macro. + (AGGR_INIT_EXPR_SLOT): New macro. + (AGGR_INIT_EXPR_ARG): New macro. + (aggr_init_expr_nargs): New macro. + (AGGR_INIT_EXPR_ARGP): New macro. + (aggr_init_expr_arg_iterator): New. + (init_aggr_init_expr_arg_iterator): New. + (next_aggr_init_expr_arg): New. + (first_aggr_init_expr_arg): New. + (more_aggr_init_expr_args_p): New. + (FOR_EACH_AGGR_INIT_EXPR_ARG): New. + (stabilize_aggr_init): New declaration. + (build_min_non_dep_call_list): Likewise. + + * tree.c (process_aggr_init_operands): New function. + (build_aggr_init_array) New function. + (build_cplus_new): Update to use new CALL_EXPR and + AGGR_INIT_EXPR accessor macros. Replace use of build3 with + build_aggr_init_array. + (build_min_non_dep_call_list) New function. + (build_min_nt): Assert input code parameter is not a variable + length expression class. + (build_min, build_min_non_dep): Likewise. + (cp_tree_equal) : Iterate through the arguments + to check for equality instead of recursing. Handle tcc_vl_exp + tree code classes. + (stabilize_call): Update to only handle CALL_EXPRs, not + AGGR_INIT_EXPRs; use new CALL_EXPR accessor macros. + (stabilize_aggr_init): New function. + (stabilize_init): Use it. + + * cxx-pretty-print.c (pp_cxx_postfix_expression) + : Update to use new CALL_EXPR and + AGGR_INIT_EXPR accessor macros and argument iterators. + + * pt.c (tsubst_copy) : Replace build_nt with + build_vl_exp. Iterate through the operands, recursively + processing each one. + (tsubst_copy_and_build) : Update to use new + CALL_EXPR accessor macros. + (value_dependent_expression_p) : Handle tcc_vl_exp + tree code classes. Use TREE_OPERAND_LENGTH instead of + TREE_CODE_LENGTH. + + * semantics.c (finish_call_expr): Use build_nt_call_list + instead of build_nt. + (simplify_aggr_init_expr): Update to use new AGGR_INIT_EXPR + accessor macros. Use build_call_array to construct the + CALL_EXPR node instead of build3 + + * decl2.c (build_offset_ref_call_from_tree): Use + build_nt_call_list and build_min_non_dep_call_list instead + of build_min_nt and build_min_non_dep. + + * parser.c (cp_parser_postfix_expression) : + Use build_nt_call_list instead of build_min_nt. + +2007-02-15 Manuel Lopez-Ibanez + + PR c++/28943 + * call.c (build_conditional_expr): Improve error message. + +2007-02-13 Dirk Mueller + + * friend.c (do_friend): Annotate warning about friend + declarations in templates with OPT_Wnon_template_friend. + Convert informal message from warning() to inform(). + +2007-02-12 Simon Martin + Mark Mitchell + + PR c++/14622 + * pt.c (do_decl_instantiation): Detect type mismatches in explicit + instantiations for variables. + +2007-02-12 Manuel Lopez-Ibanez + + PR middle-end/7651 + * cp-gimplify.c (gimplify_expr_stmt): Don't check extra_warnings. + Check warn_unused_value just once. + +2007-02-11 Mark Mitchell + + PR c++/26988 + * pt.c (determine_specialization): Use skip_artificial_parms_for. + (fn_type_unificiation): Likewise. + (get_bindings): Likewise. + +o2007-02-06 Mark Mitchell + + PR target/29487 + * decl.c (finish_function): Use DECL_REPLACEABLE. + * tree.c (cp_cannot_inline_tree_fn): Likewise. + +2007-02-10 Gabriel Dos Reis + + * parser.c (cp_parser_primary_expression): Reformat overly long lines. + +2007-02-10 Richard Henderson , Jakub Jelinek + + * decl.c (grokvardecl): Don't error if !have_tls. + (grokdeclarator): Likewise. + * parser.c (cp_parser_omp_threadprivate): Likewise. + +2007-02-07 Jakub Jelinek + + PR c++/30703 + * cp-gimplify.c (cp_genericize_r): Don't dereference invisiref + parameters and result decls in omp clauses. + (cxx_omp_privatize_by_reference): Pass also invisiref PARM_DECLs + by reference. + +2007-02-05 Dirk Mueller + + PR bootstrap/30510 + * parser.c (cp_parser_class_specifier): Always initialize bases. + +2007-02-05 Paolo Bonzini + + * cp-tree.h (OMP_ATOMIC_CODE): Delete. + (OMP_ATOMIC_DEPENDENT_P): Rewrite. + * pt.c (tsubst_expr): Adjust for new format of dependent OMP_ATOMIC + expressions. + * semantics.c (finish_omp_atomic): Store a whole expression node + in operand 1, and integer_zero_node in operand 0, for dependent + OMP_ATOMIC. Rewrite to make flow easier to understand. + +2007-02-03 Gabriel Dos Reis + + * decl.c (grokdeclarator): Use OPT_Wreturn_type instead of 0. + +2007-02-04 Kazu Hirata + + * class.c, cp-tree.h, decl.c, decl2.c, g++spec.c, init.c, + parser.c, pt.c, tree.c, typeck.c: Follow spelling conventions. + +2007-02-03 Douglas Gregor + + * parser.c (cp_lexer_get_preprocessor_token): Attach the C++0x + keyword warning to -Wc++0x-compat. + +2007-02-03 Gabriel Dos Reis + + * decl.c (grokdeclarator): Update documentation. + +2007-02-02 Jakub Jelinek + + PR c++/30536 + * decl.c (grokdeclarator): If __thread is used together with + a storage class other than extern and static, clear thread_p + after issuing diagnostics and fall through to checking the + storage class. + +2007-01-30 Roger Sayle + + * error.c (dump_type_suffix): Avoid use of cp_build_binary_op when + calculating the size of an array (to avoid recursive errors). + +2007-01-30 Manuel Lopez-Ibanez + + PR c++/24745 + * typeck.c (build_binary_op): Fix logic for warning. Move warning + to -Wpointer-arith. + * call.c (convert_like_real): Don't warn when converting to + boolean type. + +2007-01-29 Manuel Lopez-Ibanez + + * decl.c (pop_label): Replace warning with call to + warn_for_unused_label. + +2007-01-28 Andrew Pinski + + PR C++/28988 + * semantics.c (finish_pseudo_destructor_expr): Check the + destrutor name by calling check_dtor_name. + +2007-01-24 Douglas Gregor + + * lex.c (D_CPP0X): Rename. + (D_CXX0X): To this. + (reswords): D_CPP0X -> D_CXX0X. + (init_reswords): Ditto. + * parser.c (cp_lexer_get_preprocessor_token): Warn about the use + of C++0x keywords as identifiers. + +2007-01-23 Simon Martin + + PR c++/27492 + * decl.c (duplicate_decls): Don't reset DECL_INVALID_OVERRIDER_P for + function decls. + +2007-01-23 Ian Lance Taylor + + * typeck.c (convert_for_assignment): Only warn about a = b = c + when converting to bool. + +2007-01-23 Roger Sayle + + * call.c (null_ptr_cst_p): Replace use of TREE_CONSTANT_OVERFLOW with + TREE_OVERFLOW. + * typeck.c (ignore_overflows): Remove the remaining uses of + TREE_CONSTANT_OVERFLOW. + +2007-01-20 Jan Hubicka + + * decl2.c (start_objects, start_static_storage_duration_function): + Do not make the functions uninlinable. + +2007-01-17 Ian Lance Taylor + + * class.c (add_method): Call VEC_reserve_exact rather than passing + a negative size to VEC_reserve. + +2007-01-11 Simon Martin + + PR c++/29573 + * tree.c (cp_tree_equal): Properly handle MODOP_EXPR trees. + +2007-01-10 Mark Mitchell + + PR c++/28999 + * decl.c (make_typename_type): If the qualified name is not a + type, issue an error. + * parser.c (cp_parser_elaborated_type_specifier): Fix comment + formatting. + +2007-01-08 Geoffrey Keating + + * rtti.c: Include target.h. + (emit_support_tinfos): If ! targetm.cxx.library_rtti_comdat (), + don't emit typeinfo for fundamental types as weak. + * Make-lang.in (cp/rtti.o): Update and correct dependencies. + +2007-01-08 Richard Guenther + + * cvt.c (cp_convert_to_pointer): Use build_int_cst_type. + +2007-01-08 Mark Shinwell + + * call.c (standard_conversion): Pass flag to + vector_types_convertible_p to disallow emission of note. + * typeck.c (convert_for_assignment): Pass flag to + vector_types_convertible_p to allow emission of note. + (ptr_reasonably_similar): Pass flag to vector_types_convertible_p + to disallow emission of note. + +2007-01-07 Manuel Lopez-Ibanez + + PR c++/28986 + * typeck.c (build_binary_op): Call overflow_warning if + TREE_OVERFLOW_P is true for the result and not for any of the + operands. + +2007-01-06 Lee Millward + + PR c++/19439 + * class.c (add_method): Don't wait until template + instantiation time to complain about duplicate methods. + +2007-01-05 Manuel Lopez-Ibanez + + PR c/19978 + * semantics.c (finish_unary_op_expr): Warn only if result + overflowed and operands did not. + +2007-01-05 Ian Lance Taylor + + * typeck.c (build_binary_op): Warn about comparing a non-weak + address to NULL. + +2007-01-05 Douglas Gregor + + * pt.c (tsubst): Propagate the need for structural equality checks + when reducing the level of template parameters. + +2007-01-03 Kazu Hirata + + * pt.c: Fix a comment typo. + +2007-01-02 Ian Lance Taylor + + * semantics.c (maybe_convert_cond): Optionally warn when using an + assignment as a condition. + * typeck.c (convert_for_assignment): Optionally warn about + assigning the result of an assignment to a bool. + +2007-01-02 Douglas Gregor + + * pt.c (canonical_template_parms): Correct typo in comment. + +2007-01-02 Douglas Gregor + + * typeck.c (structural_comptypes): Renamed from "comptypes". + (comptypes): Use canonical type information to perform fast type + comparison. When VERIFY_CANONICAL_TYPES, verify that the + canonical type comparison returns the same results as we would see + from the current, structural check. Support COMPARE_STRUCTURAL + when we need structural checks. + * decl.c (typename_compare): Fix comment. + (build_typename_type): TYPENAME_TYPE nodes require structural + equality checks, because they resolve different based on the + current class type. + (make_unbound_class_template): UNBOUND_CLASS_TEMPLATE nodes + require structural equality checks (for now). + (build_ptrmemfunc_type): Build the canonical pointer to member + function type. + (compute_array_index_type): Whenever we build a new index type + to represent the size of an array in a template, we need to mark + this index type as requiring structural equality. This goes for + arrays with value-dependent sizes with the current ABI, or all + arrays with ABI-1. + * tree.c (cplus_array_hash): New. + (struct cplus_array_info): New. + (cplus_array_compare): New. + (cplus_array_htab): New. + (build_cplus_array_type_1): Use a hash table to cache the array + types we build. Build the canonical array type for each array + type. + (cp_build_qualified_type_real): When building a cv-qualified array + type, use the hash table of array types and build canonical array + types as necessary. + (bind_template_template_parm): BOUND_TEMPLATE_TEMPLATE_PARM nodes + use structural equality (for now). + * cp-tree.h (COMPARE_STRUCTURAL): New. + * pt.c (canonical_template_parms): New. + (canonical_type_parameter): New. + (process_template_parm): Find the canonical type parameter. + (lookup_template_class): When we have named the primary template + type, set the canonical type for our template class to the primary + template type. If any of the template arguments need structural + equality checks, the template class needs structural equality + checks. + (tsubst): When reducing the level of a template template + parameter, we require structural equality tests for the resulting + parameter because its template parameters have not had their types + canonicalized. When reducing a template type parameter, find the + canonical reduced type parameter. + (any_template_arguments_need_structural_equality_p): New. + + +Copyright (C) 2007 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2008 b/gcc/cp/ChangeLog-2008 new file mode 100644 index 000000000..5a69a5d20 --- /dev/null +++ b/gcc/cp/ChangeLog-2008 @@ -0,0 +1,3263 @@ +2008-12-31 Jakub Jelinek + + PR c++/38647 + * parser.c (cp_parser_primary_expression) : + Return error_mark_node if cp_parser_non_integral_constant_expression + returns true. + + PR c++/38640 + * semantics.c (finish_decltype_type): Handle TEMPLATE_PARM_INDEX. + +2008-12-29 Jakub Jelinek + + PR c++/38635 + * parser.c (cp_parser_condition): Use cp_parser_require + instead of cp_lexer_consume_token to consume =. + + PR c++/38637 + * decl.c (start_enum): If enumtype is error_mark_node, exit early. + +2008-12-28 Jakub Jelinek + + PR c++/38650 + * semantics.c (finish_omp_for): Don't add CLEANUP_POINT_EXPR + around volatile iteration var in condition and/or increment + expression. + +2008-12-27 Jakub Jelinek + + PR c++/38639 + * pt.c (tsubst_omp_for_iterator): RECUR on whole init_expr instead of + just its type. + +2008-12-21 Jason Merrill + + PR c++/38597 + * name-lookup.c (arg_assoc_type): Handle DECLTYPE_TYPE. + +2008-12-20 Jakub Jelinek + Manuel LĂłpez-Ibåñez + + PR c++/36921 + * c-common.c (warn_about_parentheses): Remove ARG_UNUSED from + arg_left. Don't warn about X<=Y<=Z if comparison's type isn't + integral. + +2008-12-19 Jakub Jelinek + + PR c++/38577 + * call.c (build_new_method_call): Handle call being COMPOUND_EXPR + or NOP_EXPR. + +2008-12-18 Jakub Jelinek + + PR c++/38427 + * init.c (perform_member_init): For value-initialized + references call permerror instead of warning and don't emit any + INIT_EXPR. + +2008-12-18 Jason Merrill + + PR c++/38485 + * parser.c (cp_parser_token_starts_cast_expression): An EOF + can't start a cast-expression. + +2008-12-17 Jason Merrill + + * semantics.c (describable_type): New function. + (finish_decltype_type): Use it for dependent exprs. + * cp-tree.h: Declare it. + * mangle.c (write_type) [DECLTYPE_TYPE]: Set skip_evaluation. + (write_expression): If skip_evaluation, use type stubs. + * tree.c (cp_tree_equal): Handle PARM_DECLs from different + declarations of a function. + * init.c (build_new): Do auto deduction if type is describable. + * decl.c (cp_finish_decl): Likewise. + * parser.c (cp_parser_omp_for_loop): Likewise. + +2008-12-10 Jason Merrill + + PR c++/35319 + * mangle.c (write_builtin_type): Add mangling for decimal floating + point and fixed point types. + (write_type): Pass FIXED_POINT_TYPE along. + +2008-12-09 Mark Mitchell + + PR c++/37971 + * class.c (resolve_address_of_overloaded_function): Check + accessibility of member functions unless FLAGS indicates + otherwise. + * call.c (standard_conversion): Adjust flags passed to + instantiate_type. + (convert_default_arg): Do not perform access checks. + * cp-tree.h (tsubst_flags_t): Add tf_no_access_control. + +2008-12-08 Steve Ellcey + + * decl2.c (mark_used): Remove assemble_external call. + +2008-12-08 Dodji Seketeli + + PR debug/38390 + * name-lookup.c (kept_level_p): Don't forget the case of levels + having using directives. + +2008-12-08 Richard Henderson + + PR 38240 + * class.c (finish_struct_bits): Use SET_TYPE_MODE. + * decl.c (record_unknown_type): Likewise. + (start_enum, finish_enum): Likewise. + +2008-12-05 Jakub Jelinek + + PR c++/35336 + * error.c (dump_expr): Handle BIT_FIELD_REF. + +2008-12-05 Sebastian Pop + + PR bootstrap/38262 + * Make-lang.in (cc1plus-dummy, cc1plus): Add BACKENDLIBS, + remove GMPLIBS. + +2008-12-04 Jason Merrill + + PR c++/37906 + * decl.c (grok_special_member_properties): Set TYPE_HAS_COMPLEX_DFLT + here. + * class.c (check_bases_and_members): Rather than assuming any + user-declared default constructor is complex here. + +2008-12-04 Richard Guenther + + PR c++/38334 + * typeck.c (get_member_function_from_ptrfunc): Mark the vtbl + pointer access with TREE_NO_WARNING. + +2008-12-03 Jason Merrill + + PR c++/38232 + * init.c (build_value_init): Do initial zero-initialization + of a class with an implicitly-defined constructor using + build_zero_init rather than in build_value_init. + (build_value_init_1): Fold into build_value_init. + + PR c++/38256 + * parser.c (cp_parser_conversion_type_id): Diagnose + 'operator auto' here. + * decl.c (grokdeclarator): Not here. + + PR c++/38380 + * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P + on explicit constructors. + * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Propagate + CONSTRUCTOR_IS_DIRECT_INIT. + +2008-12-02 Jason Merrill + + PR c++/35782, c++/37860 + * call.c (build_user_type_conversion_1): Remember + list-initialization. + (convert_like_real): Likewise. + (build_over_call): Don't require the copy constructor + for copy-list-initialization. + * cp-tree.h (TARGET_EXPR_LIST_INIT_P): New macro. + + PR c++/37234 + * decl.c (cp_finish_decl): Handle =default and =delete for + templates, too. + +2008-12-01 Jakub Jelinek + + PR c++/38257 + * parser.c (cp_parser_omp_for_loop): Handle auto. + * pt.c (tsubst_omp_for_iterator): Likewise. + +2008-11-28 Jason Merrill + + PR c++/38233 + * init.c (perform_member_init): Fix value-initialization. + (build_value_init_1): Add assert to catch cases that will break + in the gimplifier. + (build_default_init): Remove. + * cp-tree.h: Remove its prototype. + * pt.c (tsubst_expr) [DECL_EXPR]: Use build_value_init for + value-initialization. + + PR c++/38278 + * parser.c (cp_parser_class_name): Only call + maybe_note_name_used_in_class if we actually found a class name. + +2008-11-25 Jason Merrill + + PR c++/28743 + * decl2.c (check_classfn): Error rather than abort on parameter + list mismatch. + +2008-11-20 Jason Merrill + + PR c++/28513 + * parser.c (cp_parser_class_name): Call maybe_note_name_used_in_class. + + PR c++/37540 + * call.c (build_over_call): Take the address of the function even + in a template. + (build_new_method_call): Remember the type of the called function + in a template. + +2008-11-19 Dodji Seketeli + + PR c++/37142 + * pt.c (coerce_template_template_parm): Use the more robust + uses_template_parms instead of dependent_type_p. + +2008-11-19 Dodji Seketeli + + PR c++/35405 + * pt.c (lookup_template_class): Check pointers before dereferencing + them. + * error.c (dump_template_decl): Likewise. + +2008-11-19 Jason Merrill + + PR c++/36410 + * decl2.c (grokfield): Pass ATTR_FLAG_TYPE_IN_PLACE for a typedef + that names a class for linkage purposes. + + PR c++/37563 + * parser.c (cp_parser_pseudo_destructor_name): A pseudo-destructor + name is not a declaration. + + PR c++/37256 + * pt.c (instantiate_decl): Don't require a definition of + a template that is explicitly instantiated 'extern'. + +2008-11-18 Jason Merrill + Jakub Jelinek + + PR c++/37962 + * parser.c (cp_parser_type_id): Complain about auto. + * decl.c (grokdeclarator): Complain about parameters and + conversion functions declared with auto. + + * call.c (standard_conversion): Use CLASS_TYPE_P instead of + MAYBE_CLASS_TYPE_P. + * cp-tree.h (TYPE_NON_AGGREGATE_CLASS): Likewise. + +2008-11-17 Jakub Jelinek + + PR c++/36089 + * init.c (constant_value_1): Handle TREE_LIST init. + +2008-11-15 Jakub Jelinek + + PR c++/37561 + * typeck.c (cp_build_unary_op): Don't call get_unwidened. Use + argtype instead of result_type. + +2008-11-14 Jason Merrill + + PR c++/38030 + * semantics.c (finish_call_expr): Don't repeat arg-dep lookup + for a non-dependent call. + + PR c++/37740 + * call.c (build_aggr_conv): Increment i. + +2008-11-13 Jason Merrill + + PR c++/37932 + * typeck2.c (process_init_constructor_record): Update bitfield + handling. + (check_narrowing): Update bitfield handling, print source type. + +2008-11-12 Jakub Jelinek + + PR c++/36478 + Revert: + 2007-05-07 Mike Stump + * parser.c (check_empty_body): Add. + (cp_parser_iteration_statement): Add call to check_empty_body. + +2008-11-12 Jason Merrill + + PR c++/38007 + * typeck.c (cp_build_modify_expr): Update bitfield handling. + +2008-11-12 Jakub Jelinek + + PR c++/34269 + * parser.c (cp_parser_simple_declaration): Don't commit + to tentative parse if parse errors were seen. + + PR c++/35334 + * error.c (dump_expr): Handle COMPLEX_EXPR. + +2008-11-10 Jakub Jelinek + + PR c++/38021 + * parser.c (cp_parser_enum_specifier): After parsing :, + parse definitely. Don't return early if type specifier + is erroneous. + +2008-11-06 David Edelsohn + + PR target/26397 + * g++spec.c (LIBSTDCXX_STATIC): New. + (lang_spec_driver): Use LIBSTDCXX_STATIC when not + shared_libgcc. + +2008-11-05 Fabien Chene + + PR c++/32519 + * cp-tree.h: Fix DECL_NONSTATIC_MEMBER_P to handle member template + functions. + +2008-11-05 Richard Guenther + + PR middle-end/37742 + * decl.c (start_preparsed_function): Use the correct type for + building the RESULT_DECL. + +2008-10-31 Jakub Jelinek + + PR c++/37967 + * decl.c (grokdeclarator): Diagnose auto function decl without + late return type and late return type function decl where type + is not auto. + + PR c++/37965 + * decl.c (cp_finish_decl): Diagnose type_uses_auto type with + no initializer. + +2008-10-29 Manuel Lopez-Ibanez + + PR 11492 + * class.c (check_bitfield_decl): Rename min_precision to + tree_int_cst_min_precision. + * decl.c (finish_enum): Likewise. + +2008-10-29 Manuel LĂłpez-Ibåñez + + PR c++/26997 + * parser.c (cp_parser_token_starts_cast_expression): New. + (cp_parser_cast_expression): Peek the next token to decide whether + this could be a parenthesized constructor or is definitely an + actual cast. + +2008-10-24 Manuel LĂłpez-Ibåñez + + PR c/7543 + * typeck.c (build_x_binary_op): Update call to + warn_about_parentheses. + * parser.c (cp_parser_binary_expression): Add note about passing + the correct code for unary expressions. + +2008-10-24 Jakub Jelinek + + * Make-lang.in (check-c++-subtargets): New alias for + check-g++-subtargets. + (lang_checks_parallelized): Add check-g++. + (check_g++_parallelize): New variable. + +2008-10-21 Richard Guenther + + * semantics.c (simplify_aggr_init_exprs_r): Remove. + (expand_or_defer_fn): Do not walk the function body to + simplify aggr_init_exprs. + +2008-10-20 Manuel LĂłpez-Ibåñez + + PR c++/37004 + * typeck.c (cp_common_type): New. The same as + type_after_usual_arithmetic_conversions but without promotions. + (type_after_usual_arithmetic_conversions): Do the promotions and + call cp_common_type. + (common_type): Make it behave like the C version of this + function. Do not handle pointer types. + (common_pointer_type): Move handling of pointer types from + common_type to here. + (cp_build_binary_op): Use common_pointer_type instead of + common_type in call to pointer_diff. + Use cp_common_type instead of common_type. + * cp-tree.h (common_pointer_type): Declare. + +2008-10-14 Jakub Jelinek + + PR c++/37819 + * cp-gimplify.c (cp_genericize_r): Only fold_convert COND_EXPR + arguments if they don't already have COND_EXPR's type. + +2008-10-14 Paolo Carlini + + PR c++/37650 + * pt.c (push_template_decl_real): Check that current_template_parms + is not null. + (process_partial_specialization): Assert current_template_parms not + null. + +2008-10-13 Doug Evans + + * cp-tree.h (DECL_MAIN_P): Fix parentheses around expression. + +2008-10-10 Jakub Jelinek + + PR c++/37146 + * cp-gimplify.c (cp_genericize_r): Fix up bitfield operands of + COND_EXPR. + +2008-10-09 Jakub Jelinek + + PR c++/37568 + * semantics.c (finalize_nrv_r): Clear DECL_INITIAL instead of + setting it to error_mark_node. + +2008-10-07 Steve Ellcey + + * decl.c (start_cleanup_fn): Declare as inline. + +2008-10-06 Jason Merrill + + PR c++/37376, other mangling issues + * mangle.c (write_type): Update TYPE_PACK_EXPANSION mangling. + (write_member_name): Break out from... + (write_expression): ...here. Handle dependent COMPONENT_REF. + (write_template_arg): Wrap an argument pack in 'I'/'E'. + (write_builtin_type): Update char16/32_t mangling. + (write_nested_name, write_prefix): Don't forget template args + for typename types. + * operators.def: Add ARROW_EXPR, update COMPONENT_REF and + EXPR_PACK_EXPANSION. + +2008-10-06 Aldy Hernandez + + * typeck.c (build_x_indirect_ref): Add location argument. + (cp_build_binary_op): Pass location to warn_for_div_by_zero. + (cp_build_unary_op): Add location argument. + (cp_build_modify_expr): Same. + * class.c (build_base_path): Pass location to build_indirect_ref. + * semantics.c (handle_omp_for_class_iterator): Pass elocus to + build_modify_expr. + +2008-10-05 Dodji Seketeli + + PR c++/37410 + * cp-gimplify.c (cp_gimplify_expr): For each USING_STMT + make sure an IMPORTED_DECL node is added to the BLOCK_VARS list + of the innermost containing BLOCK. + +2008-10-03 Paolo Carlini + + PR c++/37719 + * error.c (dump_function_decl): Save the exceptions in case of + error about incompatible specifications in a specialization. + +2008-10-01 Andrew Pinski + + * tree.c (lvalue_p_1): COMPOUND_LITERAL_EXPR is also an lvalue. + +2008-09-30 H.J. Lu + + PR c++/37683 + * parser.c (cp_parser_selection_statement): Fix uninitialized + variable. + +2008-09-30 Simon Martin + + PR c++/37555 + PR c++/37556 + * decl.c (grokdeclarator): Set the type for typedefs to a + nested-name-specifier to error_mark_node. + +2008-09-30 Paolo Bonzini + + * parser.c (cp_parser_selection_statement): Implement here the + -Wempty-body warning for `if' and `else' statements. + * semantics.c (finish_if_stmt): Do not call empty_body_warning. + +2008-09-25 Paolo Carlini + + PR c++/37649 + * name-lookup.c (maybe_process_template_type_declaration): Check + return value of push_template_decl_real for error_mark_node. + +2008-09-24 Aldy Hernandez + + * semantics.c (finish_fname): Pass location to fname_decl. + +2008-09-23 Jakub Jelinek + + PR c++/37533 + * semantics.c (finish_omp_for): If processing_template_decl, just build + MODIFY_EXPR for init instead of calling cp_build_modify_expr. + +2008-09-23 Aldy Hernandez + + * typeck.c (build_array_ref): Pass location to cp_build_binary_op. + (get_member_function_from_ptrfunc): Same. + (build_x_binary_op): Same. + (build_binary_op): Same. + (cp_build_binary_op): New location argument. + (pointer_diff): Pass location to cp_build_binary_op. + (cp_truthvalue_conversion): Pass location to build_binary_op. + (convert_ptrmem): Pass location to cp_build_binary_op. + (cp_build_modify_expr): Same. + (build_ptrmemfunc): Same. + * init.c (expand_cleanup_for_base): Pass location to + c_common_truthvalue_conversion. + (build_new_1): Pass location to cp_build_binary_op. + (build_vec_delete_1): Pass location to *build_binary_op, + c_common_truthvalue_conversion. + (build_vec_init): Same. + (build_delete): Same. + * decl.c (compute_array_index_type): Same. + * call.c (build_new_op): Same. + * rtti.c (build_dynamic_cast_1): Same. + * cp-tree.h: Add argument to cp_build_binary_op. + * semantics.c (handle_omp_for_class_iterator): Pass location to + *build_binary_op, c_common_truthvalue_conversion. + * decl2.c (get_guard_cond): Same. + +2008-09-17 Richard Guenther + + PR c++/22374 + * rtti.c (build_dynamic_cast_1): Convert the COND_EXPR + result to the correct type. + +2008-09-17 H.J. Lu + + PR c++/37450 + * name-lookup.c (pushdecl_maybe_friend): Don't return the old + parameter for duplicate. + +2008-09-17 Jason Merrill + + PR c++/37588 + * name-lookup.c (lookup_type_scope): Look through sk_function_parms. + +2008-09-17 Jakub Jelinek + + PR c++/37552 + * typeck.c (build_array_ref): Use protected_set_expr_location instead + of SET_EXPR_LOCATION when ret might not be an expression. + +2008-09-17 Jan Hubicka + + PR c++/18071 + * cp/decl.c (start_method): Set DECL_NO_INLINE_WARNING_P. + +2008-09-16 Jakub Jelinek + + PR c++/37531 + * semantics.c (finish_compound_literal): Return error_mark_node if + type is errorneous. + + PR c++/37532 + * lex.c (init_reswords): Don't populate ridpointers for D_CONLY + reserved words. + +2008-09-15 Aldy Hernandez + + * decl.c (duplicate_decls): Call error_at. + (grokfndecl): New location argument. Use location if available. + (grokdeclarator): Pass declarator location to grokfndecl. + * cp-tree.h (struct cp_declarator): Update comment for id_loc. + * decl2.c (check_classfn): Use error_at. + * parser.c (cp_parser_init_declarator): Set function_start_locus + to brace location. + (cp_parser_member_declaration): Set id_loc for function declarators. + +2008-09-09 Jan Hubicka + + PR middle-end/37500 + * pt.c (tsubst_decl): Do not copy DECL_STRUCT_FUNCTION pointer. + +2008-09-09 Jakub Jelinek + + PR c++/37417 + * tree.c (array_type_nelts_top): Add size_one_node instead of + integer_one_node. + +2008-09-09 Jason Merrill + + PR c++/37439 + * pt.c (tsubst_copy) [PARM_DECL]: Don't abort if the parm has + DECL_CONTEXT set. + +2008-09-09 Jakub Jelinek + + PR c++/37389 + * decl.c (build_enumerator): Handle previous value's DECL_INITIAL + being error_operand_p. Don't clear value if it was error_mark_node. + +2008-09-09 Paolo Bonzini + + * cp-objcp-common.h (LANG_HOOKS_EXPAND_DECL): Remove. + * cp-tree.h: Don't mention DECL_ANON_UNION_ELEMS. + * semantics.c (anon_aggr_type_p): Remove. + +2008-09-06 Jason Merrill + + PR c++/37302 + * parser.c (cp_parser_parameter_declaration_list): Process the + PARM_DECLs as we go and push them. Return a TREE_LIST. + (cp_parser_parameter_declaration_clause): Return a TREE_LIST. + (cp_parser_direct_declarator): Create a binding level and + suppress deprecated warnings in the parameter list. + (make_call_declarator): PARMS is now a tree. + * cp-tree.h (struct cp_declarator): Function parms are now a tree. + * decl.h (enum deprecated_states, deprecated_state): Move here. + * decl.c: From here. + (type_is_deprecated): New fn. + (grokparms): PARMLIST is a tree now. Warn about parms that + use deprecated types. + * mangle.c (write_expression): Handle PARM_DECL, CALL_EXPR and + 0-operand cast. + * pt.c (tsubst) [DECLTYPE_TYPE]: Set skip_evaluation. + (tsubst_copy) [PARM_DECL]: Handle a PARM_DECL used outside of a + function. + * name-lookup.c (pushtag): Look through function parameter scopes. + (pushdecl_maybe_friend): Don't set DECL_CONTEXT on a PARM_DECL + when we're parsing a function declarator. + +2008-09-05 Douglas Gregor + + PR c++/37342 + * tree.c (cp_build_qualified_type_real): Deal with sharing of + TYPE_LANG_SPECIFIC in the canonical types of pointer-to-method + types. + +2008-09-04 Ian Lance Taylor + + * parser.c (check_no_duplicate_clause): Change code parameter to + enum omp_clause_code. + +2008-09-03 Jakub Jelinek + + PR c++/37348 + * decl.c (cp_finish_decl): Only set + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P if decl is VAR_DECL. + + PR c++/37189 + * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): New + extern decls. + * decl2.c (mark_used): If defer_mark_used_calls, push decl into + deferred_mark_used_calls vector and exit early. + * decl.c (defer_mark_used_calls, deferred_mark_used_calls): New + variables. + (finish_function): Set defer_mark_used_calls for the duration of the + function. Call mark_used on any queued decls. + +2008-09-02 Jason Merrill + + PR c++/37208 + * call.c (build_over_call): Make =delete work with SFINAE. + * class.c (resolve_address_of_overloaded_function): Likewise. + + * cp-tree.h (struct lang_decl_flags): Rename threadprivate_p to + threadprivate_or_deleted_p. + (CP_DECL_THREADPRIVATE_P): Adjust. + (DECL_DELETED_FN): Likewise. + (SD_UNINITIALIZED, SD_INITIALIZED, SD_DEFAULTED): New macros. + (SD_DELETED): New macro. + * parser.c (cp_parser_init_declarator): Use them. + * decl.c (start_decl): Use them. + + * decl2.c (mark_used): Give =deleted error even in sizeof. + + * typeck2.c (check_narrowing): Downgrade narrowing error to + permerror. + +2008-09-02 Aldy Hernandez + + * typeck.c (build_array_ref): Use new location argument. + * class.c (build_vtbl_ref_1): Pass location to build_array_ref. + * call.c (build_new_op): Same. + * decl2.c (grok_array_decl): Same. + * cp-tree.h (build_array_ref): Add location argument to prototype. + +2008-09-01 Aldy Hernandez + + * typeck.c (build_x_indirect_ref): Add location argument. + * class.c (build_base_path): Pass location to build_indirect_ref. + * pt.c (tsubst_copy_and_build): Pass location to + finish_label_address_expr. + * parser.c (cp_parser_unary_expression): Same. + +2008-08-31 Jason Merrill + + Implement late-specified return type using 'auto'. + * cp-tree.h (struct cp_declarator): Add late_return_type field to + function declarator. + * parser.c (cp_parser_late_return_type_opt): New fn. + (cp_parser_direct_declarator): Use it. + (make_call_declarator): Put it in the declarator. + * decl.c (grokdeclarator): Splice in late-specified return type. + * pt.c (splice_late_return_type): New fn. + +2008-08-29 Michael Meissner + + * decl.c (builtin_function_1): Take a bool argument to decide + whether to use pushdecl or pushdecl_top_level. + (duplicate_decls): Copy function specific target and optimization + options on duplicate declarations. + (cxx_builtin_function): Update builtin_function_1 call. + (cxx_builtin_function_ext_scope): New function, guarantee that the + declaration is done at global scope. + + * cp-objcp-common.h (LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE): New + macro, define builtin function hook for delayed machine specific + builtins. + + * cp-tree.h (cxx_builtin_function_ext_scope): Add declaration. + +2008-08-30 Jason Merrill + + PR c++/37288 + * pt.c (dependent_type_p): Don't abort on auto outside of a template. + +2008-08-29 Jason Merrill + + Implement C++0x 'auto' semantics. + * decl.c (start_decl_1): Don't complain about auto being incomplete. + (cp_finish_decl): Deduce auto. + * init.c (build_new): Handle 'new auto'. + * typeck2.c (cxx_incomplete_type_diagnostic): Give a different + message for auto than for normal template type parms. + * pt.c (type_dependent_expression_p): Handle { }. + (make_auto): New function. + (listify_autos): New function. + (do_auto_deduction): New function. + (is_auto): New function. + (type_uses_auto): New function. + * cp-tree.h: Declare them. + * parser.c (cp_parser_decl_specifier_seq): In C++0x mode, don't + treat auto as a declspec. + (cp_parser_simple_type_specifier): It's a type-specifier. + +2008-08-29 Mark Mitchell + + * mangle.c (write_type): Add target-specific manglings for + non-fundamental types to the substitution table. + gcc/testsuite/ + +2008-08-29 Jakub Jelinek + + PR fortran/29635 + PR fortran/23057 + * name-lookup.c (do_using_directive, cp_emit_debug_info_for_using): + Adjust debug_hooks->imported_module_or_decl callers. + +2008-08-29 Jan Hubicka + + * cp-gimplify.c (cp_gimplify_expr): Add PRED_CONTINUE heuristic. + +2008-08-28 Paolo Carlini + + PR c++/37260 + * decl.c (reshape_init_r): Check init for error_mark_node. + +2008-08-27 Manuel Lopez-Ibanez + + PR c++/17880 + * semantics.c (maybe_convert_cond): Call verify_sequence_points. + (finish_return_stmt): Likewise. + (finish_switch_condition): Likewise. + +2008-08-27 Manuel Lopez-Ibanez + + * cp-tree.h: Fix #error directive. + +2008-08-26 Douglas Gregor + + * typeck.c (type_after_usual_arithmetic_conversions): Don't do the + usual arithmetic conversions on scoped enumeration types. + (common_type): Ditto. + (default_conversion): Don't perform integral promotions on scoped + enumeration types. + (build_array_ref): Scoped enumeration types can't be used as + subscripts. + * decl.c (start_enum): If building a C++0x scoped enumeration, + enter its scope. If provided with an underlying type, check that + underlying type and set up the enumeration type accordingly. + (finish_enum): Only compute an underlying type if the underlying + type isn't already fixed, and only convert the enumerator values + now if we've just computed the underlying type. Finish the scope + of C++0x scoped enumerations. + (build_enumerator): For enumerations with a fixed underlying type, + check the enumerator values when the enumerator is defined. + (lookup_enumerator): New. + * call.c (standard_conversion): Don't allow assignment from + integers to scoped enumeration types, even with -fpermissive. + Don't convert from scoped enumerations to bool or any arithmetic + types. + (build_conditional_expr): Don't per the usual arithmetic + conversions for scoped enumeration types. + (convert_like_real): Check complain to see if we should + produce warnings. + * error.c (class_key_or_enum_as_string): Print scoped enums. + * cp-tree.h (MAYBE_CLASS_TYPE_P): Check CLASS_TYPE_P, not + TYPE_LANG_FLAG_5. + (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P): New. + (SCOPED_ENUM_P): New. + (UNSCOPED_ENUM_P): New. + (SET_SCOPED_ENUM_P): New. + (ENUM_UNDERLYING_TYPE): New. + * pt.c (lookup_template_class): Update the instantiation of enum + types to deal with C++0x scoped enumerations and underlying + types. + * name-lookup.c (begin_scope): Deal with scoped enumeration + scopes. + (lookup_qualified_name): Deal with lookup into enumeration types. + * name-lookup.h (enum scope_kind): Add sk_scoped_enum. + * parser.c (cp_parser_class_or_namespace_name): Rename to... + (cp_parser_qualifying_entity): ... this. Also, in C++0x mode, + parse a type-name that can be an enumeration type. + (cp_parser_nested_name_specifier_opt): Update with C++0x grammar. + (cp_parser_elaborated_type_specifier): Parse the + optional `struct' or `class' following enum (in C++0x). + (cp_parser_enum_specifier): Parse C++0x scoped enumerations and + enum-base clauses. + +2008-08-21 Manuel Lopez-Ibanez + + * typeck.c: Update all calls to pedwarn. + * decl.c: Likewise. + * call.c: Likewise. + * error.c: Likewise. + * pt.c: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + +2008-08-20 Manuel Lopez-Ibanez + + PR c++/35158 + * parser.c (cp_parser_omp_for_loop): Handle parenthesized + initializers. + +2008-08-20 Manuel Lopez-Ibanez + + * parser.c: Update all calls to inform. + * typeck.c: Likewise. + * init.c: Likewise. + * class.c: Likewise. + * call.c: Likewise. + * method.c: Likewise. + * friend.c: Likewise. + * typeck2.c: Likewise. + * pt.c: Likewise. + * name-lookup.c: Likewise. + * lex.c: Likewise. + +2008-08-19 Jakub Jelinek + + PR debug/37156 + * error.c (cp_print_error_function): Deal with recursive BLOCK trees. + +2008-08-18 Tomas Bily + + * tree.c (cp_tree_equal): Use CONVERT_EXPR_CODE_P. + +2008-08-18 Manuel Lopez-Ibanez + + * typeck.c: Update all callers of permerror. + * init.c: Likewise. + * class.c: Likewise. + * decl.c: Likewise. + * call.c: Likewise. + * except.c: Likewise. + * cvt.c: Likewise. + * typeck2.c: Likewise. + * pt.c: Likewise. + * semantics.c: Likewise. + * name-lookup.c: Likewise. + * lex.c: Likewise. + * decl2.c: Likewise. + * parser.c: Likewise. + +2008-08-14 Paolo Carlini + + PR c++/34485 + * pt.c (check_template_shadow): Change to return a bool. + * name-lookup.c (push_class_level_binding): Early return if + check_template_shadow returns false. + * cp-tree.h (check_template_shadow): Adjust declaration. + +2008-08-14 Paolo Carlini + + PR c++/34600 + * decl.c (grokdeclarator): In case of extern and initializer, return + error_mark_node after the error. + +2008-08-13 Manuel Lopez-Ibanez + + PR 30551 + * decl.c (grokfndecl): Call check_main_parameters_type only if + -Wmain. + +2008-08-12 Paolo Carlini + + PR c++/37087 + * parser.c (cp_parser_class_head): Early return error_mark_node in + case of global qualification of class name or qualified name that + does not name a class. + +2008-08-09 Manuel Lopez-Ibanez + + PR c++/12242 + * cvt.c (ocp_convert): Warn for out-of-range conversions to enum. + +2008-08-09 Manuel Lopez-Ibanez + + PR 36901 + * cp-tree.h (struct diagnostic_context, struct diagnostic_info): + Delete forward declarations. Check that toplev.h has not been + included before this file. Include toplev.h and diagnostic.h. + * error.c (cp_cpp_error): Use DK_PEDWARN. + (cxx_incomplete_type_diagnostic): Update declaration. + (cxx_incomplete_type_error): Use DK_ERROR. + * typeck2.c (cxx_incomplete_type_diagnostic): Take a diagnostic_t + as argument. Use emit_diagnostic. + (cxx_incomplete_type_error): Use DK_ERROR. + (add_exception_specifier): Use diagnostic_t instead of custom + codes. + * typeck.c (complete_type_or_else): Update call to + cxx_incomplete_type_diagnostic. + * init.c (build_delete): Likewise. + * call.c (diagnostic_fn_t): Remove unused typedef. + (build_temp): Pass a pointer to diagnostic_t. + (convert_like_real): Use emit_diagnostic. + (joust): Check return value of warning before giving informative + note. + * friend.c (do_friend): Check return value of warning + before giving informative note. + * parser.c (cp_parser_template_id): Likewise. + +2008-08-09 Manuel Lopez-Ibanez + + PR 7651 + * class.c (check_bases_and_members): Warn with -Wuninitialized + instead of -Wextra. + +2008-08-08 Volker Reichelt + + PR c++/35985 + * decl.c (xref_basetypes): Check base for MAYBE_CLASS_TYPE_P, + and make sure it is not a union. + +2008-08-07 H.J. Lu + + * semantics.c (finish_decltype_type): Initialize type. + +2008-08-07 Douglas Gregor + + * semantics.c (finish_decltype_type): Handle calls to function + pointers and references to functions properly. + +2008-08-06 Douglas Gregor + + PR c++/36460 + * parser.c (cp_parser_template_argument): Don't assume that '>>' + following a type-id is an error when in C++0x mode. + +2008-08-06 Manuel Lopez-Ibanez + + PR 26785 + * decl.c (grokdeclarator): Use explicit location with permerror_at. + +2008-08-06 Manuel Lopez-Ibanez + + PR 8715 + * typeck.c (cp_build_binary_op): Move code to c-common.c. + +2008-08-05 Jason Merrill + + PR c++/37016 + * decl.c (build_ptrmemfunc_type): Don't require structural + comparison of PMF types. + * tree.c (cp_build_qualified_type_real): Don't clear + a valid TYPE_PTRMEMFUNC_TYPE. + * typeck.c (cp_build_unary_op): Still do build_ptrmemfunc in + templates. + +2008-08-04 Jason Merrill + + PR c++/36963 + * typeck2.c (check_narrowing): Allow narrowing conversion + from an explicit floating-point constant. + + PR c++/37006 + * pt.c (tsubst_decl): Leave DECL_INITIAL set on deleted + instantiations. + +2008-08-04 Simon Baldwin + + PR c++/36999 + * parser.c (cp_parser_elaborated_type_specifier): Warn only when + the declaration's id is followed by a semicolon. + +2008-07-31 Jakub Jelinek + + PR c++/36405 + * rtti.c (get_tinfo_decl_dynamic, get_typeid): Call + complete_type_or_else even for UNKNOWN_TYPE to get diagnostics. + +2008-07-31 Jason Merrill + + PR c++/36633 + * init.c (build_new_1): Don't convert pointer to the data type + until we're actually going to treat it as that type. + + PR c++/11309 + * tree.c (build_aggr_init_expr): Split out... + (build_cplus_new): ...from here. + (stabilize_init): Don't mess with AGGR_INIT_EXPR either. + * init.c (build_new_1): new T() means value-initialization, + not default-initialization. + (build_vec_init): Likewise. + (build_value_init_1): Use build_aggr_init_expr. + +2008-07-30 Dodji Seketeli + + PR c++/36767 + * decl2.c (fix_temporary_vars_context_r): New function. + (one_static_initialization_or_destruction): Make sure temporary + variables part of the initialiser have their DECL_CONTEXT() + properly set. + +2008-07-30 Manuel Lopez-Ibanez + + PR 34389 + * typeck.c (build_binary_op): Encapsulate code into + shorten_binary_op. + +2008-07-29 Jakub Jelinek + + PR c++/36852 + * tree.c (cplus_array_hash, build_cplus_array_type_1): Hash on + TYPE_UID instead of pointers. + +2008-07-29 Jan Hubicka + + * optimize.c (maybe_clone_body): Remove DECL_INLINE. + * decl.c (duplicate_decls): Likewise. + (grokfndecl): Likewise. + (start_method): Likewise. + * method.c (make_thunk, make_alias_for, implicitly_declare_fn): + Likewise. + * pt.c (register_specialization, regenerate_decl_from_template): + Likewise. + * decl2.c (grokfield): Likewise. + +2008-07-29 Manuel Lopez-Ibanez + + PR 34985 + * decl.c (duplicate_decls): Merge USED flags. + +2008-07-27 Jason Merrill + + PR c++/36943 + * decl.c (reshape_init_r): Allow C++0x initializer lists. + +2008-07-28 Richard Guenther + + Merge from gimple-tuples-branch. + + 2008-07-22 Aldy Hernandez + + * cp-gimplify.c (gimplify_if_stmt): Set location on newly created + COND_EXPR. + + 2008-07-18 Jakub Jelinek + + * decl.c (finish_function): Call gimple_body after cp_genericize. + + 2008-07-18 Aldy Hernandez + + * optimize.c: Include gimple.h instead of tree-gimple.h. + * Make-lang.in (cp-gimplify.o): Depend on tree-iterator.h. + * cp-gimplify.c: Rename tree-gimple.h to gimple.h. Include + tree-iterator.h. + + 2008-07-16 Jakub Jelinek + + * optimize.c (maybe_clone_body): Clear DECL_SAVED_TREE for the clone. + + 2008-07-14 Jakub Jelinek + + * cp-gimplify.c (cp_gimplify_expr): Update comment. + + 2008-07-14 Aldy Hernandez + + * cp-tree.h (union lang_tree_node): Rename GENERIC_NEXT to + TREE_CHAIN. + * cp-gimplify.c (cxx_omp_clause_apply_fn): Rename + GIMPLE_MODIFY_STMT to MODIFY_EXPR. + (cxx_omp_clause_copy_ctor): Same. + (cxx_omp_clause_assign_op): Same. + + 2008-05-28 Jakub Jelinek + + * cp-gimplify.c (cp_gimplify_omp_for): Add pre_p argument. Tuplify. + (cp_gimplify_expr): Adjust caller. + + 2008-05-11 Doug Kwan + + * init.c (build_vec_delete): Add type conversion for argument + 0 of POINTER_PLUS_EXPR. + + 2008-04-29 Doug Kwan + + * decl2 (File): Include "gimple.h" + (cp_write_global_declarations): Use gimple_body instead of + DECL_SAVED_TREE. + * Make-lang.in (cp/decl2.o): Add $(GIMPLE_H) + + 2008-04-10 Diego Novillo + + http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00913.html + + * optimize.c (maybe_clone_body): Re-enable call to + clone_body. + * cp-gimplify.c (cp_gimplify_omp_for): Mark disabled + code with call to gimple_unreachable. + (cp_genericize): Fix handling of clone bodies. + + 2008-04-04 Diego Novillo + + http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00413.html + + * optimize.c (maybe_clone_body): Re-enable. + + 2008-02-19 Diego Novillo + Oleg Ryjkov + + http://gcc.gnu.org/ml/gcc-patches/2008-02/msg00804.html + + * cp-gimplify.c (gimplify_for_stmt): Change gimple_seq + argument to gimple_seq *. Update all users. + (gimplify_must_not_throw_expr): Likewise. + + 2008-02-04 Oleg Ryjkov + + * except.c: Include gimple.h + (cp_protect_cleanup_actions): Convert to tuples. + * Make-lang.in (cp/except.o): Add dependency on gimple.h + + 2007-11-10 Aldy Hernandez + + * cp-gimplify.c (gimplify_cp_loop): Call tree_annotate_all_with_locus + instead of annotating each block manually. + + 2007-10-30 Aldy Hernandez + + * cp-gimplify.c (gimplify_cp_loop): Tuplify. + (gimplify_for_stmt): Same. + (gimplify_switch_stmt): Same. + (cp_gimplify_expr): [FOR_STMT]: Do not call gimplify_for_stmt. Return + GS_OK. + [WHILE_STMT]: Return GS_OK. + [SWITCH_STMT]: Same. + [CONTINUE_STMT]: Same. + [BREAK_STMT]: Same. + (cp_genericize): Set gimple_body() of cloned functions when needed. + + 2007-10-29 Aldy Hernandez + + * cp-gimplify.c: Move build_gimple_eh_filter_tree here. + (cp_gimplify_init_expr): Convert to tuples. + (gimplify_must_not_throw_expr): Make function return a + gimplify_status and convert to tuples. + + 2007-10-18 Aldy Hernandez + + * cp-gimplify.c (genericize_try_block): Enable and do not call + gimplify_stmt. + (genericize_catch_block): Same. + (genericize_eh_spec_block): Same. + Rename gimple_build_eh_filter_tree to build_gimple_eh_filter_tree. + (cp_gimplify_expr): Enable TRY_BLOCK, HANDLER, and EH_SPEC_BLOCK. + + 2007-10-16 Aldy Hernandez + + * optimize.c (maybe_clone_body): Comment out call to clone_body. + * decl.c (finish_function): Use gimple_body instead of + DECL_SAVED_TREE. + * cp-tree.h (cp_gimplify_expr): Last 2 arguments are sequences. + * cp-gimplify.c (genericize_try_block): Comment out. + (genericize_catch_block): Same. + (genericize_eh_spec_block): Same. + (gimplify_cp_loop): Comment out calls to gimplify_stmt. + (gimplify_for_stmt): Comment out. + (gimplify_switch_stmt): Comment out call to gimplify_stmt. + (cp_gimplify_omp_for): Same. + (gimplify_must_not_throw_expr): Argument pre_p is a sequence. + Comment out call to gimplify_stmt and append_to_statement_list. + Rename gimple_build_eh_filter_tree to build_gimple_eh_filter_tree. + (cp_gimplify_init_expr): Arguments pre_p and post_p are sequences. + (cp_gimplify_expr): Same. + Comment out calls to genericize_*_block. Comment out call to + gimplify_for_stmt. + +2008-07-27 H.J. Lu + + PR c++/36944 + * class.c (type_has_user_provided_default_constructor): Handle + default parameters. + +2008-07-27 Paolo Carlini + + * decl.c (push_library_fn): Add a parameter for the exceptions that + the function may throw. + (push_void_library_fn, push_throw_library_fn, expand_static_init): + Adjust. + (build_library_fn): Change to static. + * cp-tree.h: Adjust declarations. + * except.c (declare_nothrow_library_fn): New. + (do_get_exception_ptr, do_begin_catch, do_free_exception, + do_allocate_exception): Use the latter, adjust the declarations + (ie, add empty exception-specification), consistently with the + actual implementation in libsupc++. + +2008-07-25 Jan Hubicka + + * typeck.c (inline_conversion): Remove. + (cp_build_function_call): Do not use inline_conversion. + * decl.c (duplicate_decls): Do not insist on inline being declared + early. + (start_cleanup_fn): Do not assume that INLINE flags prevent function + from being output. We now remove static functions always. + (finish_function): Do return warning on all static functions. + * call.c (build_over_call): Do not use inline_conversion. + * cp-tree.h (possibly_inlined_p): Declare. + (inline_conversion): Remove. + * pt.c (instantiate_decl): Use possibly_inlined_p predicate. + * decl2.c (cp_write_global_declarations): Likewise. + (mark_used): Likewise. + (possibly_inlined_p): New functions. + +2008-07-25 Jason Merrill + + * class.c (type_has_user_provided_default_constructor): Handle + templates. + +2008-07-23 Jan Hubicka + + * decl.c (duplicate_decls): Update comment and unit-at-a-time. + (grogfndecl): Drop flag_inline_trees code. + * pt.c (instantiate_decl): Drop flag_iline_trees code. + * lex.c (cxx_init): Do not set unit-at-a-time. + +2008-07-23 Jason Merrill + + * mangle.c (write_unqualified_name): Avoid infinite recursion when + trying to mangle a decl with no name. + + Implement defaulted/deleted functions as per N2346 + * cp-tree.h (struct lang_decl_flags): Add defaulted_p bitfield. + (DECL_DELETED_FN): New macro. + (DECL_DEFAULTED_FN): New macro. + * class.c (user_provided_p): New fn. + (defaultable_fn_p): New fn. + (type_has_user_provided_constructor): New fn. + (type_has_user_provided_default_constructor): New fn. + (check_methods): A defaulted fn is still trivial. + (check_bases_and_members): Likewise. + * decl.c (grok_special_member_properties): Likewise. + (duplicate_decls): Complain about redeclaring a function as deleted. + (start_decl): initialized==2 means deleted. + (cp_finish_decl): Handle deleted/defaulted semantics. + * decl2.c (grokfield): Likewise. + (mark_used): Check DECL_DEFAULTED_FN instead of DECL_ARTIFICIAL. + Complain about using a deleted fn. + * init.c (build_value_init_1): Use type_has_user_provided_constructor. + (perform_member_init): Check for a user-provided default constructor + even if TYPE_NEEDS_CONSTRUCTING. + (build_new_1): Likewise. + * call.c (build_over_call): Don't call mark_used twice. + * method.c (implicitly_declare_fn): Set DECL_DEFAULTED_FN. + * search.c (check_final_overrider): Check for deleted mismatch. + * parser.c (cp_parser_init_declarator): Tell start_decl about =delete. + (cp_parser_pure_specifier): Handle =default and =delete. + + * error.c (maybe_warn_cpp0x): Suggest -std=gnu++0x as well. + +2008-07-23 Manuel Lopez-Ibanez + + PR 35058 + * typeck.c: All calls to pedwarn changed. + * decl.c: All calls to pedwarn changed. + * call.c: All calls to pedwarn changed. + * error.c: All calls to pedwarn changed. + * typeck2.c: All calls to pedwarn changed. + * pt.c: All calls to pedwarn changed. + * name-lookup.c: All calls to pedwarn changed. + * parser.c: All calls to pedwarn changed. + +2008-07-21 Ralf Wildenhues + + * call.c: Fix comment typos. + * class.c: Likewise. + * cp-tree.h: Likewise. + * cxx-pretty-print.c: Likewise. + * decl.c: Likewise. + * init.c: Likewise. + * name-lookup.c: Likewise. + * operators.def: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * tree.c: Likewise. + * typeck.c: Likewise. + +2008-07-21 Paolo Carlini + + PR c++/36871 + PR c++/36872 + * semantics.c (classtype_has_nothrow_assign_or_copy_p): Only check + copy constructors and copy assignment operators proper. + +2008-07-21 Rafael Ávila de EspĂ­ndola + + * parser.c (cp_token): Remove in_system_header. + (eof_token): Remove in_system_header. + (cp_lexer_get_preprocessor_token): Don't set in_system_header. + (cp_lexer_set_source_position_from_token): Don't set in_system_header. + (cp_parser_member_declaration): Use in_system_header_at. + * pt.c (lookup_template_class): Don't set DECL_IN_SYSTEM_HEADER. + (pop_tinst_level): Don't set in_system_header. + (instantiate_class_template): Don't set in_system_header. + (instantiate_decl): Don't set in_system_header. + (instantiate_pending_templates): Don't set in_system_header. + +2008-07-21 Paolo Carlini + + PR c++/36870 + * semantics.c (classtype_has_nothrow_assign_or_copy_p): Use + TYPE_NOTHROW_P, not TREE_NOTHROW. + (trait_expr_value): Likewise. + +2008-07-18 Dodji Seketeli + + PR c++/36407 + * call.c (convert_like_real): Don't take the error code path + when a rvalue or base conversion has the bad_p field set. + +2008-07-18 Kris Van Hees + + * rtti.c (emit_support_tinfos): Add char16_type_node and + char32_type_node. + * typeck2.c (digest_init): Support char16_t and char32_t. + +2008-07-18 Kavih R. Ghazi + + * cvt.c (convert_to_void): Avoid C++ keywords. + * decl.c (walk_namespaces_r, wrapup_globals_for_namespace): + Likewise. + * friend.c (is_friend): Likewise. + * init.c (perform_member_init): Likewise. + * mangle.c (write_template_prefix, write_template_template_param): + Likewise. + * name-lookup.c (do_namespace_alias, do_using_directive, + parse_using_directive, ambiguous_decl, arg_assoc): Likewise. + * parser.c (cp_parser_template_id, cp_parser_namespace_definition, + cp_parser_objc_typename, cp_parser_objc_method_keyword_params): + Likewise. + * pt.c (is_specialization_of_friend, lookup_template_class, + push_tinst_level, instantiate_class_template, + tsubst_copy_and_build): Likewise. + * tree.c (add_stmt_to_compound): Likewise. + * typeck.c (finish_class_member_access_expr): Likewise. + +2008-07-17 Julian Brown + Mark Mitchell + + * decl2.c (determine_visibility): Allow target to override + visibility of class data. + +2008-07-17 Paolo Carlini + + PR c++/36855 + * semantics.c (trait_expr_value): Update __has_trivial_destructor + semantics to the current WP (N2691). + +2008-07-16 Dodji Seketeli + + PR c++/13699 + * name-lookup.c (lookup_extern_c_fun_binding_in_all_ns): New function. + (pushdecl_maybe_friend): Check if a redeclaration of extern C function + complies with exception specification constraints. + +2008-07-14 Jason Merrill + + * lex.c (init_reswords): Always set D_OBJC. + +2008-07-11 Tom Tromey + Ian Lance Taylor + + * lex.c (struct resword, reswords): Don't define. + (D_EXT, D_ASM, D_OBJC, D_CXX0X): Don't define. + (init_reswords): Clarify mask code. Use c_common_reswords rather + than reswords. + +2008-07-11 Dodji Seketeli + + PR c++/13101 + * decl.c (grokdeclarator): Warn about initializing variables + of storage class 'extern' only after the type of the declarator + has been properly computed. + +2008-07-11 Dodji Seketeli + + PR c++/31754 + * cp-tree.h (struct cp_decl_specifier_seq): Add a location field. It + carries the location of the primary type. + * parser.c (cp_parser_check_type_definition): Update documentation. + (cp_parser_check_for_definition_in_return_type, + cp_parser_check_for_invalid_template_id, + cp_parser_set_decl_spec_type, + cp_parser_check_for_definition_in_return_type, + cp_parser_diagnose_invalid_type_name, + cp_parser_new_expression, cp_parser_explicit_instantiation, + cp_parser_type_specifier, cp_parser_simple_type_specifier, + cp_parser_omp_for_loop, cp_parser_pragma): Use location in error + messages. + +2008-07-11 Dodji Seketeli + + PR c++/31754 + * pt.c, semantic.c: + * semantic.c (qualified_name_lookup_error, finish_id_expression): + Add a location_t parameter so that + error message can have a more accurate location. + * cp-tree.h: Updated prototype + * pt.c (tsubst_qualified_id): Use location in error messages. + * parser.c (cp_parser_postfix_expression, + cp_parser_objc_statement, cp_parser_trait_expr, + cp_parser_token_is_class_key, + cp_parser_uncommitted_to_tentative_parse_p, + cp_parser_check_for_invalid_template_id, cp_parser_is_string_literal, + cp_parser_error, cp_parser_name_lookup_error, + cp_parser_simulate_error, cp_parser_check_decl_spec, + cp_parser_check_decl_spec, cp_parser_non_integral_constant_expression, + cp_parser_diagnose_invalid_type_name, + cp_parser_parse_and_diagnose_invalid_type_name, + cp_parser_require_pragma_eol, cp_parser_make_typename_type, + cp_parser_string_literal, cp_parser_primary_expression, + cp_parser_primary_expression, cp_parser_unqualified_id, + cp_parser_nested_name_specifier_opt, cp_parser_postfix_expression, + cp_parser_postfix_dot_deref_expression, cp_parser_new_expression, + cp_parser_direct_new_declarator, cp_parser_builtin_offsetof, + cp_parser_label_for_labeled_statement, cp_parser_statement_seq_opt, + cp_parser_jump_statement, cp_parser_block_declaration, + cp_parser_simple_declaration, cp_parser_decl_specifier_seq, + cp_parser_function_specifier_opt, cp_parser_decltype, + cp_parser_mem_initializer_list, cp_parser_mem_initializer, + cp_parser_mem_initializer_id, cp_parser_template_parameter, + cp_parser_type_parameter, cp_parser_template_id, + cp_parser_template_name, cp_parser_template_argument): Likewise. + +2008-07-09 Paolo Carlini + + PR c++/36760 + * pt.c (tsubst_function_type): Remove warning for type qualifiers + on function return type. + +2008-07-09 Paolo Carlini + + PR c++/36760 + * pt.c (tsubst_function_type): Don't warn for type qualifiers + on function return type in case of system header. + +2008-07-09 Raksit Ashok + + * parser.c (cp_parser_postfix_expression): New warning based on flag + warn_disallowed_functions. + +2008-07-08 Simon Martin + + PR c++/34963 + * decl.c (grokdeclarator): Reset storage_class and staticp for friend + functions declared with a storage class qualifier. + +2008-07-03 Richard Guenther + + PR c++/36128 + * typeck.c (cp_build_function_call): Move code to verify + builtin function arguments ... + * call.c (build_cxx_call): ... here. + +2008-07-02 Jason Merrill + + * Make-lang.in (cp/typeck2.o): Add $(REAL_H) dependency. + + Implement WG21 N2672, Initializer List proposed wording + * cp-tree.h (enum cp_tree_index): Add CPTI_INIT_LIST_TYPE. + (struct lang_type_class): Add has_list_ctor bitfield. + (TYPE_HAS_LIST_CTOR): New macro. + (BRACE_ENCLOSED_INITIALIZER_P): Expect init_list_type_node. + (CONSTRUCTOR_IS_DIRECT_INIT): New macro. + (LOOKUP_NO_NARROWING): New macro. + (LOOKUP_NO_COPY_CTOR_CONVERSION): New macro. + * parser.c (cp_parse_braced_list): Split out from... + (cp_parser_initializer_clause): ...here. + (cp_parser_postfix_expression): Build up CONSTRUCTOR for compound + literal here. + (cp_lexer_next_token_is_not_keyword): New fn. + (cp_parser_parenthesized_expression_list): Handle { }. + (cp_parser_new_expression, cp_parser_new_initializer): Likewise. + (cp_parser_assignment_expression, cp_parser_condition): Likewise. + (cp_parser_jump_statement, cp_parser_simple_declaration): Likewise. + (cp_parser_mem_initializer, cp_parser_init_declarator): Likewise. + (cp_parser_initializer, cp_parser_functional_cast): Likewise. + (cp_parser_omp_for_loop, cp_parser_cache_group): Likewise. + (cp_parser_save_member_function_body): Likewise. + * call.c (conversion_kind): Add ck_list, ck_aggr. + (struct conversion): Add check_narrowing bitfield, conversion list. + (build_list_conv): New fn. + (build_aggr_conv): New fn. + (implicit_conversion): Call them. + (standard_conversion): Set check_narrowing if appropriate. + (add_function_candidate): Handle LOOKUP_NO_COPY_CTOR_CONVERSION. + (build_user_type_conversion_1): When converting from an init list, + we allow additional conversions except when calling a copy ctor. + (convert_like_real): Calling an explicit ctor for an init list is + ill-formed. Handle ck_list and ck_addr. Check narrowing. + (build_new_method_call): If CONSTRUCTOR_IS_DIRECT_INIT is set and + class doesn't have a list ctor, break the {} into a TREE_LIST. + (compare_ics): ck_list is better than other UDCs. + (set_up_extended_ref_temp): Split out from initialize_reference. + (is_std_init_list): New fn. + (is_list_ctor): New fn. + * decl.c (cxx_init_decl_processing): Create init_list_type_node. + (reshape_init_array_1): Pass it to build_constructor. + (reshape_init_class): Ditto. + (initialize_artificial_var): Pass the appropriate type. + (build_aggr_init_full_exprs): Split out from... + (check_initializer): ...here. Handle new semantics. + (build_init_list_var_init): New subroutine of check_initializer. + (grokdeclarator): Converting constructors can have more than one parm. + (grok_special_member_properties): Set TYPE_HAS_LIST_CTOR. + * init.c (expand_default_init): Only do digest_init for aggregates. + * rtti.c (tinfo_base_init): Pass init_list_type_node to + build_constructor_from_list. + (generic_initializer, ptr_initializer): Ditto. + (ptm_initializer, class_initializer): Ditto. + (get_pseudo_ti_init): Ditto. + * error.c (dump_type): Handle init_list_type_node. + (maybe_warn_cpp0x): New fn. + (maybe_varn_variadic_templates): Call it. + * cvt.c (ocp_convert): Handle conversion from { }. + * tree.c (build_array_of_n_type): New fn. + * typeck2.c (store_init_value): Use init_list_type_node. + (digest_init): Likewise. + (check_narrowing): New fn. + * semantics.c: (finish_compound_literal): Take CONSTRUCTOR instead + of vector of constructor elts. Handle non-aggregate types. Make + constant literals static. + * pt.c: (tsubst_copy_and_build): Adjust. + (unify): Handle { }. + * name-lookup.c (arg_assoc_type): Handle init_list_type_node. + +2008-07-01 Daniel Jacobowitz + + * typeck.c (comp_ptr_ttypes_real): Use vector_targets_convertible_p. + (comp_ptr_ttypes_const): Likewise. + +2008-07-01 Andrew Haley + + * decl.c (finish_constructor_body): Don't set the return value of + the constructor if the constructor is that of a Java type. + +2008-06-30 Jakub Jelinek + + PR c++/36662 + * decl2.c (is_late_template_attribute): If the first attribute + argument is IDENTIFIER_NODE, don't consider it when checking + if arguments are value or type dependent. + +2008-06-29 Paolo Carlini + + PR c++/36655 + * pt.c (do_type_instantiation): In c++0x mode do not warn for + extern template. + +2008-06-29 Kaveh R. Ghazi + + * Make-lang.in (cp-warn): Delete $(CXX_COMPAT_WARN). + +2008-06-28 Jakub Jelinek + + PR c++/36364 + * repo.c (repo_emit_p): Put const static data members initialized + by const expr into *.rpo file, just return 2 if IDENTIFIER_REPO_CHOSEN + for it is 0. + +2008-06-27 Paolo Carlini + + PR c++/36655 + * pt.c (do_decl_instantiation): In c++0x mode do not warn for + extern template. + +2008-06-24 Jonathan Wakely + + PR c++/23194 + * typeck.c (cp_build_function_call): Show example syntax in + diagnostic. + +2008-06-21 Jonathan Wakely + + * typeck.c (composite_pointer_type_r, cxx_sizeof_expr, + cxx_alignof_expr, check_template_keyword, cp_build_binary_op, + pointer_diff, cp_build_unary_op, build_x_compound_expr_from_list, + build_reinterpret_cast_1, cp_build_c_cast, check_return_expr): Change + pedwarn to permerror. + * init.c (perform_member_init, build_new_1, build_new): Likewise. + * decl.c (warn_extern_redeclared_static, duplicate_decls, + * identify_goto, check_previous_goto_1, check_goto, define_label, + check_tag_decl, start_decl, check_class_member_definition_namespace, + grokfndecl, grokdeclarator): Likewise. + * except.c (check_handlers): Likewise. + * typeck2.c (digest_init): Likewise. + * pt.c (check_specialization_namespace, + check_explicit_instantiation_namespace, + maybe_process_partial_specialization, check_explicit_specialization, + convert_template_argument, do_decl_instantiation, + do_type_instantiation, instantiate_decl): Likewise. + * semantics.c (finish_template_type_parm): Likewise. + * name-lookup.c (pushdecl_maybe_friend, + check_for_out_of_scope_variable): Likewise. + * decl2.c (finish_static_data_member_decl, build_anon_union_vars, + coerce_new_type): Likewise. + * parser.c (cp_parser_nested_name_specifier_opt, + cp_parser_mem_initializer, cp_parser_elaborated_type_specifier, + cp_parser_class_head, cp_parser_check_class_key): Likewise. + (cp_parser_parameter_declaration): Check flag_permissive instead of + flag_pedantic_errors. + * call.c (joust): Change pedwarn to warning. + * friend.c (make_friend_class): Likewise. + +2008-06-16 Jan Hubicka + + * method.c: Include cgraph.h. + (use_thunk): Use cgraph_add_new_function instead of calling backend + directly. + +2008-06-15 Ralf Wildenhues + + * parser.c: Fix comment typo. + +2008-06-14 Simon Martin + + PR c++/35320 + * decl2.c (grokbitfield): Receive the list of attributes, pass it to + grokdeclarator and apply it to the created declaration. + * cp-tree.h (grokbitfield): Update prototype. + * parser.c (cp_parser_member_declaration): Don't apply the attributes + since they are now applied in grokbitfield. Adjusted the call to + grokbitfield. + (cp_parser_objc_class_ivars): Likewise. + +2008-06-14 Simon Martin + + PR c++/35317 + * class.c (type_requires_array_cookie): Do not consider delete[] + operators with an ellipsis as second argument. + +2008-06-09 Jakub Jelinek + + PR c++/36408 + * semantics.c (stmt_expr_value_expr): Don't crash on empty + STATEMENT_LIST. + +2008-06-08 Paolo Carlini + + PR c++/35242 + * pt.c (maybe_process_partial_specialization): Check the tree + returned by push_template_decl for error_mark_node. + * parser.c (cp_parser_class_head): Likewise, check the tree + returned by the latter. + +2008-06-07 Paolo Carlini + + PR c++/35327 + * decl.c (grokdeclarator): In case of wrong return type return + immediately error_mark_node. + +2008-06-06 Jakub Jelinek + + * cp-tree.h (cxx_omp_finish_clause, cxx_omp_create_clause_info, + dependent_omp_for_p, begin_omp_task, finish_omp_task, + finish_omp_taskwait): New prototypes. + (cxx_omp_clause_default_ctor): Add outer argument. + (finish_omp_for): Add new clauses argument. + * cp-gimplify.c (cxx_omp_finish_clause): New function. + (cxx_omp_predetermined_sharing): Moved from semantics.c, rewritten. + (cxx_omp_clause_default_ctor): Add outer argument. + (cp_genericize_r): Walk OMP_CLAUSE_LASTPRIVATE_STMT. + * cp-objcp-common.h (LANG_HOOKS_OMP_FINISH_CLAUSE): Define. + * parser.c (cp_parser_omp_for_loop): Parse collapsed for loops. + Add par_clauses argument. If decl is present in parallel's + lastprivate clause, change that clause to shared and add + a lastprivate clause for decl to OMP_FOR_CLAUSES. + Fix wording of error messages. Adjust finish_omp_for caller. + Add clauses argument. Parse loops with random access iterators. + (cp_parser_omp_clause_collapse, cp_parser_omp_clause_untied): New + functions. + (cp_parser_omp_for, cp_parser_omp_parallel): Adjust + cp_parser_omp_for_loop callers. + (cp_parser_omp_for_cond, cp_parser_omp_for_incr): New helper + functions. + (cp_parser_omp_clause_name): Handle collapse and untied + clauses. + (cp_parser_omp_clause_schedule): Handle auto schedule. + (cp_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_COLLAPSE + and PRAGMA_OMP_CLAUSE_UNTIED. + (OMP_FOR_CLAUSE_MASK): Add PRAGMA_OMP_CLAUSE_COLLAPSE. + (OMP_TASK_CLAUSE_MASK): Define. + (cp_parser_omp_task, cp_parser_omp_taskwait): New functions. + (cp_parser_omp_construct): Handle PRAGMA_OMP_TASK. + (cp_parser_pragma): Handle PRAGMA_OMP_TASK and + PRAGMA_OMP_TASKWAIT. + * pt.c (tsubst_omp_clauses): Handle OMP_CLAUSE_COLLAPSE and + OMP_CLAUSE_UNTIED. Handle OMP_CLAUSE_LASTPRIVATE_STMT. + (tsubst_omp_for_iterator): New function. + (dependent_omp_for_p): New function. + (tsubst_expr) : Use it. Handle collapsed OMP_FOR + loops. Adjust finish_omp_for caller. Handle loops with random + access iterators. Adjust for OMP_FOR_{INIT,COND,INCR} changes. + (tsubst_expr): Handle OMP_TASK. + * semantics.c (cxx_omp_create_clause_info): New function. + (finish_omp_clauses): Call it. Handle OMP_CLAUSE_UNTIED and + OMP_CLAUSE_COLLAPSE. + (cxx_omp_predetermined_sharing): Removed. + * semantics.c (finish_omp_for): Allow pointer iterators. Use + handle_omp_for_class_iterator and dependent_omp_for_p. Handle + collapsed for loops. Adjust c_finish_omp_for caller. Add new + clauses argument. Fix check for type dependent cond or incr. + Set OMP_FOR_CLAUSES to clauses. Use cp_convert instead of + fold_convert to convert incr amount to difference_type. Only + fold if not in template. If decl is mentioned in lastprivate + clause, set OMP_CLAUSE_LASTPRIVATE_STMT. Handle loops with random + access iterators. Adjust for OMP_FOR_{INIT,COND,INCR} + changes. + (finish_omp_threadprivate): Allow static class members of the + current class. + (handle_omp_for_class_iterator, begin_omp_task, finish_omp_task, + finish_omp_taskwait): New functions. + + * parser.c (cp_parser_binary_expression): Add prec argument. + (cp_parser_assignment_expression): Adjust caller. + * cp-tree.h (outer_curly_brace_block): New prototype. + * decl.c (outer_curly_brace_block): No longer static. + +2008-06-02 Paolo Carlini + + PR c++/36404 + * pt.c (push_template_decl_real): Consistently return error_mark_node + on error. + +2008-06-02 Tomas Bily + + * typeck.c (is_bitfield_expr_with_lowered_type): Use CASE_CONVERT. + (cp_build_unary_op): Likewise. + (cp_build_indirect_ref): Use CONVERT_EXPR_P. + (maybe_warn_about_returning_address_of_local): Likewise. + +2008-05-29 Paolo Carlini + + PR c++/35243 + * pt.c (tsubst_initializer_list): Consistently check the tree + returned by tsubst_pack_expansion for error_mark_node. + +2008-05-27 Michael Matz + + PR c++/27975 + * call.c (build_new_op): Make warning conditional on + OPT_Wenum_compare. + +2008-05-27 Alexandre Oliva + + PR c++/35909 + * call.c (convert_like_real): Convert bitfield to desired type + before creating temporary. + +2008-05-26 Daniel Franke + + * Makefile.in: Adjusted dependencies on c-incpath.o. + +2008-05-23 Jakub Jelinek + + PR c++/36237 + * cp-gimplify.c (cxx_omp_clause_apply_fn): Call + fold_build_cleanup_point_expr on build_call_a results. + + PR c++/36308 + * semantics.c (omp_clause_info_fndecl): New function. + (finish_omp_clauses): Use it. + +2008-05-21 Jakub Jelinek + + PR c++/36023 + * cp-tree.h (check_array_initializer): New prototype. + * decl.c (check_array_initializer): New function. + (check_initializer): Call it. + * semantics.c (finish_compound_literal): Call it for ARRAY_TYPEs. + +2008-05-21 Tom Tromey + + * mangle.c (save_partially_mangled_name): Remove. + (restore_partially_mangled_name): Likewise. + (write_encoding): Update. + (write_unqualified_name): Likewise. + (start_mangling): Always use name_obstack. Remove 'ident_p' + argument. + (get_identifier_nocopy): Remove. + (finish_mangling_internal): Rename from finish_mangling. + (finish_mangling): New function. + (finish_mangling_get_identifier): Likewise. + (partially_mangled_name, partially_mangled_name_len): Remove. + (mangle_decl_string): Change return type. Update. + (mangle_decl, mangle_type_string, mangle_special_for_type, + mangle_ctor_vtbl_for_type, mangle_thunk, mangle_guard_variable, + mangle_ref_init_variable): Update. + +2008-05-12 Paolo Carlini + + PR c++/35331 + * semantics.c (begin_class_definition): Extend checks on the first + argument. + +2008-05-12 Tomas Bily + + * typeck2.c (digest_init): Use CONVERT_EXPR_P. + * call.c (build_over_call): Likewise. + * error.c (dump_expr): Use CASE_CONVERT. + * class.c (fixed_type_or_null): Likewise. + +2008-05-11 Volker Reichelt + + * parser.c (cp_parser_omp_clause_reduction): Add missing "expected" + in error message. + (cp_parser_omp_clause_schedule): Remove superfluous "expected" + in error message. + +2008-05-07 Kenneth Zadeck + + * decl.c (duplicate_decls): Merge in DECL_PURE_P, TREE_READONLY, + DECL_LOOPING_CONST_OR_PURE_P attributes. + * rtti.c (build_dynamic_cast_1): Rename DECL_IS_PURE to + DECL_PURE_P. + +2008-05-02 Simon Baldwin + + PR bootstrap/36108 + * typeck.c (build_array_ref): Remove warn_array_subscript_range. + +2008-05-01 Simon Baldwin + + * typeck.c (build_array_ref): Call warn_array_subscript_range. + +2008-04-30 Jakub Jelinek + + PR c++/35986 + * pt.c (more_specialized_fn): Stop the loop even if there are no + arguments before ellipsis. + +2008-04-29 Jakub Jelinek + + PR c++/35650 + * parser.c (cp_parser_lookup_name): Look through single function + OVERLOAD. + + PR c++/35987 + * typeck.c (cp_build_modify_expr) : Don't build + COMPOUND_EXPR if the second argument would be error_mark_node. + +2008-04-28 Jason Merrill + Liu Guanwei + + PR c++/57 + * parser.c (cp_parser_parameter_declaration): Handle < ambiguity + in default arguments. + +2008-04-25 Jan Hubicka + + * typeck.c (check_return_expr): Update. + * decl.c (start_preparsed_function): Update. + * method.c (use_thunk): Update. + +2008-04-24 Jakub Jelinek + + PR c++/35758 + * cp-tree.h (cp_reconstruct_complex_type): New prototype. + * cp-objcp-common.h (LANG_HOOKS_RECONSTRUCT_COMPLEX_TYPE): Define. + * decl2.c (is_late_template_attribute): Only make vector_size + late tmpl attribute if argument is type or value dependent. + (cp_reconstruct_complex_type): New function. + +2008-04-24 Richard Guenther + + * typeck.c (cp_build_function_call): Call + check_builtin_function_arguments. + +2008-04-23 Paolo Bonzini + + * typeck.c (get_member_function_from_ptrfunc): Don't set TREE_INVARIANT. + (build_ptrmemfunc1): Don't set TREE_INVARIANT. + * init.c (build_zero_init): Don't set TREE_INVARIANT. + * class.c (build_base_path): Don't set TREE_INVARIANT. + (build_vtbl_ref_1): Don't set TREE_INVARIANT. + (build_vtbl_initializer): Don't set TREE_INVARIANT. + * decl.c (build_enumerator): Don't set TREE_INVARIANT. + * rtti.c (tinfo_base_init): Don't set TREE_INVARIANT. + (generic_initializer): Don't set TREE_INVARIANT. + (ptr_initializer): Don't set TREE_INVARIANT. + (ptm_initializer): Don't set TREE_INVARIANT. + (class_initializer): Don't set TREE_INVARIANT. + * typeck2.c (process_init_constructor): Don't set TREE_INVARIANT. + * pt.c (push_inline_template_parms_recursive): Don't set TREE_INVARIANT. + (build_template_parm_index): Don't set TREE_INVARIANT. + (reduce_template_parm_level): Don't set TREE_INVARIANT. + (process_template_parm): Don't set TREE_INVARIANT. + +2008-04-22 Jason Merrill + + PR c++/35316 + * semantics.c (finish_decltype_type): Check DECL_BIT_FIELD_TYPE + to see if DECL_BIT_FIELD_TYPE should be used, not some other flag. + * typeck.c (is_bitfield_expr_with_lowered_type): Likewise. + +2008-04-22 Jakub Jelinek + + PR c++/35747 + * semantics.c (finish_stmt_expr): Call pop_stmt_list even if the stmt + expression is errorneous. + +2008-04-21 Jason Merrill + + PR c++/35325 + * tree.c (cp_tree_equal): Handle FIXED_CST. + + PR c++/35678 + * pt.c (template_template_parm_bindings_ok_p): Set + processing_template_decl while in this function. + +2008-04-18 Kris Van Hees + + * cvt.c (type_promotes_to): Support char16_t and char32_t. + * decl.c (grokdeclarator): Disallow signed/unsigned/short/long on + char16_t and char32_t. + * lex.c (reswords): Add char16_t and char32_t (for c++0x). + * mangle.c (write_builtin_type): Mangle char16_t/char32_t as vendor + extended builtin type "u8char{16,32}_t". + * parser.c (cp_lexer_next_token_is_decl_specifier_keyword): Support + RID_CHAR{16,32}. + (cp_lexer_print_token): Support CPP_STRING{16,32}. + (cp_parser_is_string_literal): Idem. + (cp_parser_string_literal): Idem. + (cp_parser_primary_expression): Support CPP_CHAR{16,32} and + CPP_STRING{16,32}. + (cp_parser_simple_type_specifier): Support RID_CHAR{16,32}. + * tree.c (char_type_p): Support char16_t and char32_t as char types. + * typeck.c (string_conv_p): Support char16_t and char32_t. + +2008-04-17 Jason Merrill + + PR c++/35773 + * call.c (build_user_type_conversion_1): Represent second step of + copy-init with an rvalue conversion. + (convert_like_real) [ck_user]: Don't implicitly add it here. + +2008-04-15 Jakub Jelinek + + PR c/35751 + * decl.c (layout_var_decl): If extern or static var has variable + size, set TREE_TYPE (decl) to error_mark_node. + +2008-04-16 Danny Smith + + PR target/35921 + * optimize.c (maybe_clone_body): Copy DECL_DLLIMPORT_P flag + to clone. + +2008-04-09 Jason Merrill + + PR c++/35708 + * semantics.c (finish_compound_literal): Return a TARGET_EXPR, + not a pushed variable. + +2008-04-09 Volker Reichelt + + * call.c (build_op_delete_call): Fix quotation in warning message. + * decl.c (grokdeclarator): Quote keyword in error message. + * pt.c (check_for_bare_parameter_packs): Fix quotation in error + message. + + * parser.c (cp_parser_check_type_definition): Print error string + directly rather than using "%s". + (cp_parser_postfix_expression): Fix quotation. + (cp_parser_decltype): Likewise. + (cp_parser_sizeof_operand): Fix quotation. Simplify. + + * parser.c (cp_parser_non_integral_constant_expression): Build error + message with CONCAT rather than using "%s". + (cp_parser_primary_expression): Fix quotation. + (cp_parser_postfix_expression): Likewise. + (cp_parser_postfix_dot_deref_expression): Likewise. + (cp_parser_unary_expression): Likewise. + (cp_parser_new_expression): Likewise. + (cp_parser_delete_expression): Likewise. + + * parser.c (cp_parser_asm_specification_opt): Print CPP_CLOSE_PAREN + as `)', not as `('. Fix quotation. + (cp_parser_consume_semicolon_at_end_of_statement): Fix quotation. + (cp_parser_primary_expression): Likewise. + (cp_parser_nested_name_specifier_opt): Likewise. + (cp_parser_postfix_expression): Likewise. + (cp_parser_postfix_open_square_expression): Likewise. + (cp_parser_parenthesized_expression_list): Likewise. + (cp_parser_pseudo_destructor_name): Likewise. + (cp_parser_new_expression): Likewise. + (cp_parser_direct_new_declarator): Likewise. + (cp_parser_delete_expression): Likewise. + (cp_parser_cast_expression): Likewise. + (cp_parser_question_colon_clause): Likewise. + (cp_parser_builtin_offsetof): Likewise. + (cp_parser_trait_expr): Likewise. + (cp_parser_label_for_labeled_statement): Likewise. + (cp_parser_compound_statement): Likewise. + (cp_parser_selection_statement): Likewise. + (cp_parser_condition): Likewise. + (cp_parser_iteration_statement): Likewise. + (cp_parser_already_scoped_statement): Likewise. + (cp_parser_simple_declaration): Likewise. + (cp_parser_linkage_specification): Likewise. + (cp_parser_static_assert): Likewise. + (cp_parser_decltype): Likewise. + (cp_parser_conversion_function_id): Likewise. + (cp_parser_operator_function_id): Likewise. + (cp_parser_operator): Likewise. + (cp_parser_type_parameter): Likewise. + (cp_parser_template_id): Likewise. + (cp_parser_explicit_instantiation): Likewise. + (cp_parser_explicit_specialization): Likewise. + (cp_parser_enum_specifier): Likewise. + (cp_parser_namespace_definition): Likewise. + (cp_parser_namespace_alias_definition): Likewise. + (cp_parser_using_declaration): Likewise. + (cp_parser_using_directive): Likewise. + (cp_parser_asm_definition): Likewise. + (cp_parser_direct_declarator): Likewise. + (cp_parser_ptr_operator): Likewise. + (cp_parser_parameter_declaration_clause): Likewise. + (cp_parser_initializer_clause): Likewise. + (cp_parser_class_specifier): Likewise. + (cp_parser_member_specification_opt): Likewise. + (cp_parser_member_declaration): Likewise. + (cp_parser_pure_specifier): Likewise. + (cp_parser_constant_initializer): Likewise. + (cp_parser_base_clause): Likewise. + (cp_parser_exception_specification_opt): Likewise. + (cp_parser_try_block): Likewise. + (cp_parser_function_try_block): Likewise. + (cp_parser_handler): Likewise. + (cp_parser_throw_expression): Likewise. + (cp_parser_asm_operand_list): Likewise. + (cp_parser_attributes_opt): Likewise. + (cp_parser_label_declaration): Likewise. + (cp_parser_constructor_declarator_p): Likewise. + (cp_parser_template_declaration_after_export): Likewise. + (cp_parser_single_declaration): Likewise. + (cp_parser_objc_message_expression): Likewise. + (cp_parser_objc_message_args): Likewise. + (cp_parser_objc_encode_expression): Likewise. + (cp_parser_objc_defs_expression): Likewise. + (cp_parser_objc_protocol_expression): Likewise. + (cp_parser_objc_selector_expression): Likewise. + (cp_parser_objc_protocol_refs_opt): Likewise. + (cp_parser_objc_typename): Likewise. + (cp_parser_objc_method_keyword_params): Likewise. + (cp_parser_objc_superclass_or_category): Likewise. + (cp_parser_objc_try_catch_finally_statement): Likewise. + (cp_parser_objc_synchronized_statement): Likewise. + (cp_parser_objc_throw_statement): Likewise. + (cp_parser_omp_var_list_no_open): Likewise. + (cp_parser_omp_clause_default): Likewise. + (cp_parser_omp_clause_if): Likewise. + (cp_parser_omp_clause_num_threads): Likewise. + (cp_parser_omp_clause_reduction): Likewise. + (cp_parser_omp_clause_schedule): Likewise. + (cp_parser_omp_critical): Likewise. + (cp_parser_omp_for_loop): Likewise. + (cp_parser_omp_sections_scope): Likewise. + + * parser.c (cp_parser_template_parameter_list): Simplify. + +2008-04-07 James E. Wilson + + * pt.c (tsubst_copy, case SIZEOF_EXPR): Initialize len. + +2008-04-07 Jason Merrill + + PR c++/35734 + * class.c (type_has_user_nondefault_constructor): A template + counts as a nondefault constructor. + +2008-04-04 Paolo Bonzini + + * decl.c (cxx_push_function_context): Delete. + (cxx_pop_function_context): Delete. + (start_preparsed_function): Merge cxx_push_function_context (!f->decl + code only). + * cp-objcp-common.h (LANG_HOOKS_FUNCTION_INIT, + LANG_HOOKS_FUNCTION_FINAL): Delete. + (LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P): Rename to + LANG_HOOKS_MISSING_NORETURN_OK_P. + * cp-tree.h (cxx_push_function_context, cxx_pop_function_context): + Delete prototype. + * semantics.c (current_stmt_tree): Fix comment. + +2008-04-03 Jakub Jelinek + + PR c++/35741 + * semantics.c (finish_offsetof): Undo effect of convert_from_reference + before calling fold_offsetof. + +2008-04-03 Tom Tromey + + * Make-lang.in (c++_OBJS): New variable. + +2008-04-03 Paolo Bonzini + + * optimize.c (clone_body): New, from tree-inline.c. + +2008-04-03 Paolo Bonzini + + * method.c (synthesize_method): Use {push,pop}_function_context. + * name-lookup.c (push_to_top_level): Likewise. + * parser.c (cp_parser_late_parsing_for_member): Likewise. + +2008-03-30 Volker Reichelt + + PR c++/35578 + * parser.c (cp_parser_decl_specifier_seq): Add location to error + message. + +2008-03-27 Tom Tromey + + * Make-lang.in: Revert automatic dependency patch. + +2008-03-27 Douglas Gregor + + PR obj-c++/35704 + * typeck.c (build_x_compound_expr): Use cp_build_compound_expr. + (build_compound_expr): New, for compatibility with C + build_compound_expr. + (cp_build_compound_expr): Renamed from build_compound_expr. + (build_c_cast): New, for compatibility with C build_c_cast. + (cp_build_c_cast): Renamed from build_c_cast. + * init.c (build_vec_delete_1): Fix calls to build_compound_expr. + * decl.c (cxx_maybe_build_cleanup): Ditto. + * cp-tree.h (build_compound_expr): Add C-compatibile prototype. + (cp_build_compound_expr): Renamed from build_compound_expr. + (build_c_cast): Add C-compatible prototype. + (cp_build_c_cast): Renamed from build_c_cast. + * typeck2.c (build_functional_cast): Use cp_build_c_cast. + * parser.c (cp_parser_cast_expression): Fix call to build_c_cast. + +2008-03-27 Douglas Gregor + + * pt.c (tsubst_copy) : Cope with + tsubst_pack_expansion returning a pack expansion, or a TREE_VEC + ending in a pack expansion, both of which can occur when + substituting into a nested template. + (tsubst_copy_and_build) : When we're + instantiating the sizeof...(X) form, make tsubst_copy do the work. + * parser.c (cp_parser_template_parameter): Deal with unnamed + non-type template parameter packs identified by pack expansions in + the parameter type. + +2008-03-26 Jakub Jelinek + + PR c++/35546 + * pt.c (apply_late_template_attributes): Don't call tsubst on + first attribute argument if it is IDENTIFIER_NODE. + + PR c++/35332 + * error.c (dump_expr): Pass {,UN}ORDERED_EXPR, UN{LT,LE,GT,GE,EQ}_EXPR + and LTGT_EXPR to pp_expression. + +2008-03-26 Douglas Gregor + + * pt.c (coerce_template_template_parm): Moved the body of the loop + of coerce_template_template_parms here, to make iteration over a + template argument pack simpler. + Also, allow matching of a template parameter pack in the template + template parameter to a template parameter in the template + template argument. + (coerce_template_template_parms): Deal with variadic template + template parameters. Use coerce_template_template_parm. + (unify): Make sure we coerce the template template argument's + template arguments to the template template parameter's template + parameters, not the other way around. + +2008-03-25 Tom Tromey + + * Make-lang.in: Remove .o targets. + (cp/g++spec.o): Moved to cp/. Reduce to variable setting. + (GXX_OBJS): Update. + (c++_OBJS): New variable. + (CXX_TREE_H, CXX_PRETTY_PRINT_H): Remove. + +2008-03-25 Douglas Gregor + + * typeck.c (composite_pointer_type_r): Add SFINAE support. + (composite_pointer_type): Ditto. + (common_type): Fix call to composite_pointer_type. + (cxx_sizeof_nowarn): New; used to be a macro. + (cxx_sizeof_expr): Add SFINAE support. + (cxx_alignof_expr): Ditto. + (decay_conversion): Fix calls for SFINAE support. + (rationalize_conditional_expr): Add SFINAE support. + (build_class_member_access_expr): Ditto. + (finish_class_member_access_expr): Ditto. + (build_x_indirect_ref): Ditto. + (build_indirect_ref): Original version renamed to + cp_build_indirect_ref; new version provides a bridge from + c-common. + (cp_build_indirect_ref): Was build_indirect_ref; added SFINAE + support. + (get_member_function_from_ptrfunc): Fix calls for SFINAE support. + (build_function_call): Original version renamed to + cp_build_function_call; new version provides a bridge from + c-common. + (cp_build_function_call): Was build_function_call; added SFINAE + support. + (convert_arguments): Add SFINAE support. + (build_x_binary_op): Ditto. + (build_binary_op): Original version renamed to cp_build_binary_op; + new version provides a bridge from c-common. + (cp_build_binary_op): Was build_binary_op; added SFINAE support. + (pointer_diff): Fix calls for SFINAE. + (build_x_unary_op): Add SFINAE support. + (condition_conversion): Fix calls for SFINAE. + (build_unary_op): Original version renamed to cp_build_unary_op; + new version provides a bridge from c-common. + (cp_build_unary_op): Was build_unary_op; added SFINAE support. + (unary_complex_lvalue): Fix calls for SFINAE. + (build_x_conditional_expr): Add SFINAE support. + (build_x_compound_expr_from_list): Fix calls for SFINAE. + (build_x_compound_expr): Add SFINAE support. + (convert_ptrmem): Fix calls for SFINAE. + (build_static_cast_1): Add SFINAE support. + (build_static_cast): Ditto. + (build_reinterpret_cast_1): Ditto. + (build_reinterpret_cast): Ditto. + (build_const_cast_1): Ditto. + (build_const_cast): Ditto. + (build_c_cast): Ditto. + (build_modify_expr): Original version renamed to + cp_build_modify_expr; new version provides a bridge from c-common. + (cp_build_modify_expr): Was build_modify_expr; added SFINAE + support. + (build_x_modify_expr): Add SFINAE support. + (build_ptrmemfunc): Fix calls for SFINAE. + (convert_for_assignment): Add SFINAE support. + (convert_for_initialization): Ditto. + (check_return_expr): Fix calls for SFINAE. + (lvalue_or_else): Add SFINAE support. + * init.c (perform_member_init): Fix calls for SFINAE. + (emit_mem_initializers): Ditto. + (expand_virtual_init): Ditto. + (expand_cleanup_for_base): Ditto. + (build_aggr_init): Add SFINAE support. + (expand_default_init): Ditto. + (expand_aggr_init_1): Fix calls for SFINAE. + (build_offset_ref): Ditto. + (build_new_1): Add SFINAE support. + (build_new): Ditto. + (build_vec_delete_1): Fix calls for SFINAE. + (get_temp_regvar): Ditto. + (build_vec_init): Add SFINAE support. + (build_dtor_call): Fix calls for SFINAE. + (build_delete): Ditto. + (push_base_cleanups): Ditto. + (build_vec_delete_1): Ditto. + * class.c (build_base_path): Fix calls for SFINAE. + (build_simple_base_path): Ditto. + (convert_to_base_statically): Ditto. + (build_vfn_ref): Ditto. + (resolve_address_of_overloaded_function): Ditto. + * decl.c (check_initializer): Fix calls for SFINAE. + (register_dtor_fn): Ditto. + (compute_array_index_type): Ditto. + (finish_enum): Ditto. + (start_preparsed_function): Ditto. + (cxx_maybe_build_cleanup): Ditto. + * call.c (convert_like): Add COMPLAIN argument. + (convert_like_with_context): Ditto. + (build_this): Fix calls for SFINAE. + (build_user_type_conversion): Ditto. + (resolve_args): Ditto. + (build_new_function_call): Add SFINAE support. + (build_operator_new_call): Fix calls for SFINAE. + (build_object_call): Add SFINAE support. + (build_conditional_expr): Ditto. + (build_new_op): Ditto. + (build_op_delete_call): Fix calls for SFINAE. + (build_temp): Ditto. + (convert_like_real): Add SFINAE support. + (build_x_va_arg): Fix calls for SFINAE. + (convert_default_arg): Ditto. + (build_over_call): Add SFINAE support. + (build_java_interface_fn_ref): Fix calls for SFINAE. + (build_special_member_call): Add SFINAE support. + (build_new_method_call): Ditto. + (perform_implicit_conversion): Ditto. + (perform_direct_initialization_if_possible): Ditto. + (initialize_reference): Fix calls for SFINAE. + * method.c (do_build_assign_ref): Fix calls for SFINAE. + * rtti.c (build_headof): Fix calls for SFINAE. + (get_tinfo_decl_dynamic): Ditto. + (get_typeid): Ditto. + (build_dynamic_cast_1): Add SFINAE support. + (build_dynamic_cast): Ditto. + (tinfo_base_init): Fix calls for SFINAE. + * except.c (do_get_exception_ptr): Fix calls for SFINAE. + (do_end_catch): Ditto. + (initialize_handler_parm): Ditto. + (expand_start_catch_block): Ditto. + (do_allocate_exception): Ditto. + (do_free_exception): Ditto. + (build_throw): Ditto. + * cvt.c (build_up_reference): Fix calls for SFINAE. + (convert_to_reference): Ditto. + (ocp_convert): Ditto. + (convert_to_void): Add SFINAE support. + * tree.c (build_dummy_object): Fix calls for SFINAE. + (stabilize_expr): Ditto. + * cp-tree.h (build_conditional_expr): Add tsubst_flags_t + parameter. + (build_new_method_call): Ditto. + (build_special_member_call): Ditto. + (build_new_op): Ditto. + (perform_implicit_conversion): Ditto. + (perform_direct_initialization_if_possible): Ditto. + (convert_to_void): Ditto. + (build_aggr_init): Ditto. + (build_new): Ditto. + (build_vec_init): Ditto. + (build_dynamic_cast): Ditto. + (finish_call_expr): Ditto + (cxx_sizeof_or_alignof_expr): Add COMPLAIN parameter. + (cxx_sizeof_nowarn): Remove macro; add function declaration. + (build_class_member_access_expr): Add tsubst_flags_t parameter. + (finish_class_member_access_expr): Ditto. + (build_x_indirect_ref): Ditto. + (cp_build_indirect_ref): New. + (cp_build_function_call): Add tsubst_flags_t parameter. + (build_x_unary_op): Ditto. + (cp_build_unary_op): New. + (build_x_conditional_expr): Add tsubst_flags_t parameter. + (build_x_compound_expr): Ditto. + (build_compound_expr): Ditto. + (build_static_cast): Ditto. + (build_reinterpret_cast): Ditto. + (build_const_cast): Ditto. + (build_c_cast): Ditto. + (build_x_modify_expr): Ditto. + (cp_build_modify_expr): New. + (convert_for_initialization): Add tsubst_flags_t parameter. + (cp_build_binary_op): Remove macro; add function declaration. + (invalid_nonstatic_memfn_p): Add tsubst_flags_t parameter. + (lvalue_or_else): Ditto. + (build_functional_cast): Ditto. + * typeck2.c (digest_init): Fix calls for SFINAE. + (process_init_constructor_array): Ditto. + (process_init_constructor_record): Ditto. + (build_x_arrow): Ditto. + (build_m_component_ref): Ditto. + (build_functional_cast): Add SFINAE support. + * pt.c (tsubst_copy_and_build): Add (more) SFINAE support. + * semantics.c (simplify_loop_decl_cond): Fix calls for SFINAE. + (finish_expr_stmt): Ditto. + (finish_for_expr): Ditto. + (finish_asm_stmt): Ditto. + (finish_non_static_data_member): Ditto. + (finish_qualified_id_expr): Ditto. + (finish_call_expr): Add SFINAE support. + (finish_increment_expr): Fix calls for SFINAE. + (finish_unary_op_expr): Ditto. + (simplify_aggr_init_expr): Ditto. + (finish_omp_clauses): Ditto. + (finish_omp_for): Ditto. + (finish_omp_barrier): Ditto. + (finish_omo_flush): Ditto. + * decl2.c (grok_array_decl): Fix calls or SFINAE. + (build_anon_union_vars): Ditto. + (get_guard_cond): Ditto. + (set_guard): Ditto. + (one_static_initialization_or_destruction): Ditto. + (do_static_initialization_or_destruction): Ditto. + (generate_ctor_or_dtor_function): Ditto. + (build_offset_ref_call_from_tree): Ditto. + * parser.c (cp_parser_postfix_expression): Fix calls for SFINAE. + (cp_parser_postfix_dot_deref_expression): Ditto. + (cp_parser_unary_expression): Ditto. + (cp_parser_new_expression): Ditto. + (cp_parser_cast_expression): Ditto. + (cp_parser_binary_expression): Ditto. + (cp_parser_question_colon_clause): Ditto. + (cp_parser_assignment_expression): Ditto. + (cp_parser_expression): Ditto. + (cp_parser_builtin_offsetof): Ditto. + (cp_parser_template_argument): Ditto. + (cp_parser_functional_cast): Ditto. + +2008-03-24 Tom Tromey + + * lex.c (handle_pragma_interface): Don't copy the filename. + (handle_pragma_implementation): Copy filename using xstrdup. + +2008-03-21 Paolo Carlini + + * cp-tree.h (IS_AGGR_TYPE): Rename to MAYBE_CLASS_TYPE_P. + (SET_IS_AGGR_TYPE): Rename to SET_CLASS_TYPE_P. + (IS_AGGR_TYPE_CODE): Rename to RECORD_OR_UNION_CODE_P. + (PROMOTES_TO_AGGR_TYPE): Remove. + (CLASS_TYPE_P, TYPE_NON_AGGREGATE_CLASS): Adjust. + * typeck.c (unary_complex_lvalue, build_modify_expr, + convert_for_initialization): Adjust. + * init.c (is_aggr_type): Remove. + (is_class_type): Add. + (build_offset_ref, build_new_1, build_vec_delete_1, build_vec_init, + build_delete): Adjust. + * lex.c (make_aggr_type): Remove. + (make_class_type): Add. + (cxx_make_type): Adjust. + * class.c (finish_struct_1, fixed_type_or_null, is_empty_class): + Adjust. + * decl.c (build_typename_type, make_typename_type, + make_unbound_class_template, cxx_init_decl_processing, + check_tag_decl, groktypename, start_decl_1, layout_var_decl, + check_initializer, cp_finish_decl, build_ptrmemfunc_type, grokparms, + grok_op_properties, xref_tag, check_function_type): Adjust. + * call.c (check_dtor_name, standard_conversion, implicit_conversion, + add_builtin_candidate, add_builtin_candidates, + build_user_type_conversion_1, convert_like_real, build_cxx_call, + is_subseq, compare_ics): Adjust. + * method.c (use_thunk): Adjust. + * rtti.c (build_dynamic_cast_1, create_pseudo_type_info, + create_tinfo_types): Adjust. + * cvt.c (cp_convert_to_pointer, convert_to_pointer_force, + build_up_reference, convert_to_reference, convert_from_reference, + ocp_convert, build_expr_type_conversion): Adjust. + * tree.c (bind_template_template_parm, error_type): Adjust. + * dump.c (cp_dump_tree): Adjust. + * search.c (lookup_member): Adjust. + * friend.c (make_friend_class, do_friend): Adjust. + * typeck2.c (store_init_value, process_init_constructor_array, + process_init_constructor_record, build_x_arrow, build_m_component_ref, + build_functional_cast): Adjust. + * pt.c (finish_member_template_decl, process_template_parm, + lookup_template_class, tsubst_function_type, tsubst, + tsubst_copy_and_build, get_template_base, bt_instantiate_type_proc): + Adjust. + * semantics.c (begin_class_definition, finish_base_specifier, + finish_typeof, cxx_omp_predetermined_sharing, finish_decltype_type): + Adjust. + * name-lookup.c (constructor_name_p, push_overloaded_decl, + do_class_using_decl, lookup_qualified_name, + maybe_process_template_type_declaration): Adjust. + * decl2.c (grok_array_decl, check_member_template, + constrain_class_visibility): Adjust. + * parser.c (cp_parser_class_name): Adjust. + +2008-03-18 Paolo Bonzini + + * cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Delete. + +2008-03-17 Jason Merrill + + PR c++/35548 + * call.c (reference_binding): Check LOOKUP_NO_TEMP_BIND when binding + a temp directly to a reference as per DR391. + +2008-03-12 Richard Guenther + + PR c++/35469 + Revert: + 2008-02-04 Richard Guenther + + PR java/35035 + * decl.c (record_builtin_java_type): Make jboolean a + integer type again where its mode doesn't match that of bool. + + 2008-01-25 Richard Guenther + + PR c++/33887 + * decl.c (record_builtin_java_type): Make __java_boolean + a variant of bool. + * typeck.c (structural_comptypes): Move TYPE_FOR_JAVA check + after TYPE_MAIN_VARIANT check. + +2008-03-10 Jakub Jelinek + + PR c++/35328 + * semantics.c (finish_omp_clauses): Look through NOP_EXPR even + if errorcount. + + PR c++/35337 + * semantics.c (finish_omp_clauses): Use %qD instead of %qE for + DECL_P in not a variable and appears more than once error messages. + +2008-03-07 Paolo Bonzini + + Revert: + + 2008-02-06 Douglas Gregor + + PR c++/35049 + PR c++/35096 + * typeck.c (structural_comptypes): Call cp_comptypes. + (comptypes): New; called from the C/C++ common bits to perform + strict checks. + (cp_comptypes): Renamed from comptypes, which is already used, + with a different signature, by the C++ front end. + (build_reinterpret_cast_1): Call cp_comptypes. + (ptr_reasonably_similar): Ditto. + * decl.c (decls_match): Ditto. + * cvt.c (convert_to_reference): Ditto. + * cp-tree.h (same_type_p): Ditto. + (same_or_base_type_p): Ditto. + (comptypes): Rename to cp_comptypes. + * pt.c (canonical_type_parameter): Call cp_comptypes. + +2008-03-07 Paolo Bonzini + + * cp-objcp-common.c (cxx_types_compatible_p): Remove obsolete + test for equivalence between pointer and references. + +2008-03-02 Manuel Lopez-Ibanez + + PR 24924 + * class.c (finish_struct_anon): Use permerror instead of pedwarn. + (check_field_decls): Likewise. + (note_name_declared_in_class): Likewise. + * call.c (build_new_op): Likewise. + (convert_like_real): Likewise. + (build_over_call): Likewise. + * lex.c (unqualified_fn_lookup_error): Likewise. + * parser.c (cp_parser_template_id): Likewise. + * cvt.c (warn_ref_binding): Likewise. + (convert_to_reference): Likewise. + (ocp_convert): Likewise. + (convert_to_void): Use error instead of pedwarn. + * error.c (cp_cpp_error): Use pedantic_warning_kind. + * decl.c (compute_array_index_type): Use constant_expression_error. + +2008-03-01 Douglas Gregor + + * parser.c (cp_lexer_next_token_is_decl_specifier_keyword): Note + that auto is either a storage class or a simple type specifier, + depending on the dialect. + (cp_parser_decl_specifier_seq): Complain about `auto' as a storage + specifier in C++98 mode, error in C++0x mode (since we don't + support auto as a type specifier, yet). + (cp_parser_storage_class_specifier_opt): Don't treat `auto' as a + storage specifier in C++0x mode. + (cp_parser_simple_type_specifier): Parse `auto' as a + simple-type-specifier, but error because we don't support it yet. + +2008-02-29 Manuel Lopez-Ibanez + + * parser.c (cp_parser_nonclass_name): New. + (cp_parser_pseudo_destructor_name): Use it instead of + cp_parser_type_name. + (cp_parser_type_name): Move code to cp_parser_nonclass_name. + +2008-02-29 Tom Tromey + + * parser.c (struct cp_token) : Remove. + (cp_lexer_get_preprocessor_token): Update. + (cp_lexer_set_source_position_from_token): Don't call + restore_input_file_stack. + * lex.c (cxx_init): Don't use push_srcloc or pop_srcloc. + +2008-02-28 Richard Guenther + + Revert: + 2008-02-26 Richard Guenther + + * decl.c (duplicate_decls): Remove decl from global mapping + before ggc_freeing it. + +2008-02-27 Jakub Jelinek + + PR c++/35368 + * rtti.c: Include c-pragma.h. + (push_abi_namespace, pop_abi_namespace): New functions. + (build_dynamic_cast_1, tinfo_base_init, get_pseudo_ti_index, + create_tinfo_types, emit_support_tinfos): Use them. + * Make-lang.in (cp/rtti.o): Depend on $(C_PRAGMA_H). + +2008-02-26 Jason Merrill + + PR c++/35315 + * decl.c (grokdeclarator): Allow a typedef of an unnamed struct + to name the struct for linkage purposes even if it has attributes. + (start_decl): In that case, set ATTR_FLAG_TYPE_IN_PLACE. + +2008-02-26 Tom Tromey + + * parser.c (eof_token): Remove old location code. + (check_empty_body): Remove test of USE_MAPPED_LOCATION. + * decl2.c (generate_ctor_or_dtor_function): Remove old location + code. + (cp_write_global_declarations): Likewise. + * lex.c (cxx_init): Remove old location code. + (handle_pragma_implementation): Remove test of + USE_MAPPED_LOCATION. + * pt.c (tsubst): Remove old location code. + * error.c (cp_print_error_function): Remove test of + USE_MAPPED_LOCATION. + * decl.c (pop_label): Remove old location code. + (finish_function): Likewise. + +2008-02-26 Manuel Lopez-Ibanez + + PR 26264 + * call.c (magic_varargs_p): Remove BUILT_IN_STDARG_START. + +2008-02-26 Richard Guenther + + * decl.c (duplicate_decls): Remove decl from global mapping + before ggc_freeing it. + +2008-02-26 Paolo Carlini + + PR c++/35323 + * name-lookup.c (arg_assoc_type): Handle FIXED_POINT_TYPE. + +2008-02-26 Manuel Lopez-Ibanez + + * typeck.c (build_class_member_access_expr): Add appropriate + OPT_W* parameter to warning. + (build_reinterpret_cast_1): Likewise. + * name-lookup.c (push_overloaded_decl): Likewise. + +2008-02-25 Paolo Carlini + + PR c++/35333 + * error.c (dump_expr): Handle CONJ_EXPR. + +2008-02-25 Paolo Carlini + + PR c++/35338 + * error.c (dump_type): Handle FIXED_POINT_TYPE. + (dump_expr): Handle FIXED_CST. + +2008-02-24 Jason Merrill + + * parser.c (cp_parser_declaration): Handle "inline namespace". + (cp_parser_namespace_definition): Likewise. + + PR c++/33486 + * name-lookup.c (arg_assoc_namespace): Look down into inline + namespaces, too. + +2008-02-23 Manuel Lopez-Ibanez + + * typeck.c (check_for_casting_away_constness): Use 1 single + argument, the type of cast, to decide what diagnostics generate. + (build_static_cast_1): Remove unused code. Update call to + check_for_casting_away_constness. + (build_reinterpret_cast_1): Update call to + check_for_casting_away_constness. + (build_const_cast_1): Likewise. + +2008-02-24 Paolo Carlini + + * error.c (dump_expr): Don't deal directly with NEW_EXPR (and + VEC_NEW_EXPR), forward to pp_expression. + * cxx-pretty-print.c (pp_cxx_new_expression): Fix FIXME. + +2008-02-24 Danny Smith + + PR c++/34749 + * friend.c (do_friend): Call cplus_decl_attributes earlier. + +2008-02-22 Andrew Pinski + + PR C++/34715 + * decl.c (duplicate_decls): Merge DECL_DISREGARD_INLINE_LIMITS for + template decls' function decl. + +2008-02-22 Paolo Carlini + + PR c++/35282 + Revert: + 2008-02-14 Paolo Carlini + + PR c++/28743 + * pt.c (determine_specialization): In case of function templates, + when the type of DECL does not match FN there is no match. + +2008-02-22 Ralf Wildenhues + + PR c/19999 + * typeck.c (build_binary_op): Warn about floating point + comparisons if FLOAT_TYPE_P, not only for REAL_TYPE. + +2008-02-19 Jason Merrill + + PR c++/34950 + * pt.c (resolve_overloaded_unification): Set processing_template_decl + while we look for possible bindings. + +2008-02-19 Jakub Jelinek + + PR c++/35028 + * cp-gimplify.c (cxx_omp_clause_apply_fn): Handle vararg copy ctors. + + PR c++/34964 + PR c++/35244 + * semantics.c (finish_omp_threadprivate): Do nothing for error_operand_p + vars. Afterwards ensure v is VAR_DECL. + + PR c++/35078 + * parser.c (cp_parser_omp_for_loop): If DECL has REFERENCE_TYPE, don't + call cp_finish_decl. + * semantics.c (finish_omp_for): Fail if DECL doesn't have integral type + early. + +2008-02-15 Douglas Gregor + + PR c++/35023 + PR c++/35024 + PR c++/35026 + * pt.c (finish_member_template_decl): If the type in a TYPE_DECL + is error_mark_node, return an error early. + (find_parameter_packs_r): Pass the pointer set along to recursive + calls of cp_walk_subtrees; don't try to manage the pointer set + ourselves. + (uses_parameter_packs): Pass the pointer set to cp_walk_tree. + (make_pack_expansion): Ditto. + (check_for_bare_parameter_packs): Ditto. Also, don't bother taking + a second pass through the tree with find_parameter_packs_r; that + second pass no longer does anything. + (push_template_decl_real): If we have an erroneous declaration, + set its type to error_mark_node before returning an error. + +2008-02-14 Douglas Gregor + + PR c++/34050 + * pt.c (tsubst_initializer_list): Deal with the use of + VOID_TYPE_NODE to indicate value-initialization of the bases. + +2008-02-14 Manuel Lopez-Ibanez + Jason Merrill + + PR c++/5645 + PR c++/11159 + * class.c (type_has_user_nondefault_constructor): New fn. + * cp-tree.h: Declare it. + * init.c (emit_mem_initializers): Use it for -W warning about + missing base initializer. + +2008-02-14 Paolo Carlini + + PR c++/28743 + * pt.c (determine_specialization): In case of function templates, + when the type of DECL does not match FN there is no match. + +2008-02-13 Jakub Jelinek + Manuel Lopez-Ibanez + + PR c++/35138 + * parser.c (cp_parser_pseudo_destructor_name): If next tokens + are not identifier :: ~, return before calling cp_parser_type_name. + +2008-02-13 Jason Merrill + + PR c++/34962, c++/34937, c++/34939 + * decl2.c (is_late_template_attribute): Always defer attributes + vector_size and weak. + + PR c++/34774 + * pt.c (value_dependent_expression_p): Look into DECL_INITIAL + of enumerators, too. + +2008-02-12 Jason Merrill + + PR c++/34824 + * call.c (convert_like_real): Pass LOOKUP_NO_CONVERSION to build_temp + if we're doing conversions to call a user-defined conversion function. + +2008-02-12 Steven Bosscher + + PR c++/29048 + * semantics.c (finish_qualified_id_expr): Avoid duplicate access + check here, too. + +2008-02-12 Jakub Jelinek + + PR c++/34862 + * init.c (build_new_1): Don't create placement_expr before + constructing alloc_call. Verify that the pointer is passed by + value to operator new. + +2008-02-11 Jason Merrill + + PR c++/35097 + * pt.c (tsubst): Don't look up a template typedef in an explicit + specialization. + +2008-02-11 Douglas Gregor + + PR c++/35113 + * tree.c (cp_build_qualified_type_real): When building a + cv-qualified array type, build it as a unique type with + build_cplus_array_type_1 and then adopt the unqualified type's + main variant. + +2008-02-11 Paolo Carlini + + PR c++/35077 + * decl.c (groktypename): Check grokdeclarator return. + +2008-02-10 Jason Merrill + + PR c++/34094 + * decl2.c (cp_write_global_declarations): Don't write out static + data members with DECL_IN_AGGR_P set. + +2008-02-08 Jason Merrill + + PR c++/35116 + * tree.c (build_target_expr_with_type): Handle void initializer. + (bot_manip): Remap slot before recursing. + +2008-02-06 Kaveh R. Ghazi + + PR other/35107 + * Make-lang.in (cc1plus-dummy, cc1plus): Add $(GMPLIBS). + +2008-02-06 Alexandre Oliva + + PR c++/35056 + * tree.c: Include tree-flow.h. + (build_target_expr): Check type compatibility. + * Make-lang.in (cp/tree.o): Depend on $(TREE_FLOW_H). + * call.c (convert_like_real): Convert bitfield to expected type. + +2008-02-06 Douglas Gregor + + PR c++/35049 + PR c++/35096 + * typeck.c (structural_comptypes): Call cp_comptypes. + (comptypes): New; called from the C/C++ common bits to perform + strict checks. + (cp_comptypes): Renamed from comptypes, which is already used, + with a different signature, by the C++ front end. + (build_reinterpret_cast_1): Call cp_comptypes. + (ptr_reasonably_similar): Ditto. + * decl.c (decls_match): Ditto. + * cvt.c (convert_to_reference): Ditto. + * cp-tree.h (same_type_p): Ditto. + (same_or_base_type_p): Ditto. + (comptypes): Rename to cp_comptypes. + * pt.c (canonical_type_parameter): Call cp_comptypes. + +2008-02-05 Jakub Jelinek + + PR c++/33553 + * pt.c (tsubst) : Don't issue error if max is + value dependent expression. + +2008-02-05 Douglas Gregor + + PR c++/35074 + * decl2.c (save_template_attributes): When we're modifying the + TYPE_MAIN_VARIANT to add new attributes, be sure to also modify + all of the other variants to add those same attributes. Otherwise, + the main variant will be inconsistent with those other variants. + +2008-02-04 Richard Guenther + + PR java/35035 + * decl.c (record_builtin_java_type): Make jboolean a + integer type again where its mode doesn't match that of bool. + +2008-02-02 Jason Merrill + Mark Mitchell + + PR c++/33916 + * init.c (build_value_init_1): New function. + (build_value_init): New function. + * typeck2.c (build_functional_cast): Call it. + * cp-gimplify.c (cp_gimplify_init_expr): Handle its output. + + * cp-tree.h (TYPE_HAS_USER_CONSTRUCTOR): Rename from + TYPE_HAS_CONSTRUCTOR. + * class.c (finish_struct_bits, maybe_warn_about_overly_private_class, + add_implicitly_declared_members): Adjust. + (check_field_decls): Adjust. Remove warnings about reference/const + in class without constructor. + (check_bases_and_members): Adjust. Give those warnings here instead. + * decl.c (fixup_anonymous_aggr): Adjust. + (check_initializer): Adjust, clarify logic slightly. + (grok_special_member_properties): Adjust, only set if user-provided. + * rtti.c (create_tinfo_types): Don't set. + * cvt.c (ocp_convert): Remove exception for vtable_entry_type et al. + Use same_type_ignoring_top_level_qualifiers_p. + * pt.c (check_explicit_specialization): Adjust. + (instantiate_class_template): Adjust. + +2008-01-31 Douglas Gregor + Jakub Jelinek + + PR c++/34935 + PR c++/34936 + * typeck.c (structural_comptypes): Handle comparisons of + VOID_TYPE, BOOLEAN_TYPE, INTEGER_TYPE, FIXED_POINT_TYPE, and + REAL_TYPE nodes. + * mangle.c (write_builtin_type): Map down to the canonical type, + which will be one of the predefined type nodes. + +2008-01-29 Michael Meissner + + PR 35004 + * cp-tree.h (struct full_lang_decl): Make tree_code bitfield 16 + bits to allow for expansion of the number of middle end tree + codes. + +2008-01-29 Douglas Gregor + + PR c++/34055 + PR c++/34103 + PR c++/34219 + PR c++/34606 + PR c++/34753 + PR c++/34754 + PR c++/34755 + PR c++/34919 + PR c++/34961 + * typeck.c (check_return_expr): Tweak call to + check_for_bare_parameter_packs. + * class.c (add_method): Be careful with error_mark_nodes. + * cp-tree.h (check_for_bare_parameter_packs): Remove "*" from + signature. + * pt.c (struct find_parameter_pack_data): Remove + SET_PACKS_TO_ERROR. + (find_parameter_packs_r): Don't use SET_PACKS_TO_ERROR. + (uses_parameter_packs): Don't set SET_PACKS_TO_ERROR. + (make_pack_expansion): Ditto. + (check_for_bare_parameter_packs): Parameter is now a tree, not a + tree*. + (process_template_parm): Tweak call to + check_for_bare_parameter_packs. + (push_template_decl_real): Tweak calls to + check_for_bare_parameter_packs. If bare parameter packs are found + in the list of exceptions, clear out that list after giving an + error. + * semantics.c (finish_cond): Tweak call to + check_for_bare_parameter_packs. + (finish_expr_stmt): Ditto. + (finish_for_expr): Ditto. + (finish_switch_cond): Ditto. + (finish_mem_initializers): Ditto. + (finish_member_declaration): Ditto. + (finish_static_assert): Check for bare parameter packs in the + condition. + * decl2.c (cplus_decl_attributes): Check for bare parameter packs in the + attributes of a declaration. + * parser.c (cp_parser_using_declaration): Tweak call to + check_for_bare_parameter_packs. + (cp_parser_base_clause): Ditto. + +2008-01-28 Jason Merrill + + PR c++/35007 + * class.c (build_base_path): Fix !want_pointer case. + +2008-01-27 Jason Merrill + + PR c++/27177 + * class.c (build_base_path): Fix previous change. + +2008-01-26 Jakub Jelinek + + PR c++/34965 + * error.c (dump_expr): Handle TRUTH_AND_EXPR, TRUTH_OR_EXPR + and TRUTH_XOR_EXPR. + +2008-01-26 Richard Guenther + + PR c++/34235 + * typeck.c (build_binary_op): Remove code to shorten compares. + +2008-01-25 Richard Guenther + + PR c++/33887 + * decl.c (record_builtin_java_type): Make __java_boolean + a variant of bool. + * typeck.c (structural_comptypes): Move TYPE_FOR_JAVA check + after TYPE_MAIN_VARIANT check. + +2008-01-25 Jason Merrill + + PR c++/27177 + * class.c (build_base_path): Don't mess with virtual access if + skip_evaluation. + * call.c (standard_conversion): Don't check whether source type + is complete. + + * decl2.c (is_late_template_attribute): Don't defer attribute + visibility just because the type is dependent. + +2008-01-25 Jason Merrill + Mark Mitchell + + PR c++/31780 + * call.c (standard_conversion): Allow conversion from integer/real + to complex. + (compare_ics): Such a conversion is worse than a normal arithmetic + conversion. + +2008-01-25 Richard Guenther + + PR c++/33887 + * cp-lang.c (LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS): Define + to true. + +2008-01-24 Paolo Carlini + + PR c++/34603 + * pt.c (push_template_decl_real): Return error_mark_node in case + of template definition of non-template. + +2008-01-24 Jason Merrill + + PR c++/34913 + * decl2.c (is_late_template_attribute): Defer any attribute with + dependent args. Also defer type attributes if the type is dependent. + +2008-01-22 Jakub Jelinek + Alexandre Oliva + + PR c++/33984 + * call.c (reference_binding): For bitfields use the declared bitfield + type. + (add_builtin_candidates): Likewise. + * class.c (layout_class_type): For bitfields copy over the + original type quals. + +2008-01-22 Jason Merrill + + PR c++/28560 + * decl.c (groktypename): Also ignore attributes on dependent + possibly-class types. + + PR c++/34912 + * friend.c (do_friend): Check for prior declaration of a friend + function of a local class. + * name-lookup.c (lookup_name_innermost_nonclass_level): + No longer static. + * name-lookup.h: Declare it. + +2008-01-22 Tom Tromey + + PR c++/34829: + * init.c (build_new_1): Only disallow Java aggregates. + +2008-01-22 Jakub Jelinek + + PR c++/34607 + * semantics.c (finish_omp_for): Don't call c_finish_omp_for + if decl or init is error_mark_node. + + PR c++/34918 + * error.c (dump_expr): Handle VECTOR_CST. + +2008-01-21 Jason Merrill + + PR c++/33959 + * pt.c (tsubst_aggr_type): Make sure our context is complete. + + PR c++/34573 + * pt.c (retrieve_local_specialization): Robustify. + (tsubst_pack_expansion, tsubst_decl): Remove redundant checks. + + PR c++/34846 + * pt.c (tsubst): Only call retrieve_local_specialization if the + original typedef was in a function template. + + PR c++/34196 + * decl.c (wrap_cleanups_r): Set TRY_CATCH_IS_CLEANUP. + +2008-01-21 Richard Guenther + + PR c++/34850 + * error.c (cp_print_error_function): Deal with recursive + BLOCK trees. + +2008-01-20 Paolo Carlini + + PR c++/34891 + * error.c (dump_expr): Deal with VIEW_CONVERT_EXPR. + +2008-01-20 Paolo Carlini + + PR c++/34776 + PR c++/34486 + * name-lookup.c (do_class_using_decl): Do not call constructor_name_p + on non-IS_AGGR_TYPE scope. + (constructor_name_p): Assert IS_AGGR_TYPE. + +2008-01-18 Ian Lance Taylor + + PR c++/33407 + * decl.c (duplicate_decls): Copy DECL_IS_OPERATOR_NEW flag. + (grok_op_properties): For NEW_EXPR and VEC_NEW_EXPR set + DECL_IS_OPERATOR_NEW flag. + +2008-01-16 Richard Guenther + + PR c++/33819 + * typeck.c (is_bitfield_expr_with_lowered_type): Recurse + for conversions to type variants. + +2008-01-15 Andreas Tobler + + * parser.c (cp_parser_template_parameter): Fix C90 issue with mixing + declaration and code. Update copyright year. + +2008-01-15 Douglas Gregor + + PR c++/34399 + * friend.c (do_friend): Don't query TYPE_BEING_DEFINED unless we + know we have a class type. + +2008-01-15 Douglas Gregor + + PR c++/34751 + * pt.c (coerce_template_parameter_pack): When substituting into + the type of a non-type template parameter pack. use the + deduced/substituted arguments. + * parser.c (declarator_can_be_parameter_pack): A pointer-to-member + can be a parameter pack with the ellipsis following it. When we + have an erroneous declaration, allow it to be a parameter pack. + (cp_parser_template_parameter): Complain about default + arguments on non-type template parameter packs, and parse them + using the new cp_parser_default_argument. + (cp_parser_parameter_declaration): Complain about parameter packs + with default arguments. Move parsing of default arguments into a + new function, cp_parser_default_argument. + (cp_parser_default_argument): New; extracted from + cp_parser_parameter_declaration. + +2008-01-15 Douglas Gregor + + PR c++/34051 + PR c++/34055 + PR c++/34102 + PR c++/34103 + * typeck.c (check_return_expr): If there are bare parameter packs + in the return value, set it to error_mark_node. + * tree.c (cp_walk_subtrees): Walk USING_DECL nodes. + * pt.c (find_parameter_packs_r): Look at the type of + IDENTIFIER_NODEs (e.g., for user-defined conversions). + (check_for_bare_parameter_packs): Flip the result: now returns + TRUE when there were bare parameter packs, FALSE otherwise. + (push_template_decl_real): Deal with flipped result of + check_for_bare_parameter_packs. + * semantics.c (finish_cond): If there are bare parameter packs in + the conditional, set it to error_mark_node. + (finish_expr_stmt): If there are bare parameter packs in the + expression, set it to error_mark_node. + (finish_for_expr): Ditto. + (finish_switch_cond): If there are bare parameter packs in + the conditional, set it to error_mark_node. + (finish_mem_initializers): If there are bare parameter packs in + the member initializer, set it to error_mark_node. + (finish_member_declaration): Check the attributes of the + declaration for bare parameter packs, and remove the attributes if + any have bare parameter packs. + * parser.c (cp_parser_using_declaration): Check the using + declaration for bare parameter packs. + (cp_parser_base_clause): If there are bare parameter packs in a + base specifier, don't add it to the chain. + +2008-01-15 Douglas Gregor + + PR c++/34314 + * error.c (dump_simple_decl): Display ellipsis for template + non-type parameter packs. + (dump_decl): Display ellipsis for template type parameter packs. + (dump_template_decl): Display ellipsis for template template + parameter packs. + * pt.c (redeclare_class_template): When redeclaring a class + template, check for collisions between template parameters and + template parameter packs. + +2008-01-15 Douglas Gregor + + PR c++/33964 + * pt.c (process_partial_specialization): Don't mark template + parameters that occur in non-deduced contexts. + (struct pair_fn_data): Add include_nondeduced_p. + (for_each_template_parm_r): Only visit non-deduced contexts if + include_nondeduced_p is set. + (for_each_template_parm): Added parameter include_nondeduced_p, + which states whether template parameters found in non-deduced + contexts should be visited. + (uses_template_parms): Visit all template parameters, even those + in non-deduced contexts. + +2008-01-15 Douglas Gregor + + PR c++/34052 + * pt.c (check_default_tmpl_args): Check for parameter packs that + aren't at the end of a primary template. + (push_template_decl_real): Remove check for parameter packs that + aren't at the end of a primary template; that now happens in + check_default_tmpl_args. + * semantics.c (finish_template_template_parm): Use + check_default_tmpl_args to check for errors in the template + parameter list. + +2008-01-12 Doug Kwan + + * decl.c: (grokdeclarator): Use OPT_Wignored_qualifiers + instead of OPT_Wreturn_type in warning due to ignored return type + qualifiers. + * pt.c: (tsubst_function_type): Use OPT_Wignored_qualifiers + instead of OPT_Wreturn_type in warning due to ignored return type + qualifiers. + +2008-01-08 Jakub Jelinek + + PR c++/33890 + * semantics.c (finish_omp_for): Don't call + fold_build_cleanup_point_expr if processing_template_decl. + +2008-01-04 Paolo Carlini + Jakub Jelinek + + PR c++/34611 + * error.c (dump_template_argument): Deal with TREE_LIST. + +2008-01-01 Douglas Gregor + + * parser.c (cp_parser_check_decl_spec): Don't warn about "long + long" in C++0x mode; change the warning to note that "long long" + is only unsupported in C++98 mode. + + +Copyright (C) 2008 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2009 b/gcc/cp/ChangeLog-2009 new file mode 100644 index 000000000..c39304c46 --- /dev/null +++ b/gcc/cp/ChangeLog-2009 @@ -0,0 +1,3746 @@ +2009-12-28 Jason Merrill + + PR c++/42447 + * pt.c (iterative_hash_template_arg): Don't rely on TYPE_CANONICAL + for ARRAY_TYPE. + +2009-12-24 Jason Merrill + + PR c++/41305, DR 384 + * name-lookup.c (arg_assoc_class): Split out arg_assoc_class_only + and arg_assoc_bases. + (friend_of_associated_class_p): Remove. + (arg_assoc_namespace): Don't call it. + (arg_assoc_template_arg): Use arg_assoc_class_only for member + template context. + (arg_assoc_type): Handle UNION_TYPE and ENUMERAL_TYPE properly. + + * name-lookup.c (arg_assoc): Handle TEMPLATE_ID_EXPR properly. + +2009-12-23 Dodji Seketeli + + PR c++/42260 + * cp-tree.h (lookup_conversions): Add new bool parameter to + declaration. + * search.c (lookup_conversion): Use new bool parameter in + definition. + * call.c (add_builtin_candidates): Don't lookup template conversion + (convert_class_to_reference, build_user_type_conversion_1, + build_op_call): Adjust. + * cvt.c (build_expr_type_conversion): Likewise + +2009-12-22 Jason Merrill + + PR c++/42466 + * pt.c (reduce_template_parm_level): Check the type before + returning cached TEMPLATE_PARM_INDEX. + + PR c++/42331 + * typeck.c (cp_build_modify_expr): Fix thinko. + +2009-12-21 Jason Merrill + + * mangle.c (write_member_name): Move abi-version=1 code back to... + (write_expression): ...here. + +2009-12-21 Brian Hackett + + * decl.c (finish_function): Rename pre-genericize event. + +2009-12-19 Dodji Seketeli + + PR c++/42225 + * pt.c (push_template_decl_real): Set DECL_CONTEXT of template type parms + to their containing template decl. + * typeck.c (comp_template_parms_position): Split this from + structural_comptypes. + (incompatible_template_type_parms_p): Renamed + incompatible_dependent_typedefs_p into this. Change the function to + handle comparison between TEMPLATE_TYPE_PARMs only. + (structural_comptypes): Use comp_template_parms_position in + TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM cases. + Use incompatible_template_type_parms_p in TEMPLATE_TYPE_PARM case. + * mangle.c (decl_mangling_context): Template type parms don't have + a mangling context. + * tree.c (cp_set_underlying_type): Set type structural equality + only for TEMPLATE_TYPE_PARMs. + +2009-12-18 Jason Merrill + + PR c++/28300 + PR c++/42062 + * pt.c (check_specialization_namespace): Complain about + specialization at non-namespace scope. + + PR c++/42415 + * call.c (build_new_method_call): Complain about calling the + constructor directly. + +2009-12-18 Shujing Zhao + + PR c++/31665 + * decl.c (duplicate_decls, grokdeclarator): Put the diagnostics in + full sentences for easy translation and wrapped into G_(). + * typeck.c (build_x_unary_op): Likewise. + +2009-12-17 Shujing Zhao + + * call.c (build_over_call, build_java_interface_fn_ref): Update + cp_build_indirect_ref calls. + * typeck2.c (build_m_component_ref): Likewise. + +2009-12-17 Shujing Zhao + + * typeck.c (build_indirect_ref): Update the argument. + (build_x_indirect_ref): Likewise. + (cp_build_indirect_ref): Update the argument and emit the diagnostics + for easy translation. + (build_class_member_access_expr, build_array_ref, + get_member_function_from_ptrfunc): Update calls. + * cp-tree.h (build_x_indirect_ref, cp_build_indirect_ref): Update + prototypes. + * call.c (build_new_op, convert_like_real, build_x_va_arg, + build_over_call): Update calls. + * class.c (build_base_path, build_simple_base_path, build_vfn_ref): + Likewise. + * decl.c (start_preparsed_function): Likewise. + * except.c (expand_start_catch_block, build_throw): Likewise. + * init.c (emit_mem_initializers, expand_virtual_init, + expand_virtual_init, build_new_1, build_vec_init, build_delete, + build_vec_delete): Likewise. + * parser.c (cp_parser_unary_expression): Likewise. + * pt.c (tsubst_copy_and_build): Likewise. + * rtti.c (build_headof, get_tinfo_decl_dynamic, get_typeid): Likewise. + * semantics.c (finish_non_static_data_member, thisify_lambda_field): + Likewise. + * tree.c (build_dummy_object, stabilize_expr): Likewise. + * typeck2.c (build_x_arrow): Likewise. + +2009-12-16 Jason Merrill + + PR c++/42387 + * decl.c (compute_array_index_type): Mark a VLA as dependent. + +2009-12-15 Jason Merrill + + PR c++/42358 + * pt.c (iterative_hash_template_arg): Completely ignore + ARGUMENT_PACK_SELECT. + +2009-12-15 Jakub Jelinek + + PR c++/41183 + * cp-tree.h (current_class_ptr): Give NULL even when cfun + has NULL cfun->language. + +2009-12-14 Jason Merrill + + PR c++/42364 + * pt.c (function_parameter_expanded_from_pack_p): Don't require + a pack to have a name. + (tsubst_decl): Do typedef magic after applying attributes. + +2009-12-15 Paolo Bonzini + Shujing Zhao + + * Makefile.in (cp/pt.o): Depend on intl.h + * call.c (print_z_candidates): Make loop more compact, + choose head string depending on number of candidates, + extract creation of spaces string to intl.c. + * pt.c (print_overloaded_functions): Replace with... + (print_candidates_1): ... this rewrite. + (print_candidates): Rewrite to call print_candidates_1. + (most_specialized_class): Make loop more compact, + choose head string depending on number of candidates, + and size indents depending on translations. + +2009-12-11 Jason Merrill + + PR c++/42219 + * typeck.c (error_type_p): New. + (ptr_reasonably_similar): Use it. + * cp-tree.h: Declare it. + +2009-12-11 Dodji Seketeli + + PR c++/42225 + * typeck.c (incompatible_dependent_typedefs_p): New function. + (structural_comptypes): Use it. + * cp-tree.h (cp_set_underlying_type): Declare ... + * tree.c (cp_set_underlying_type): ... new function. + * class.c (build_self_reference): Use cp_set_underlying_type + instead of set_underlying_type. + * decl2.c (grokfield): Likewise. + * name-lookup.c (pushdecl_maybe_friend): Likewise. + +2009-12-11 Dodji Seketeli + + PR c++/42251 + * pt.c (convert_template_argument): Avoid missing folding of SCOPE_REFs. + +2009-12-10 Jakub Jelinek + + PR c++/42317 + * decl2.c (cp_write_global_declarations): Clear DECL_EXTERNAL + also on all other functions in the same comdat group. + * optimize.c (maybe_clone_body): Also optimize virtual implicit + dtors. For virtual comdat dtors tell cgraph that base and deleting + dtor are in the same comdat group. + +2009-12-04 Jason Merrill + + PR c++/42010 + * cp-tree.h (DECL_DISCRIMINATOR_SET_P): New. + * mangle.c (discriminator_for_local_entity): Check it. + + PR c++/42277 + * semantics.c (finish_decltype_type): Defer handling of decltype + of a non-dependent COMPONENT_REF in a template. + +2009-12-04 Dodji Seketeli + + PR c++/42218 + * cxx-pretty-print.c (pp_cxx_unqualified_id): Print only innermost + template arguments. + +2009-12-03 Jason Merrill + + PR c++/41611 + * decl2.c (get_guard): Don't use the same comdat group as the decl. + + PR c++/42266 + * cvt.c (convert_from_reference): Do nothing if TREE_TYPE is null. + +2009-12-03 Dodji Seketeli + + PR c++/42217 + * class.c (remove_zero_width_bit_fields): The width of the bit field is + in DECL_SIZE, not in DECL_INITIAL. + +2009-12-03 Jakub Jelinek + + PR c++/42256 + * optimize.c (maybe_clone_body): Call emit_associated_thunks + after expand_or_defer_fn_1. + +2009-12-02 Taras Glek + + * parser.c (cp_parser_class_specifier): Back out my previous change. + * semantics.c (begin_class_definition): Back out my previous change. + +2009-12-02 Paolo Bonzini + Shujing Zhao + + PR c++/29917 + * call.c (op_error): Accept a boolean to indicate no match/ambiguous + match, instead of a string. Callers adjusted. + + PR c++/34836 + * cp-tree.h (readonly_error_kind): New type. + (readonly_error): Adjust prototype with new argument. + * typeck2.c (readonly_error): Accept readonly_error_kind as argument + and add macro ERROR_FOR_ASSIGNMENT to emit diagnostics. + * semantics.c (finish_asm_stmt): Adjust readonly_error call. + * typeck.c (cp_build_unary_op, cp_build_modify_expr): Likewise. + + * decl.c (grokparms, grok_op_properties): Put the diagnostics in full + sentences for easy translation and wrap the diagnostics into G_() when + needed. + (create_array_type_for_decl): Likewise. + * pt.c (tsubst): Likewise. + * typeck2.c (cp_build_unary_op): Wrap diagnostic into _(). + * rtti.c (build_dynamic_cast_1): Likewise. + * Make-lang.in: Adjust. + +2009-12-02 Jakub Jelinek + + * g++spec.c (lang_specific_driver): Remove unused saw_verbose_flag + variable. + * pt.c (tsubst_pack_expansion): Remove unused first_arg_pack variable. + * init.c (build_vec_init): Remove unused size variable. + * typeck2.c (check_narrowing): Remove unused was_decl variable. + * decl.c (poplevel): Remove unused tmp and real_functionbody + variables. + (decls_match): Remove unused tree_name variable. + (start_decl): Remove unused type variable. + * parser.c (cp_parser_type_parameter): Remove unused parameter_list + variable. + (cp_parser_template_id, cp_parser_explicit_instantiation, + cp_parser_declarator): Remove unused token variable. + (cp_parser_simple_type_specifier): Remove unused id variable. + (cp_parser_parameter_declaration): Remove unused + greater_than_is_operator_p variable. + (cp_parser_check_declarator_template_parameters): Remove unused + member variable. + (c_parse_file): Remove unused error_occurred variable. + * cp-gimplify.c (cp_gimplify_init_expr): Remove unused slot variable. + * typeck.c (cp_build_function_call_vec): Remove unused name variable. + * class.c (resolve_address_of_overloaded_function): Remove unused + is_reference variable. + (build_rtti_vtbl_entries): Remove unused basetype variable. + * mangle.c (write_template_param): Remove unused parm_level and + parm_type variables. + +2009-12-01 Taras Glek + + * parser.c (cp_parser_class_specifier): Set class location to that + of IDENTIFIER_NODE instead of '{' when possible. + +2009-12-01 Taras Glek + + * semantics.c (begin_class_definition): Do not overide locations with less precise ones. + +2009-12-01 Jason Merrill + + PR c++/41611 + * decl2.c (get_guard): Copy DECL_COMDAT. + (comdat_linkage): Set DECL_COMDAT unconditionally. + +2009-12-01 Jakub Jelinek + + PR c++/3187 + * optimize.c (cdtor_comdat_group): New function. + (maybe_clone_body): Also optimize DECL_COMDAT base/complete cdtors + and in that case put also the deleting dtor in the same comdat group + as base and complete dtor if dtor is virtual. + +2009-11-30 Paolo Carlini + + PR c++/40371 + * call.c (add_template_candidate_real): Early return NULL if + the arglist length is smaller than skip_without_in_chrg; tidy. + +2009-11-30 Dodji Seketeli + + PR c++/42069 + * pt.c (convert_template_argument): Strip typedefs from SCOPE_REFs. + +2009-11-29 Dodji Seketeli + + PR c++/36408 + * semantics.c (empty_expr_stmt_p): Handle void_zero_node and fix + bad indentation. + * pt.c (tsubst_copy_and_build): Fix typo. + +2009-11-29 Jan Hubicka + + * optimize.c (maybe_clone_body): Emit thunks associated to alias. + * Make-lang.in (method.o): Add dependency on gimple.h. + * method.c: Include gimple.h + (make_alias_for_thunk): Use same body alias instead of assemble_alias. + (use_thunk): Drop codegen; use cgraph_add_thunk; gimplify + generic thunks. + * semantics.c (expand_or_defer_fn): Emit associated thunks. + +2009-11-28 Dodji Seketeli + + PR c++/36408 + * cp-tree.h (empty_expr_stmt_p): Declare ... + * semantics.c (empty_expr_stmt_p): ... this. + * pt.c (tsubst_copy_and_build) : Use it. + +2009-11-27 Paolo Carlini + + PR c++/38656 + * cxx-pretty-print.c (pp_cxx_expression): Handle TEMPLATE_ID_EXPR. + +2009-11-27 Paolo Carlini + + PR c++/35112 + * pt.c (print_overloaded_functions): New. + (print_candidates): Call the latter. + * parser.c (cp_parser_class_name): Do not duplicate the diagnostics + after the cp_parser_lookup_name call. + +2009-11-26 Jason Merrill + + PR c++/42026, DR 239 + * parser.c (cp_parser_postfix_expression): A local extern also + prevents arg-dependent lookup. + +2009-11-26 Gabriel Dos Reis + + * decl.c (grokdeclarator): Remove period at end of diagnosic message. + +2009-11-25 Jason Merrill + + PR c++/10690 + * rtti.c (get_tinfo_decl_dynamic): Call resolve_nondeduced_context. + +2009-11-24 Jason Merrill + + PR c++/42137 + * parser.c (cp_parser_mem_initializer_id): Pass typename_type to + cp_parser_class_name. + (cp_parser_unqualified_id): Same, rather than class_type. + + PR c++/11764 + * parser.c (cp_parser_expression_statement): Give helpful error + for constructor name used as type. + + * pt.c (determine_specialization): Give helpful error about missing + "template<>". + +2009-11-23 Jakub Jelinek + + PR middle-end/42095 + * tree.c: Include cgraph.h. + (cp_fix_function_decl_p): Don't return true for same_body aliases. + * Make-lang.in (cp/tree.o): Depend on $(CGRAPH_H). + +2009-11-23 Dodji Seketeli + + PR c++/14777 + * cp-tree.def : Declare new kind of tree + node. + * cp-tree.h (struct tree_template_info, + struct qualified_typedef_usage_s): New. + (cp_tree_node_structure_enum): add TS_CP_TEMPLATE_INFO. + (union lang_tree_node): Add template_info. + (TI_TEMPLATE, TI_ARGS, TI_TYPEDEFS_NEEDING_ACCESS_CHECKING): + Adjust. + (build_template_info): Declare. + (get_types_needing_access_check): Adjust return type. + (add_typedef_to_current_template_for_access_check): Declare. + * cp-objcp-common.c (cp_tree_size): Handle TEMPLATE_INFO. + * semantics.c (add_typedef_to_current_template_for_access_check): + Split from ... + (check_accessibility_of_qualified_id): ... here. + * decl.c (make_typename_type): Use it. + * pt.c (build_template_info): Define. + (check_explicit_specialization, find_parameter_packs_r, + push_template_decl_real, lookup_template_class, + for_each_template_parm_r, tsubst_decl, tsubst): Use + build_template_info. + (get_types_needing_access_check): Adjust return type. + (append_type_to_template_for_access_check_1): Record the + location of the usage point of the typedef. Adjust to TEMPLATE_INFO. + (append_type_to_template_for_access_check): Add new location + parameter. Pass it to append_type_to_template_for_access_check_1. + Adjust to TEMPLATE_INFO. + (perform_typedefs_access_check): Temporarily set input_location to + the usage point of the typedef we are checking access for. Adjust + to new TEMPLATE_INFO tree node. + * tree.c (bind_template_template_parm): Use build_template_info. + * call.c (add_template_candidate_real): Likewise. + * decl.c (grokfndecl): Likewise. + (cp_tree_node_structure): Handle TEMPLATE_INFO. + +2009-11-20 Jason Merrill + + PR c++/9050, DR 147, DR 318 + * parser.c (cp_parser_lookup_name): If the name matches the explicit + class scope, we're naming the constructor. + (cp_parser_constructor_declarator_p): Just use cp_parser_unqualified_id + if we have a nested-name-specifier. + (cp_parser_direct_declarator): Handle getting an overload set as a + constructor declarator. + (cp_parser_unqualified_id): Avoid looking up the constructor when + naming the destructor. + (cp_parser_diagnose_invalid_type_name): Give good + diagnostic for improper use of constructor as template. + * typeck.c (finish_class_member_access_expr): Give good diagnostic + about calling constructor. + + * error.c (dump_aggr_type): Don't print A::A for injected-class-name. + +2009-11-20 Simon Martin + + PR c++/38646 + * pt.c (process_partial_specialization): Do not turn wrongly located + parameter pack arguments into error_mark_node. + Split too long lines into two. + +2009-11-20 Paolo Carlini + + PR c++/42060 + * except.c (build_throw): Check the tree returned by + decay_conversion for error_mark_node. + +2009-11-20 Shujing Zhao + + PR c++/29017 + * cp-tree.h (composite_pointer_operation): New type. + (composite_pointer_type): Adjust prototype with new argument. + * typeck.c (composite_pointer_type): Accept + composite_pointer_operation as argument and emit diagnostic to be + visible to gettext and checked at compile time. + (composite_pointer_type_r): Likewise. + (common_pointer_type): Update call to composite_pointer_type. + (cp_build_binary_op): Likewise. + * call.c (build_conditional_expr): Likewise. + +2009-11-19 Jason Merrill + + PR c++/42115 + * call.c (build_op_delete_call): Don't complain about using + op delete (void *, size_t) for placement delete if there's an + op delete (void *). + + DR 176 permissiveness + * class.c (build_self_reference): Call set_underlying_type. + * decl.c (check_elaborated_type_specifier): Don't complain about + injected-class-name. + (type_is_deprecated): Use TYPE_MAIN_VARIANT. + * pt.c (convert_template_argument): Handle injected-class-name used + as template template argument. + * typeck2.c (abstract_virtuals_error): Use TYPE_MAIN_VARIANT. + + PR c++/561 + * decl.c (static_fn_type): Split out... + (revert_static_member_fn): ...from here. + * cp-tree.h: Declare it. + * class.c (resolve_address_of_overloaded_function): Use it to compare + pointers to member functions. + * typeck.c (build_static_cast_1): Call instantiate_type. + +2009-11-18 Shujing Zhao + + PR c++/40892 + * error.c (maybe_warn_cpp0x): Accept enum cpp0x_warn_str as argument. + (maybe_warn_variadic_templates): Update the maybe_warn_cpp0x calls to + match the new declaration. + * cp-tree.h (cpp0x_warn_str): New type. + (maybe_warn_cpp0x): Adjust prototype with new argument. + * call.c (reference_binding): Update the maybe_warn_cpp0x calls. + * decl.c (reshape_init_r, check_initializer, grokdeclarator): + Likewise. + * parser.c (cp_parser_primary_expression) + (cp_parser_parenthesized_expression_list, cp_parser_new_initializer) + (cp_parser_assignment_expression, cp_parser_condition) + (cp_parser_jump_statement, cp_parser_mem_initializer) + (cp_parser_simple_type_specifier, cp_parser_elaborated_type_specifier) + (cp_parser_enum_specifier, cp_parser_initializer) + (cp_parser_pure_specifier, cp_parser_functional_cast): Likewise. + +2009-11-18 Jakub Jelinek + + PR c++/3187 + * cp-tree.h (expand_or_defer_fn_1): New prototype. + * decl2.c (cp_write_global_declarations): Mark as !DECL_EXTERNAL + also all same_body aliases. + * semantics.c (expand_or_defer_fn): Move most of the function + except registering with cgraph to ... + (expand_or_defer_fn_1): ... here. New function. + * optimize.c: Include cgraph.h. + (maybe_clone_body): If in charge parm is not used and both base + and complete clones are created and are not comdat, tell cgraph + they have the same body. + * Make-lang.in (cp/optimize.o): Depend on $(CGRAPH_H). + +2009-11-17 Paolo Carlini + + PR c++/42058 + * typeck2.c (digest_init_r): Check init for error_operand_p. + * decl.c (reshape_init_class): Check return value of reshape_init_r + for error_mark_node. + +2009-11-17 Jakub Jelinek + + PR c++/42061 + * call.c (reference_binding): Return NULL for initializer list with + error operand inside of it. + + PR c++/42059 + * typeck.c (cp_build_modify_expr): For initializer list call + check_array_initializer to make sure lhs isn't a VLA. + +2009-11-16 Jason Merrill + + PR c++/189, c++/9937, c++/13950, DR 176 + * search.c (lookup_field_r): Allow lookup to find the + injected-class-name from a template base. + (template_self_reference_p): Remove. + * decl.c (make_typename_type): Diagnose ambiguity. Use + maybe_get_template_decl_from_type_decl. + * parser.c (cp_parser_template_name): Pass true to is_template + rather than use maybe_get_template_decl_from_type_decl. + (cp_parser_lookup_name): Use maybe_get_template_decl_from_type_decl. + * pt.c (maybe_get_template_decl_from_type_decl): Handle ambiguity. + Use DECL_SELF_REFERENCE_P. + + * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): + Avoid duplicate ambiguity error. + * error.c (dump_decl): Don't say "typedef" for injected-class-name. + * pt.c (convert_template_argument): Tweak logic. + +2009-11-16 Paolo Carlini + + PR c++/42055 + * pt.c (determine_specialization): Assign to candidates the return + value of the chainon called before print_candidates. + +2009-11-16 Paolo Carlini + + PR c++/32056 + * decl.h (enum decl_context): Add TPARM enumerator. + * decl.c (grokdeclarator): Per 14.1/2, error out if a storage class + is specified in a template parameter declaration. + * parser.c (cp_parser_template_parameter): Call grokdeclarator with + TPARM as third argument. + +2009-11-13 Jason Merrill + + PR c++/27425 + PR c++/34274 + * pt.c (expand_template_argument_pack): Handle null arg gracefully. + (convert_template_argument): Use %T for type. + + PR c++/29363 + * decl.c (create_implicit_typedef): Set TYPE_STUB_DECL here. + (cxx_init_decl_processing): Not here. + * name-lookup.c (pushtag): Or here. + * pt.c (lookup_template_class): Or here. + + PR c++/35075 + * pt.c (convert_nontype_argument): Give helpful error about + reference variable argument to reference template parameter. + + PR c++/21008, DR 515 + * semantics.c (finish_non_static_data_member): Don't check + derivation in a template. + + PR c++/11987 + * parser.c (cp_parser_direct_declarator): Give helpful error about + trying to define member of a dependent typedef. + * pt.c (resolve_typename_type): Don't resolve a typedef typename. + * tree.c (typedef_variant_p): New. + * cp-tree.h: Declare it. + +2009-11-12 Jason Merrill + + PR c++/27078 + * parser.c (cp_parser_primary_expression): Don't give a duplicate + ambiguity error. + + PR c++/39560 + * decl2.c (build_anon_union_vars): Set DECL_ARTIFICIAL. + + PR c++/37037 + * decl.c (grokdeclarator): Don't generate a void PARM_DECL. + + PR c++/42013 + * call.c (build_conditional_expr): Check specifically for folding + to CALL_EXPR rather than TREE_SIDE_EFFECTS. + + * typeck.c (cv_qualified_p): New fn. + (decay_conversion): Use it. + * cp-tree.h: Declare it. + * tree.c (rvalue): Use it and cv_unqualified. + * init.c (build_aggr_init): Likewise. + + PR c++/42013 + * call.c (build_conditional_expr): Don't fold a TREE_SIDE_EFFECTS + COND_EXPR in unevaluated context. + +2009-11-12 Jan Hubicka + + * decl2.c (constrain_visibility): Clear WEAK and COMMON flags. + +2009-11-11 Jason Merrill + + PR c++/39131 + * rtti.c (emit_support_tinfos): Add DFP types. + + * call.c (build_op_delete_call): Downgrade error about + placement/non-placement confusion to permerror. + +2009-11-10 Jason Merrill + + * call.c (build_op_delete_call): Tweak error. + + PR c++/34158 + PR c++/36406 + * call.c (non_placement_deallocation_fn_p): Split out... + (build_op_delete_call): ...from here. Use instantiate_type + for placement delete. Simplify logic. + * pt.c (primary_template_instantiation_p): Non-static. + * cp-tree.h: Declare it. + +2009-11-09 Jason Merrill + + PR c++/41972 + * parser.c (cp_parser_template_argument): Accept SCOPE_REF around + VAR_DECL. + + PR c++/41994 + * pt.c (tsubst_baselink): tsubst the name. + +2009-11-07 Jason Merrill + + PR c++/37920 + * pt.c (tsubst) [TYPEOF_TYPE]: Set cp_unevaluated_operand. + + PR c++/18451 + PR c++/40738 + * cp-tree.h (cp_decl_specifier_seq): Add any_type_specifiers_p. + * parser.c (cp_parser_single_declaration): Call + cp_parser_parse_and_diagnose_invalid_type_name here, too. + (cp_parser_parameter_declaration): And here. + (cp_parser_parse_and_diagnose_invalid_type_name): Be + less picky about declarator form. Don't skip to + the end of the block if we're in a declarator. + (cp_parser_decl_specifier_seq): Set any_type_specifiers_p. + (cp_parser_simple_declaration): Check it. + (cp_parser_member_declaration): Likewise. + (cp_parser_diagnose_invalid_type_name): Tweak error message. + (cp_parser_expression_statement): Likewise. + * decl2.c (grokfield): Mention decltype instead of typeof. + +2009-11-06 Jason Merrill + + PR c++/15946 + * parser.c (cp_parser_check_template_parameters): Don't talk about + specialization at function scope. + (cp_parser_diagnose_invalid_type_name): Handle dependent scope. + (cp_parser_parse_and_diagnose_invalid_type_name): Likewise. + (cp_parser_expression_statement): Suggest typename. + * error.c (dump_decl) [SCOPE_REF]: Print the type here. + (dump_expr) [SCOPE_REF]: Call it. + (dump_type) [UNBOUND_CLASS_TEMPLATE]: Check TFF_UNQUALIFIED_NAME. + * cxx-pretty-print.c (pp_cxx_unqualified_id): Print class template + args. + + PR c++/9381 + * decl2.c (build_memfn_type): Preserve attributes. + (cp_reconstruct_complex_type): Likewise. + (maybe_retrofit_in_chrg): Likewise. + * class.c (adjust_clone_args): Likewise. + * call.c (standard_conversion): Use build_memfn_type. + * pt.c (tsubst): Likewise. + * decl.c (build_ptrmem_type): Likewise + (check_function_type): Preserve attributes. + * tree.c (cp_build_type_attribute_variant): Propagate exception + specs on METHOD_TYPE, too. + (strip_typedefs): Preserve exception specs and attributes. + +2009-11-06 Andrew Pinski + + PR c++/41536 + * optimize.c (maybe_clone_body): Copy DECL_ATTRIBUTES and + DECL_DISREGARD_INLINE_LIMITS also. + +2009-11-06 Jakub Jelinek + + PR c++/41967 + * parser.c (cp_parser_omp_for_loop): After diagnosing not perfectly + nested loop and parsing statements, don't cp_parser_require }, instead + exit the loop if next token is CPP_EOF. + +2009-11-05 Jason Merrill + + PR c++/34180 + * method.c (do_build_copy_constructor): Don't drop cv-quals from + the field type. + + PR c++/7046 + * class.c (finish_struct): Store maximum_field_alignment in + TYPE_PRECISION. + * pt.c (instantiate_class_template): Set maximum_field_alignment. + + PR c++/34870 + * name-lookup.c (arg_assoc_class): Call complete_type. + * pt.c (instantiate_class_template): Call uses_template_parms + instead of dependent_type_p. + + PR c++/41703 + * pt.c (check_undeduced_parms): New subroutine of... + (more_specialized_fn): ...here. Undeduced template parms can make + a template less specialized than another. + +2009-11-04 Jason Merrill + + PR c++/39413 + * search.c (lookup_base): Don't complete_type (base). + + PR c++/35067 + * method.c (use_thunk): Check DECL_WEAK as well as + DECL_ONE_ONLY. + + PR c++/17365, DR 218 + * name-lookup.c (add_function): Ignore non-functions. + +2009-11-03 Jason Merrill + + PR c++/36959 + * decl2.c (cxx_callgraph_analyze_expr): Don't reference a function + just because a static variable in it is needed unless -frepo. + + PR c++/41876 + * parser.c (cp_parser_type_specifier_seq): Rename is_condition to + is_declaration. + (cp_parser_exception_declaration): Pass true. + (cp_parser_omp_for_loop): Likewise. + + PR c++/41927 + * typeck.c (build_x_binary_op): Don't do warn_parentheses + if we're in a SFINAE context. + + PR c++/41815 + * call.c (build_call_a): Strip cv-quals from rvalue result. + + PR c++/40944 + * call.c (initialize_reference): Add complain parm. + * typeck.c (convert_for_initialization): Pass it. + * decl.c (grok_reference_init): Likewise. + * cp-tree.h: Declare it. + + PR c++/40687 + * pt.c (do_auto_deduction): Diagnose inconsistent deduction. + +2009-11-02 Dodji Seketeli + + PR c++/37093 + * pt.c (check_valid_ptrmem_cst_expr): New function. + (convert_nontype_argument): Use it to output an error for + illegal pointer to member expressions used as template arguments. + +2009-11-02 Jason Merrill + + Restrict DR 757 change to C++0x mode. + * decl2.c (mark_used): Check cxx_dialect. + * decl.c (grokfndecl): Do check type linkage in C++98 mode. + (grokvardecl): Likewise. + * pt.c (check_instantiated_arg): Likewise. + +2009-11-02 Jakub Jelinek + + PR c++/41774 + * name-lookup.c (handle_namespace_attrs): Pass 1 as last argument to + push_visibility. + * parser.c (cp_parser_namespace_definition): Pass 1 as argument to + pop_visibility. + * rtti.c (push_abi_namespace): Pass 2 as last argument to + push_visibility. + (pop_abi_namespace): Pass 2 as argument to pop_visibility. + +2009-10-31 Jason Merrill + + * tree.c (cv_unqualified): New fn. + * cp-tree.h: Declare it. + * typeck.c (decay_conversion): Use it instead of TYPE_MAIN_VARIANT. + + * rtti.c (tinfo_name): Fix lengths for private case. + +2009-10-31 Jason Merrill + + PR c++/41754 + * call.c (compare_ics): Avoid bad union use when + comparing two ck_lists. + +2009-10-30 Jerry Quinn + + * mangle.c (mangle_type_string_for_rtti): Reapply 153734. + (needs_fake_anon): Likewise. + (write_name): Likewise. + (write_nested_name): Likewise. + * cp-tree.h (mangle_type_string_for_rtti): Likewise. + (get_anonymous_namespace): Likewise. + * name-lookup.c (get_anonymous_namespace_name): Likewise. + * rtti.c (tinfo_name): Likewise, with +1 in the second + build_string call fixed. + (tinfo_base_init): Likewise. + +2009-10-30 Jason Merrill + + Revert: + * decl.c (cp_fname_init): Correct build_string argument. + +2009-10-30 Jerry Quinn + + * mangle.c (mangle_type_string_for_rtti): Revert 153734. + (needs_fake_anon): Likewise. + (write_name): Likewise. + (write_nested_name): Likewise. + * cp-tree.h (mangle_type_string_for_rtti): Likewise. + (get_anonymous_namespace): Likewise. + * name-lookup.c (get_anonymous_namespace_name): Likewise. + * rtti.c (tinfo_name): Likewise. + (tinfo_base_init): Likewise. + +2009-10-30 Dodji Seketeli + + PR c++/41863 + * pt.c (iterative_hash_template_arg): articifial parms + don't have DECL_PARM_INDEX set. Do not hash it. + +2009-10-28 Jerry Quinn + + * mangle.c (mangle_type_string_for_rtti): Revert r149964. + (needs_fake_anon): Likewise. + (write_name): Likewise. + (write_nested_name): Likewise. + * cp-tree.h (mangle_type_string_for_rtti): Likewise. + (get_anonymous_namespace): Likewise. + * name-lookup.c (get_anonymous_namespace_name): Likewise. + * rtti.c (tinfo_name): Insert '*' in front of private names. + (tinfo_base_init): Use it. + +2009-10-28 Jason Merrill + + Core issue 812, 861 + * name-lookup.c (set_decl_namespace): Deal properly with inline + namespaces. + (qualified_lookup_using_namespace): Overhaul. + * pt.c (print_candidates): Handle getting an OVERLOAD. + +2009-10-28 Jason Merrill + + * decl.c (cp_fname_init): Correct build_string argument. + +2009-10-27 Jason Merrill + + Allow no-capture lambdas to convert to function pointer. + * semantics.c (maybe_add_lambda_conv_op): New. + * parser.c (cp_parser_lambda_expression): Call it. + (cp_parser_lambda_declarator_opt): Make op() static if + no captures. + * mangle.c (write_closure_type_name): Adjust. + * semantics.c (finish_this_expr): Adjust. + * decl.c (grok_op_properties): Allow it. + * call.c (build_user_type_conversion_1): Handle static conversion op. + (build_op_call): And op(). + +2009-10-26 Jakub Jelinek + + PR debug/41828 + * cp-lang.c (cxx_dwarf_name): Return NULL instead of + for anonymous aggregate names. + +2009-10-26 Jason Merrill + + PR c++/38796, Core issue 906 + * cp-tree.h (DECL_DEFAULTED_OUTSIDE_CLASS_P): New. + (DECL_DEFAULTED_IN_CLASS_P): New. + * class.c (user_provided_p): Non-static. + (check_methods): Use it. + (check_bases_and_members): Check defaulted fns. + (defaultable_fn_p): Move and rename to... + * method.c (defaultable_fn_check): ...this. + (defaulted_late_check): New. + * pt.c (tsubst_decl): Call it. + * decl2.c (grokfield): Adjust. + * decl.c (cp_finish_decl): Adjust. + (grok_special_member_properties): Use user_provided_p. + +2009-10-26 Dodji Seketeli + + PR c++/41785 + * pt.c (template_args_equal): Handle comparison of + an ARGUMENT_PACK_SELECT node with the arguments node it selects into. + * cp-tree.def: Fix a typo in the description of TYPE_PACK_EXPANSION. + +2009-10-26 Dodji Seketeli + + PR c++/41020 + * decl.c (decls_match): Use DECL_IS_BUILTIN instead of + DECL_BUILT_IN. + +2009-10-23 Dodji Seketeli + + PR c++/40808 + * mangle.c (write_template_args): Allow mangling of empty template + argument list. Updated function comments. + +2009-10-23 Jason Merrill + + * semantics.c (lambda_expr_this_capture): Use thisify_lambda_field. + + * semantics.c (outer_lambda_capture_p): New fn. + (thisify_lambda_field): Factor out... + (add_default_capture): ...from here. + (finish_id_expression): Use them. + + Core issue 899 + * call.c (add_function_candidate): Only permit explicit conversion + ops if copy ctor was called with a single argument. + + * call.c (initialize_reference): Tweak error message. + +2009-10-21 Jakub Jelinek + + * mangle.c (finish_mangling_get_identifier): Use + obstack_base (mangle_obstack) instead of name_base. + +2009-10-19 Jakub Jelinek + + * parser.c (cp_lexer_print_token, cp_parser_is_string_literal, + cp_parser_string_literal, cp_parser_primary_expression): Likewise. + (cp_lexer_get_preprocessor_token): Use C_LEX_STRING_JOIN instead + of C_LEX_RAW_STRINGS. + +2009-10-15 Jason Merrill + + PR c++/38888 + * error.c (dump_template_bindings): Wrap argument packs in {}. + + PR c++/38798 + * parser.c (CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS): New. + (cp_parser_type_specifier): Don't try to parse a class-specifier + or enum-specifier in that case. + (cp_parser_trailing_type_id): New. + (cp_parser_late_return_type_opt): Call it. + (cp_parser_type_id_1): Add is_trailing_return parm. + (cp_parser_type_specifier_seq): Likewise. + +2009-10-14 Jason Merrill + + PR c++/39866 + * call.c (print_z_candidates): Don't print deleted candidates. + (print_z_candidate): Note deleted candidates. + +2009-10-14 Larry Evans + + PR c++/40092 + * tree.c (cp_tree_equal): Add test for TEMPLATE_PARM_PARAMETER_PACK + equality. + +2009-10-12 Jason Merrill + + PR c++/37875 + * parser.c (cp_parser_decltype): Set greater_than_is_operator_p. + + PR c++/37766 + * pt.c (type_unification_real): Call convert_template_argument + for function default template arguments. + (check_default_tmpl_args): Suggest -std=c++0x when function default + template args seen in C++98 mode. + +2009-10-11 Jason Merrill + + PR c++/37204 + * typeck.c (build_reinterpret_cast_1): Handle rvalue refs + properly. + +2009-10-11 Richard Guenther + + * tree.c (cp_free_lang_data): Drop anonymous aggregate names. + +2009-10-08 Jason Merrill + + PR c++/36816 + * pt.c (maybe_adjust_types_for_deduction): Do rvalue ref adjustment + even when DEDUCE_EXACT. + + PR c++/37177 + * pt.c (resolve_nondeduced_context): New. + * cvt.c (convert_to_void): Call it. + * semantics.c (finish_decltype_type): Likewise. + * typeck.c (decay_conversion): Here too. + * pt.c (tsubst_decl): Don't clobber input_location. + Don't register a bad specialization. + +2009-10-07 Gabriel Dos Reis + + * cp-tree.h: Fix location of documentation for DECL_LANG_FLAG_7. + +2009-10-07 Jason Merrill + + PR c++/39863 + * pt.c (tsubst_pack_expansion): Don't do anything now if we + have incomplete packs of different lengths. + + PR c++/41038 + * tree.c (build_qualified_name): Call convert_from_reference. + +2009-10-06 Jason Merrill + + Fix lookup of initialized captures in unevaluated context. + * cp-tree.h (DECL_NORMAL_CAPTURE_P): New. + * name-lookup.c (qualify_lookup): Check it. + * parser.c (cp_parser_lambda_introducer): Pass explicit_init_p + to add_capture. + * semantics.c (add_capture): Set DECL_NORMAL_CAPTURE_P + on captures without explicit init. + (add_default_capture): Pass explicit_init_p. + + Fix capture by copy of types with explicit copy constructor. + * cp-tree.h (TARGET_EXPR_DIRECT_INIT_P): New. + (DIRECT_INIT_EXPR_P): New. + * typeck.c (convert_for_initialization): Just return if + DIRECT_INIT_EXPR_P. + * semantics.c (build_lambda_object): Use + TARGET_EXPR_DIRECT_INIT_P for normal captures. + +2009-10-05 Jason Merrill + + * parser.c: Mark lambda_scope and lambda_count for PCH. + +2009-10-03 Jason Merrill + + PR c++/41553 + * parser.c (cp_parser_lambda_introducer): Avoid infinite loop on + parse error. + +2009-10-02 Jason Merrill + + * mangle.c (write_unnamed_type_name): Implement. + (local_class_index): Split out from... + (discriminator_for_local_entity): ...here. + (nested_anon_class_index): New. + * cp-tree.h (TYPE_FUNCTION_SCOPE_P): New. + +2009-10-02 Janis Johnson + + * call.c (convert_arg_to_ellipsis): Avoid promoting decimal32 + to double. + +2009-10-01 Jason Merrill + + * parser.c (cp_parser_lambda_expression): Compute visibility. + (no_linkage_lambda_type_p): Remove. + * cp-tree.h: Remove declaration. + * tree.c (no_linkage_check): Don't call it. Don't check template + args. Don't check TREE_PUBLIC Types. + +2009-10-01 Gabriel Dos Reis + Jason Merrill + + * decl.c (grokdeclarator): Set constexprness before announcing + friendship. + +2009-10-01 Gabriel Dos Reis + + * decl.c (record_builtin_java_type): Undo unintended change. + (cxx_init_decl_processing): Likewise. + +2009-10-01 Jason Merrill + + * pt.c (register_specialization): Push DECL_SOURCE_LOCATION to the + clones. + + * decl.c (grok_special_member_properties): Only adjust + TYPE_HAS_COMPLEX_* if the function is defaulted in the class body. + (cp_finish_decl): Push DECL_DELETED_FN/DECL_DEFAULTED_FN to the + clones. + +2009-09-30 Gabriel Dos Reis + + * decl.c (check_for_uninitialized_const_var): Check constexpr + variables too. + (grokdeclarator): Handle `constexpr'. + (check_tag_decl): Reject `constexpr'. + (check_function_type): Check constexpr functions. + * cp-tree.h (ds_constexpr): New cp_decl_spec enumerator. + (CLASSTYPE_LITERAL_P): New. + (lang_type_class::is_literal): New. + (lang_type_class::dummy): Adjust width. + (literal_type_p): Declare. + * parser.c (cp_parser_check_decl_spec): Print it. + (cp_parser_decl_specifier_seq): Accept "constexpr". + * semantics.c (validate_constexpr_fundecl): Define. + (literal_type_p): Define. + +2009-09-30 Jason Merrill + + * semantics.c (lambda_expr_this_capture): Fix default capture + of explicit capture of 'this'. + +2009-09-30 Jason Merrill + + * parser.c (cp_parser_lambda_expression): Don't add __ to __this. + +2009-09-30 Jason Merrill + + * cp-tree.h (LANG_DECL_U2_CHECK): Check LANG_DECL_HAS_MIN. + +2009-09-29 John Freeman + Jason Merrill + + Add support for lambda-expressions as per N2927. + * cp-tree.def (VEC_INIT_EXPR, LAMBDA_EXPR): New. + * cp-tree.h (LAMBDA_TYPE_P, LAMBDA_FUNCTION_P): New. + (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE): New. + (LAMBDA_EXPR_DEFAULT_CAPTURE_LIST): New. + (LAMBDA_EXPR_THIS_CAPTURE, LAMBDA_EXPR_CAPTURES_THIS_P): New. + (LAMBDA_EXPR_MUTABLE_P, LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P): New. + (LAMBDA_EXPR_RETURN_TYPE, LAMBDA_EXPR_LOCATION): New. + (LAMBDA_EXPR_EXTRA_SCOPE, LAMBDA_EXPR_DISCRIMINATOR): New. + (struct tree_lambda_expr): New. + (union lang_tree_node): Add lambda_expression. + (struct lang_type_class): Add lazy_move_ctor flag, lambda_expr field. + (CLASSTYPE_LAZY_MOVE_CTOR, CLASSTYPE_LAMBDA_EXPR): New. + (LAMBDA_TYPE_EXTRA_SCOPE, VEC_INIT_EXPR_SLOT): New. + (VEC_INIT_EXPR_INIT, DECLTYPE_FOR_LAMBDA_CAPTURE): New. + (DECLTYPE_FOR_LAMBDA_RETURN): New. + (enum special_function_kind): Add sfk_move_constructor. + (LAMBDANAME_PREFIX, LAMBDANAME_FORMAT, LAMBDANAME_P): New. + * parser.c (cp_parser_lambda_expression, cp_parser_lambda_introducer) + (cp_parser_lambda_declarator_opt, cp_parser_lambda_body): New. + (start_lambda_scope, record_lambda_scope, finish_lambda_scope): New. + (no_linkage_lambda_type_p): New. + (cp_parser_primary_expression): Recognize lambda expression. + (cp_parser_init_declarator): Note lambda scope. + (cp_parser_function_definition_after_declarator): Likewise. + (cp_parser_late_parsing_default_args): Likewise. + (cp_parser_skip_to_closing_parenthesis): Skip to end of lambda capture + lists, too. + (cp_parser_parameter_declaration): Don't defer lambda default args. + * semantics.c (finish_non_static_data_member, finish_id_expression): + Handle default capture for lambda expressions. + (finish_this_expr): Handle 'this' keyword inside of lambda expressions. + (outer_automatic_var_p): New. + (finish_decltype_type): Handle decltypes within lambda expressions. + (classtype_has_nothrow_assign_or_copy_p): Synthesized move constructor. + (build_lambda_expr, build_lambda_object, begin_lambda_type) + (lambda_return_type, lambda_capture_field_type, apply_lambda_return_type) + (capture_decltype, add_capture, add_default_capture) + (lambda_expr_this_capture): New. + * mangle.c (write_unnamed_type_name): New. Incomplete. + (write_closure_type_name): New. + (write_unqualified_name): Recognize unnamed, closure types. + (write_type): Do not write decltypes from lambda expressions. + (decl_mangling_context): New. + (write_name): Use it. Handle PARM_DECL scope. + (write_prefix): Likewise. Handle VAR_DECL/FIELD_DECL scope. + (write_compact_number): Factor out from... + (write_expression, write_template_param): ...here. + (discriminator_for_local_entity): Recognize lambdas. + (write_local_name): Handle PARM_DECL scope. + * typeck.c (structural_comptypes): Compare decltypes from lambda + expressions. + (check_return_expr): Deduce lambda return type from multiple return + statements. + * class.c (add_implicitly_declared_members): Add lazy move constructor + for lambda types. + (check_bases_and_members): Delete default constructor and assignment + operator for lambda types. + (maybe_note_name_used_in_class): Do not confuse lambda expression with + defining a class. + * decl.c (reshape_init_r): Array copy. + (grokfndecl): Synthesized move constructor. + (cp_tree_node_structure): Lambda expression. + * method.c (use_thunk): Synthesized move constructor. + (do_build_copy_constructor): Likewise. + (locate_copy): Likewise. + (implicitly_declare_fn): Likewise. + * cp-objcp-common.c (cp_tree_size): Handle LAMBDA_EXPR. + * error.c (dump_aggr_type): Recognize lambda type. + (dump_function_decl): Recognize lambda function. + (function_category): Likewise. + (dump_function_name): Hide lambda name. + * tree.c (build_array_copy, move): New. + (special_function_p): Synthesized move constructor. + (no_linkage_check): Handle lambdas. + * search.c (lookup_fnfields_1): Synthesized move constructor. + * cp-gimplify.c (cp_gimplify_init_expr, cp_gimplify_expr): + Handle VEC_INIT_EXPR. + * typeck2.c (digest_init_r): Array copy. + * pt.c (get_template_info): Don't touch typedefs. + (instantiate_decl): Don't resubstitute artificial decls. + (tsubst_decl, tsubst, tsubst_copy_and_build): Handle lambdas. + (lookup_template_class): Don't fall back on name lookup. + * name-lookup.c (make_lambda_name): New. + (pushdecl_class_level): Handle default capture for lambda expressions. + (qualify_lookup): Handle decltypes within lambda expressions. + (pushtag): Handle ts_within_enclosing_non_class in function scope. + +2009-09-28 Janis Johnson + + * mangle.c (write_builtin_type): Support decimal float types. + +2009-09-28 Richard Henderson + + * cp-objcp-common.h (LANG_HOOKS_EH_USE_CXA_END_CLEANUP): New. + +2009-09-24 Jakub Jelinek + + * method.c (make_thunk, make_alias_for): Don't set + DECL_NO_STATIC_CHAIN. + * decl.c (builtin_function_1, grokfndecl): Likewise. + * lex.c (build_lang_decl): Likewise. + +2009-09-23 Dodji Seketeli + + PR debug/41065 + * decl.c (cp_finish_decl): Record the types used by the global + variable declaration we've just parsed. + +2009-09-22 Dodji Seketeli + + * cp-lang.c (LANG_HOOKS_FUNCTION_PARAMETER_PACK_P, + LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P, + LANG_HOOKS_GET_GENERIC_FUNCTION_DECL): Initialize these + hooks for the c++ FE. + * cp-tree.h (function_parameter_pack_p, get_function_template_decl, + function_parameter_expanded_from_pack_p): Declare ... + * pt.c (function_parameter_pack_p, get_function_template_decl, + function_parameter_expanded_from_pack_p): ... new hooks. + (get_template_info): Make this more robust. + (template_args_variadic_p, make_ith_pack_parameter_name): Add a new + line between comment and function. + (get_template_argument_pack_elems): Fix comment. + (tsubst_decl): Arguments of function parameter packs are not + parameter packs themselves. + +2009-09-21 Jason Merrill + + PR c++/41421 + * tree.c (trivial_type_p): Fix logic. + +2009-09-21 Jason Merrill + + * name-lookup.c (push_class_level_binding): Sanity check. + +2009-09-18 Jason Merrill + + * decl2.c (determine_visibility): Make anonymous types internal. + (mark_used): Complain about types without linkage used in + decls with internal linkage. + (vague_linkage_fn_p): Split out from... + * decl.c (maybe_commonize_var): ...here. + (grokdeclarator): Adjust linkage when a typedef gives linkage name. + * tree.c (no_linkage_check): Check the enclosing class and template + arguments. + + * cp-tree.h (TYPE_NAMESPACE_SCOPE_P): New. + + * pt.c (get_pattern_parm): New. + (listify): Split out from... + (listify_autos): ...here. + (unify): Deduce std::initializer_list for T. + * call.c (build_over_call): Warn about it. + +2009-09-17 Andrew Pinski + + PR c++/39365 + * typeck.c (cp_build_unary_op): Check TREE_CODE for bools instead of + using same_type_p. + (convert_for_assignment): Likewise. + * cvt.c (type_promotes_to): Likewise. + +2009-09-14 Richard Henderson + Jakub Jelinek + + * cp-tree.h (finish_asm_stmt): Update decl. + * parser.c (cp_parser_asm_definition): Parse asm goto. + (cp_parser_asm_label_list): New. + * pt.c (tsubst_copy_asm_operands): Don't recurse on labels. + (tsubst_expr): Handle asm labels. + * semantics.c (finish_asm_stmt): Add and use labels parameter. + +2009-09-14 Richard Henderson + + * except.c (init_exception_processing): Don't call + default_init_unwind_resume_libfunc. + (cp_protect_cleanup_actions): Return the decl to call. + (build_exc_ptr): Use __builtin_eh_pointer. + * optimize.c (clone_body): Set eh_lp_nr, not eh_region. + +2009-09-13 Richard Guenther + Rafael Avila de Espindola + + * except.c (init_exception_processing): Do not set + lang_eh_runtime_type. + (choose_personality_routine): Do not set eh_personality_decl, + set pragma_java_exceptions. + * cp-lang.c (LANG_HOOKS_EH_RUNTIME_TYPE): Define. + (LANG_HOOKS_EH_PERSONALITY): Likewise. + (cp_eh_personality_decl): New. + (cp_eh_personality): Likewise. + * Make-lang.in (cp-lang.o): Add $(EXPR_H) and $(EXCEPT_H) + dependencies. + +2009-09-13 Wei Guozhi + + PR c++/3187 + * cp/optimize.c (build_delete_destructor_body): New function. + (maybe_clone_body): Call build_delete_destructor_body for + deleting destructor. + +2009-09-10 Jason Merrill + + * repo.c (extract_string, get_base_filename, init_repo): constify. + +2009-09-09 Jason Merrill + + * error.c (find_typenames_r): Also add decltypes. + +2009-09-09 Paolo Carlini + + PR c++/28293 + * decl2.c (grokfield): Check for explicit template argument lists. + +2009-09-09 Jack Howarth + + PR bootstrap/41180 + * Make-lang.in: Remove redundant code from linkage for darwin10. + +2009-09-08 Paolo Carlini + + PR c++/39923 + * decl.c (build_init_list_var_init): Check return value of + perform_implicit_conversion. + +2009-09-08 Jason Merrill + + * class.c (currently_open_class): Make sure we're dealing with the + main variant. + + * cp-tree.h (enum overload_flags): Remove OP_FLAG. + * method.c (lazily_declare_fn): Check for dtorness in ABI warning. + + * name-lookup.c (is_class_level): Remove. + (push_binding_level, leave_scope, resume_scope): Adjust. + (pushlevel_class): Adjust. + (poplevel_class): Make sure we're on class_binding_level. + + * decl.c (grokmethod): Rename from start_method. + (finish_method): Remove. + * cp-tree.h: Adjust. + * parser.c (cp_parser_save_member_function_body): Adjust. + +2009-09-03 Doug Kwan + + * tree.c (cp_fix_function_decl_p): New. + (cp_free_lang_data): New. + +2009-09-03 Diego Novillo + + * Make-lang.in (decl2.o): Add dependency on $(POINTER_SET_H). + * decl2.c: Include pointer-set.h. + (collect_candidates_for_java_method_aliases): New. + (cp_write_global_declarations): Call it. + Add local variable CANDIDATES. If set, call + build_java_method_aliases. + (build_java_method_aliases): Add argument CANDIDATES. + Use it to determine if FNDECL should get a hidden alias. + * cp-objcp-common.h (LANG_HOOKS_FREE_LANG_DATA): Define. + * cp-tree.h (cp_free_lang_data): Declare. + +2009-09-03 Richard Guenther + + * method.c (use_thunk): Use cgraph_finalize_function to hand + off thunks to the cgraph. + * semantics.c (emit_associated_thunks): Do not emit thunks + for really extern functions. + +2009-09-03 Diego Novillo + + * cp-lang.c (lang_hooks): Remove const qualifier. + +2009-09-02 Jason Merrill + + * semantics.c (describable_type): Don't pretend to be in a template. + + * ptree.c (cxx_print_type) [DECLTYPE_TYPE]: Print the expression. + +2009-09-01 Alexandre Oliva + + * cp-tree.h (TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS): New. + * cp-lang.c (cxx_dwarf_name): Pass it. + * error.c (count_non_default_template_args): Take flags as + argument. Adjust all callers. Skip counting of default + arguments if the new flag is given. + +2009-09-01 Dodji Seketeli + + PR bootstrap/41205 + * pt.c (make_ith_pack_parameter_name): Don't use strnlen that is a + GNU extension. + +2009-09-01 Richard Guenther + + * cp-objcp-common.c (cp_expr_size): Use tree_expr_size. + * cp-objcp-common.h (LANG_HOOKS_EXPR_SIZE): Do not define. + +2009-09-01 Richard Guenther + + * cp-objcp-common.h (LANG_HOOKS_MARK_ADDRESSABLE): Remove. + +2009-08-31 Dodji Seketeli + + PR debug/30161 + * cp-tree.h (get_template_info): Parameter should be const. + (CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P): Fix typo. + (get_template_argument_pack_elems, + get_primary_template_innermost_parameters, + get_template_innermost_arguments, template_template_parameter_p): + Declare ... + * pt.c (get_template_argument_pack_elems, + get_template_innermost_parameters, get_template_innermost_arguments, + template_template_parameter_p): + ... New C++ front end implementation of new language hooks. + (primary_template_instantiation_p): New private helper. + (make_ith_pack_parameter_name): Use snprintf and strnlen instead of + printf and strlen. + (get_template_info): Const-ify parameter. + * cp-lang.c (LANG_HOOKS_GET_INNERMOST_GENERIC_PARMS, + LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS, + LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS, + LANG_HOOKS_GENERIC_TYPE_PARAMETER_DECL_P): Initialize these + interfaces for the C++ front-end. + +2009-08-31 Jason Merrill + + PR c++/41127 + * parser.c (cp_parser_enum_specifier): Make sure the : is followed by a + type-specifier-seq before we commit. + +2009-08-28 Richard Guenther + + PR lto/41058 + * cp-gimplify.c (cp_genericize_r): Do not leak zero-sized stores + into the generic IL. + +2009-08-27 Richard Guenther + + * class.c (build_vtbl_ref_1): Remove excess vertical space. + * Make-lang.in (CXX_TREE_H): Remove c-common.def dependency + tracked by $(TREE_H). + * semantics.c (expand_or_defer_fn): Zero DECL_SAVED_TREE. + +2009-08-26 Jason Merrill + + * call.c (build_builtin_candidate): Don't set LOOKUP_ONLYCONVERTING + if we're contextually converting to bool. + (build_conditional_expr): Likewise. + * typeck.c (condition_conversion): Likewise. + + * call.c (build_conditional_expr): Fix logic errors. + (build_new_op): Remove dead COND_EXPR handling. + +2009-08-24 Jason Merrill + + * cp-tree.h (DECL_DEFERRED_FN): Remove. + (struct lang_decl_fn): Remove deferred flag. + * class.c (build_clone): Don't set it. + * decl2.c (note_vague_linkage_fn): Don't check or set it. + (mark_used): Don't check it. + * method.c (make_thunk, make_alias_for): Don't set it. + + * decl2.c (mark_used): Streamline logic. + + PR c++/41109 + PR c++/41110 + PR c++/41134 + * cp-tree.h (DECL_ODR_USED): New macro. + (struct lang_decl_base): Add odr_used flag. + * decl.c (duplicate_decls): Propagate it. Use it for error. + * pt.c (register_specialization): Use it for error. + * decl2.c (mark_used): Use it as gating flag rather than TREE_USED. + (cp_write_global_declarations): Use it for error. + (tree_used_ok): Remove. + * cp-tree.h: Remove tree_used_ok. + * call.c (build_call_a): Don't call it. + * init.c (build_offset_ref): Likewise. + +2009-08-21 Jakub Jelinek + + PR c++/41131 + * tree.c (lvalue_p_1) : Return clk_none if + not TREE_STATIC. + +2009-08-19 Jason Merrill + + PR c++/41119 + PR c++/41120 + * decl2.c (mark_used): Increment function_depth during synthesis. + * parser.c (cp_parser_default_argument): Not here. + +2009-08-19 Jakub Jelinek + + * method.c (use_thunk): Call free_after_compilation after + assemble_end_function. + +2009-08-17 Richard Guenther + + * decl.c (build_ptrmemfunc_type): Keep variant chain intact. + Avoid useless copy. + (finish_enum): Keep variant chain intact. + * tree.c (cp_build_reference_type): Likewise. + +2009-08-16 Jason Merrill + + Make TREE_USED match the [basic.def.odr] concept for FUNCTION_DECL + and VAR_DECL, so mark_used only has effect the first time. + * decl2.c (mark_used): Just return if TREE_USED is already set. + Don't set TREE_USED if cp_unevaluated_operand is set. + (tree_used_ok): New fn. + * init.c (build_offset_ref): Check it instead of TREE_USED. + * call.c (build_call_a): Likewise. + * cp-tree.h: Declare it. + (DECL_NO_LINKAGE_CHECKED): No longer needed. + (struct lang_decl_base): Remove no_linkage_checked bitfield. + + * decl2.c (finish_static_data_member_decl): Don't set TREE_USED. + + * decl2.c (mark_used): It's ok to synthesize for default args now. + +2009-08-10 Jason Merrill + + Implement DR 757: It's OK for a decl to use a type without linkage + so long as the decl is defined in the current translation unit. + * decl2.c (no_linkage_decls): New vector. + (mark_used): Add decls that use types with no linkage. + (cp_write_global_declarations): Check that they are defined. + (decl_defined_p, no_linkage_error): New fns. + * cp-tree.h (DECL_NO_LINKAGE_CHECKED): New macro. + (struct lang_decl_base): Add flag. + * decl.c (grokfndecl): Don't check type linkage. + (grokvardecl): If the type has no linkage, just make sure + DECL_LANG_SPECIFIC is set. + * pt.c (check_instantiated_arg): Don't check type linkage. + * name-lookup.c (is_local_extern): New fn. + * name-lookup.h: Declare it. + +2009-08-05 Jason Merrill + + PR c++/40948 + * init.c (build_vec_init): Evaluate the initializer before + starting the initialization try block. + +2009-08-05 Manuel LĂłpez-Ibåñez + + PR c++/36069 + * typeck.c (convert_for_assignment): Do not warn for any boolean + variant. Use explicit location. + +2009-08-04 Dodji Seketeli + + PR c++/39987 + * pt.c (tsubst_default_argument): Let access checks of the + default argument happen in the context of the current function. + +2009-08-04 Manuel LĂłpez-Ibåñez + + PR c++/16696 + * call.c (build_new_op): Only try prefix operator if -fpermissive, + otherwise just error. + +2009-08-04 Dodji Seketeli + + PR debug/39706 + * error.c (lang_decl_name): Print qualified names for decls + in namespace scope. + +2009-08-03 Jason Merrill + Jakub Jelinek + + PR c++/40948 + * init.c (build_vec_init): Look through a TARGET_EXPR around a + CONSTRUCTOR. + +2009-07-31 Jason Merrill + Douglas Gregor + + Remove implicit binding of lvalues to rvalue references (N2831) + * call.c (convert_class_to_reference): Binding an lvalue to an + rvalue reference is bad. If the user-defined conversion is bad, + set bad_p before merging conversions. + (maybe_handle_ref_bind): Don't push down bad_p. + (reference_binding): Binding an lvalue to an rvalue reference is bad. + (convert_like_real): Give a helpful error about binding lvalue + to rvalue reference. + (reference_related_p): No longer static. + * typeck.c (build_typed_address): New. + (build_static_cast_1): Add static_cast from lvalue to &&. + * cp-tree.h: Adjust. + +2009-07-31 Jason Merrill + + * call.c (reference_binding): Rename lvalue_p to is_lvalue. + Do direct binding of "rvalues" in memory to rvalue references. + * tree.c (lvalue_p_1): Can't be both non-addressable lvalue and + "rvalue" in memory. + * typeck.c (build_static_cast_1): Do direct binding of memory + "rvalues" to rvalue references. + * cvt.c (cp_fold_convert): New. + * cp-tree.h: Declare it. + +2009-07-31 Jason Merrill + + * typeck.c (build_address): Do fold away ADDR_EXPR of INDIRECT_REF. + * tree.c (rvalue): Use cp_build_qualified_type, not TYPE_MAIN_VARIANT. + +2009-07-29 Jason Merrill + + PR c++/14912 + * cp-tree.h (enum tsubst_flags): Add tf_no_class_instantiations. + * error.c (count_non_default_template_args): Pass it. + * pt.c (tsubst) [TYPENAME_TYPE]: Don't complete type if it's set. + +2009-07-29 Richard Guenther + + PR c++/40834 + * cp-gimplify.c (cp_genericize_r): Properly walk the BIND_EXPR + vars. + +2009-07-26 Simon Martin + + PR c++/40749 + * decl.c (grokdeclarator): Do not set TREE_NO_WARNING for functions + with a qualified return type. + +2009-07-24 Jason Merrill + + Core issue 901 + * call.c (build_op_delete_call): If this is for a new-expression + and the op delete is deleted, do nothing. + + Core issue 702 + * call.c (compare_ics): Give list-initialization of std::init_list + priority over conversion to scalar, too. + +2009-07-22 Jason Merrill + + * mangle.c (mangle_type_string_for_rtti): Rename to be clearer. + (needs_fake_anon): New. + (write_name): Check it. + (write_nested_name): Add a fake anonymous namespace scope if true. + * name-lookup.c (get_anonymous_namespace_name): No longer static. + * rtti.c, cp-tree.h: Adjust. + +2009-07-22 Richard Guenther + + PR c++/40799 + * cp-gimplify.c (cp_gimplify_expr): Move handling of using + related exprs to ... + (cp_genericize_r): ... genericization stage. + (cp_genericize): Adjust. + +2009-07-21 Jason Merrill + + Core issue 934 + * call.c (reference_binding): Implement binding to { }. + (initialize_reference): Binding temporary to non-const && is fine. + * decl.c (grok_reference_init): Remove error for CONSTRUCTOR. + + * decl.c (reshape_init_r): { T } is not an aggregate initializer + for class T. + +2009-07-17 Richard Guenther + + PR c/40401 + * decl.c (finish_function): Do not emit unused result warnings + from here. + * cp-objcp-common.h (LANG_HOOKS_POST_GIMPLIFY_PASS): Use + c_warn_unused_result_pass. + * semantics.c (expand_or_defer_fn): Adjust assertion about IL status. + * optimize.c (clone_body): Clone in GENERIC. + (maybe_clone_body): Do not clear DECL_SAVED_TREE. + * decl2.c (cp_write_global_declarations): Fix body test. + Do not call cgraph_optimize. + * Make-lang.in (optimize.o): Add tree-iterator.h dependency. + * method.c (use_thunk): Register thunk with + cgraph_finalize_function. + * error.c (function_category): Guard access of DECL_LANG_SPECIFIC. + +2009-07-17 Richard Guenther + + * init.c (build_vec_delete_1): Do not set DECL_REGISTER on the + temporary pointer. + +2009-07-17 Aldy Hernandez + Manuel LĂłpez-Ibåñez + + PR 40435 + * typeck.c, init.c, class.c, method.c, rtti.c, except.c, error.c, + tree.c, cp-gimplify.c, cxx-pretty-print.c, pt.c, semantics.c, + call.c, cvt.c, mangle.c: Add location argument to + fold_{unary,binary,ternary}, fold_build[123], build_call_expr, + build_size_arg, build_fold_addr_expr, build_call_array, + non_lvalue, size_diffop, fold_build1_initializer, + fold_build2_initializer, fold_build3_initializer, + fold_build_call_array, fold_build_call_array_initializer, + fold_single_bit_test, omit_one_operand, omit_two_operands, + invert_truthvalue, fold_truth_not_expr, build_fold_indirect_ref, + fold_indirect_ref, combine_comparisons, fold_builtin_*, + fold_call_expr, build_range_check, maybe_fold_offset_to_address, + round_up, round_down. + +2009-07-16 Jason Merrill + + PR libstdc++/37907 + Split POD into "standard-layout" and "trivial" as per N2230, + Support std::is_standard_layout and std::is_trivial traits. + * cp-tree.h (enum cp_trait_kind): Add CPTK_IS_STD_LAYOUT, + CPTK_IS_TRIVIAL. + (struct lang_type_class): Add non_std_layout. + (CLASSTYPE_NON_STD_LAYOUT): New. + * class.c (check_bases): Set it. + (check_field_decls): Likewise. + (check_bases_and_members): Likewise. + * parser.c (cp_parser_primary_expression): Handle RID_IS_STD_LAYOUT, + RID_IS_TRIVIAL. + (cp_parser_trait_expr): Likewise. + * semantics.c (trait_expr_value): Handle CPTK_IS_STD_LAYOUT, + CPTK_IS_TRIVIAL. + (finish_trait_expr): Likewise. + * tree.c (scalarish_type_p, trivial_type_p, std_layout_type_p): New. + (pod_type_p): Use them. + (type_has_nontrivial_copy_init, type_has_nontrivial_default_init): New. + + Adjust bits of the language that no longer refer to POD types. + * call.c (convert_arg_to_ellipsis): Use type_has_nontrivial_copy_init + and TYPE_HAS_NONTRIVIAL_DESTRUCTOR rather than pod_type_p. + (build_x_va_arg): Likewise. + (call_builtin_trap): Remove. + * decl.c (declare_local_label): Use type_has_nontrivial_default_init + and TYPE_HAS_NONTRIVIAL_DESTRUCTOR rather than pod_type_p. + (cp_finish_decl): Likewise. + (check_previous_goto_1, check_goto): Adjust error. + * typeck.c (build_class_member_access_expr): Check + CLASSTYPE_NON_STD_LAYOUT rather than CLASSTYPE_NON_POD_P. + +2009-07-14 Taras Glek + Rafael Espindola + + * Make-lang.in: Added CP_PLUGIN_HEADERS and + c.install-target to export cp-tree.h cxx-pretty-print.h + name-lookup.h headers for plugins. + +2009-07-14 Jason Merrill + + PR c++/37276 + * decl.c (decls_match): A non-extern-C declaration doesn't match + a builtin extern-C declaration. + + PR c++/40746 + * name-lookup.c (qualified_lookup_using_namespace): Don't stop + looking in used namespaces just because we found something on + another branch. + + PR c++/40740 + * semantics.c (perform_koenig_lookup): Handle empty template args. + + * call.c (build_over_call): Use can_trust_pointer_alignment. + +2009-07-14 Dodji Seketeli + + PR debug/40705 + PR c++/403057 + * decl2.c (grokfield): Don't call set_underlying_type on typedef + decls that are type names. + +2009-07-13 Andrew Pinski + + PR C++/22154 + * parser.c (cp_parser_elaborated_type_specifier): Accept typename in + front of qualified names. + +2009-07-12 Jason Merrill + + PR c++/36628 + * tree.c (rvalue): Use lvalue_or_rvalue_with_address_p. + + PR c++/37206 + * cp-tree.h (enum cp_lvalue_kind_flags): Add clk_rvalueref. + * tree.c (lvalue_p_1): Return it. Remove + treat_class_rvalues_as_lvalues parm. + (real_lvalue_p): Disallow pseudo-lvalues here. + (lvalue_or_rvalue_with_address_p): New fn. + * call.c (initialize_reference): Use it instead of real_lvalue_p. + + PR c++/40689 + * init.c (build_new_1): Handle initializer list as array initializer. + (build_vec_init): Likewise. + * typeck.c (cp_build_modify_expr): Likewise. + * typeck2.c (process_init_constructor_array): Error rather than abort + if too many initializers. + +2009-07-10 Jakub Jelinek + + PR c++/40502 + * error.c (cp_print_error_function): Check for NULL block. + +2008-07-09 Simon Martin + Jason Merrill + + * pt.c (perform_typedefs_access_check, get_types_needing_access_check, + append_type_to_template_for_access_check_1): Use CLASS_TYPE_P. + +2009-07-09 Dodji Seketeli + + PR c++/40684 + * pt.c (type_unification_real): Use tsubst_template_arg instead + of tsubst to substitute default template arguments. + +2009-07-08 Manuel LĂłpez-Ibåñez + + PR c++/31246 + * init.c (build_new_1): Set TREE_NO_WARNING for compiler-generated + code. + * cp-gimplify.c (genericize_eh_spec_block): Likewise. + + +2009-07-07 Jason Merrill + + PR c++/35828 + * pt.c (tsubst_decl): Don't abort if we didn't change anything + in a TEMPLATE_DECL's args. + +2009-07-07 Manuel LĂłpez-Ibåñez + + * semantics.c (finalize_nrv_r): Replace EXPR_LOCUS by + EXPR_LOCATION. + +2009-07-07 Jason Merrill + + PR c++/37816 + * decl.c (build_enumerator): Don't add enumerators for a + scoped enum to the enclosing class. + + PR c++/40639 + * decl.c (start_enum): Allow dependent underlying type. + + PR c++/40633 + * decl.c (finish_enum): Finish scope even in a template. + +2009-07-07 Manuel LĂłpez-Ibåñez + + * init.c: Replace %J by an explicit location. Update all calls. + * decl.c: Likewise. + * typeck2.c: Likewise. + * pt.c: Likewise. + * name-lookup.c: Likewise. + +2009-07-06 Manuel LĂłpez-Ibåñez + + * decl.c: Replace %H by an explicit location. Update all calls. + * except.c: Likewise. + * semantics.c: Likewise. + * parser.c: Likewise. + +2009-07-06 Simon Martin + + PR c++/40557 + * pt.c (perform_typedefs_access_check, get_types_needing_access_check, + append_type_to_template_for_access_check_1): Use + RECORD_OR_UNION_CODE_P. + +2009-07-04 Jason Merrill + + * pt.c (retrieve_specialization): Don't get confused by a + using-declaration that brings in another instance of this template + from a base class. + + * ptree.c (cxx_print_type): Fix logic. + + * cp-tree.h (LANG_DECL_FN_CHECK): Fix non-checking version. + + PR c++/40619 + * cp-tree.h (struct lang_decl_parm): New. + (struct lang_decl): Add it. + (LANG_DECL_PARM_CHECK): New. + (DECL_PARM_INDEX): New. + * decl2.c (parm_index): Remove. + * lex.c (retrofit_lang_decl): Handle parms. + (cxx_dup_lang_specific_decl): Likewise. + * mangle.c (write_expression): Adjust. + * tree.c (cp_tree_equal): Adjust. + (decl_linkage): Only check DECL_COMDAT for functions and variables. + * parser.c (cp_parser_parameter_declaration_list): Set + DECL_PARM_INDEX. + * pt.c (iterative_hash_template_arg): Hash it. + +2009-07-03 Jason Merrill + + * cp-tree.h (struct lang_decl): Overhaul. + (struct lang_decl_flags): Remove. + (struct lang_decl_base): New. + (struct lang_decl_min): New. + (struct lang_decl_fn): New. + (struct lang_decl_ns): New. + (CAN_HAVE_FULL_LANG_DECL_P): Replace with LANG_DECL_HAS_MIN. + (LANG_DECL_MIN_CHECK): New. + (LANG_DECL_FN_CHECK): New. + (LANG_DECL_NS_CHECK): New. + (STRIP_TEMPLATE): New. + (NON_THUNK_FUNCTION_CHECK): Remove. + (DECL_DECLARES_FUNCTION_P): New. + (lots): Adjust. + * lex.c (retrofit_lang_decl, cxx_dup_lang_specific_decl): Adjust. + * decl.c (push_local_name, duplicate_decls): Adjust. + * decl2.c (start_objects): Don't set u2sel. + * semantics.c (finish_omp_threadprivate): Adjust. + * class.c (build_clone): Don't do much on TEMPLATE_DECLs. + (decl_cloned_function_p): Out-of-line implementation of macros. + (clone_function_decl, adjust_clone_args): Use DECL_CLONED_FUNCTION_P. + * mangle.c (write_unqualified_name): Don't check function flags + on non-functions. + * method.c (make_alias_for): Don't set DECL_CLONED_FUNCTION. + * pt.c (build_template_decl): Don't set function flags. + (check_default_tmpl_args): Check that it's a function. + (instantiate_template): Use DECL_ABSTRACT_ORIGIN to find the + cloned template. + + * pt.c (tsubst_decl) [FUNCTION_DECL]: Don't tsubst + DECL_CLONED_FUNCTION. + + * cp-tree.h (struct lang_type_class): Move sorted_fields here. + * class.c (finish_struct_1): Adjust. + * ptree.c (cxx_print_decl, cxx_print_type): Adjust. + * search.c (lookup_field_1): Adjust. + + * cp-tree.h (CLASSTYPE_INLINE_FRIENDS): Remove. + * decl.c (finish_method): Don't add to it. + * class.c (fixup_pending_inline): Remove. + (fixup_inline_methods): Remove. + (finish_struct_1): Don't call it. + + * error.c (dump_function_name): Handle null name. + +2009-07-02 Mark Mitchell + + * typeck.c (cp_build_binary_op): Move warnings about use of NULL + in arithmetic earlier and allow comparisions of NULL with + pointers-to-members. + +2009-07-02 Jason Merrill + + Use hash tables for template specialization lookup. + * pt.c (struct spec_entry): New type. + (decl_specializations, type_specializations): New hash tables. + (register_specialization, retrieve_specialization): Use them. + (reregister_specialization, lookup_template_class): Use them. + (eq_specializations, hash_tmpl_and_args, hash_specialization): New. + (iterative_hash_template_arg): New. + (init_template_processing): New + (process_partial_specialization): Don't look to see if we already + have this partial specialization. + (maybe_process_partial_specialization): Handle reassigning + full specializations when we get an explicit specialization + of the partial instantiation. + (tsubst_friend_function): Adjust specialization reassignment code. + (instantiate_template): Only do one lookup. + (instantiate_decl): Don't do any lookup. + * cp-tree.h: Declare init_template_processing. + * decl.c (duplicate_decls): Pass args to reregister_specialization. + +2009-07-01 Jason Merrill + + * cp-tree.h (DECL_CLASS_TEMPLATE_P): Use DECL_IMPLICIT_TYPEDEF_P. + + * pt.c (register_specialization): Use duplicate_decls to merge + the argument with a previous specialization. + (check_explicit_specialization): Call register_specialization to + merge the TEMPLATE_DECL with a previous version. + (determine_specialization): Return the args even if fn is a template. + +2009-07-01 Ian Lance Taylor + + * g++spec.c (lang_specific_driver): Bump num_args by 1. + +2009-06-30 Jason Merrill + + PR c++/40595 + * pt.c (tsubst_pack_expansion): Handle unexpanded packs in an + EXPR_PACK_EXPANSION. + +2009-06-29 Jason Merrill + + PR c++/40274 + * error.c (dump_template_parms): Pass all args to + count_non_default_template_args. + (count_non_default_template_args): Pull out the inner ones. + +2009-06-26 H.J. Lu + + * decl.c (duplicate_decls): Re-indent. + +2009-06-25 Ian Lance Taylor + + * call.c (avoid_sign_compare_warnings): New static function. + (build_new_op): Call it. + * typeck.c (cp_build_binary_op): Don't call warn_sign_compare if + TREE_NO_WARNING is set on either operand. + +2009-06-25 Ian Lance Taylor + + * g++spec.c (SKIPOPT): define. + (lang_specific_driver): Handle -static-libstdc++. Only add + LIBSTDCXX_STATIC if we add LIBSTDCXX. + +2009-06-25 Ian Lance Taylor + + * cvt.c (convert_to_void): Only warn about COND_EXPR if neither + the second nor third operand has side effects. + +2009-06-25 Ian Lance Taylor + + * parser.c (cp_parser_binary_expression): Increment + c_inhibit_evaluation_warnings while parsing the right hand side of + "true || x" or "false && x". + * typeck.c (cp_build_binary_op): Only call warn_for_sign_compare + if c_inhibit_evaluation_warnings is zero. + +2009-06-24 Jason Merrill + + * error.c (dump_decl): Do say "typedef" for the injected class name. + + * pt.c (lookup_template_class): Use currently_open_class, + compare template args later. + + PR c++/40342 + * decl.c (decls_match): Check DECL_TI_TEMPLATE too. + * class.c (resolve_address_of_overloaded_function): Fix typo. + +2009-06-18 Aldy Hernandez + + * class.c (get_vtable_decl): Replace finish_decl with cp_finish_decl. + * decl.c (finish_decl): Remove. + (declare_global_var): Replace finish_decl with cp_finish_decl. + (start_method): Same. + * rtti.c (emit_tinfo_decl): Same. + * pt.c (tsubst_expr): Same. + (instantiate_decl): Same. + * decl2.c (grokbitfield): Same. + * name-lookup.c (pushdecl_top_level_1): Same. + * cp-tree.h: Remove finish_decl. + +2009-06-16 David Edelsohn + + * g++-spec.c (LIBSTDCXX_STATIC): Default to NULL. + (lang_specific_driver): Always allocate extra argument. + Add LIBSTDCXX_STATIC to arglist if defined and linking + statically. + +2009-06-16 Ian Lance Taylor + + * Make-lang.in (cp/class.o): Depend upon gt-cp-class.h. + (cp/semantics.o): Depend upon gt-cp-semantics.h. + +2009-06-16 Ian Lance Taylor + + * parser.c (cp_unevaluated_operand): Define global variable. + (cp_parser_question_colon_clause): Increment + c_inhibit_evaluation_warnings when evaluating an expression which + will never be executed. + (cp_parser_decltype): Increment cp_unevaluated_operand and + c_inhibit_evaluation_warnings, not skip_evaluation. + (cp_parser_sizeof_operand): Likewise. + (cp_parser_enclosed_template_argument_list): Save + cp_unevaluated_operand and c_inhibit_evaluation_warnings, not + skip_evaluation. + * cp-tree.h (struct saved_scope): Remove skip_evaluation field. + Add unevaluated_operand and inhibit_evaluation_warnings fields. + (cp_unevaluated_operand): Declare. + * name-lookup.c (push_to_top_level): Save cp_unevaluated_operand + and c_inhibit_evaluation_warnings rather than skip_evaluation. + (pop_from_top_level): Restore cp_unevaluated_operand and + c_inhibit_evaluation_warnings rather than skip_evaluation. + * class.c (build_base_path): Check cp_unevaluated_operand rather + than skip_evaluation. + * typeck.c (build_class_member_access_expr): Likewise. + (cp_build_binary_op): Don't warn about bad shift counts if + c_inhibit_evaluation_warnings is non-zero. + * pt.c (coerce_template_parms): Save state of + cp_unevaluated_operand and c_inhibit_evaluation_warnings, not + skip_evaluation. + (tsubst_aggr_type): Likewise. + (tsubst_pack_expansion): Check cp_unevaluated_operand rather than + skip_evaluation. + (tsubst_copy): Likewise. + (tsubst): Set cp_unevaluated_operand and + c_inhibit_evaluation_warnings, not skip_evaluation. + (tsubst_copy_and_build): Likewise. + * call.c (convert_arg_to_ellipsis): Check cp_unevaluated_operand + rather than skip_evaluation. + * decl2.c (mark_used): Likewise. + * semantics.c (finish_non_static_data_member): Likewise. + * cvt.c (cp_convert_and_check): Check + c_inhibit_evaluation_warnings rather than skip_evaluation. + * mangle.c (write_type): Set cp_unevaluated_operand rather than + skip_evaluation. + +2009-06-15 Ian Lance Taylor + + * parser.c (cp_parser_direct_declarator): Add braces around + variables declared before label. + +2009-06-15 Rafael Avila de Espindola + + * cp-objcp-common.h (LANG_HOOKS_COMDAT_GROUP): Remove. + * cp-tree.h (cxx_comdat_group): Change signature. + * decl.c (duplicate_decls): Use DECL_COMDAT_GROUP. + (cxx_comdat_group): Change signature. + * decl2.c (comdat_linkage, maybe_make_one_only): Update call to + make_decl_one_only. + (constrain_visibility, get_guard): Use DECL_COMDAT_GROUP. + * method.c (use_thunk): Update call to make_decl_one_only. + * optimize.c (maybe_clone_body): Use DECL_COMDAT_GROUP + +2009-06-12 Aldy Hernandez + + * typeck.c (cp_build_binary_op): Pass location to overflow_warning. + (build_modify_expr): New arg. + * semantics.c (finish_unary_op_expr): Pass location to + overflow_warning. + (handle_omp_for_class_iterator): Pass location to build_modify_expr. + * typeck.c (cxx_sizeof_or_alignof_type): Pass location to + c_sizeof_or_alignof_type. + (build_array_ref): New argument. + (build_compound_expr): Same. + (build_const_cast): Same. + (build_ptrmemfunc): Pass location to build_c_cast. + * init.c (avoid_placement_new_aliasing): Pass location to + build_stmt. + (build_vec_delete_1): Pass location to cp_build_modify_expr, + build_compound_expr. + * class.c (build_vtbl_ref_1): Pass location to build_array_ref. + * decl.c (poplevel): Pass location to c_build_bind_expr. + (finish_case_label): Pass location to build_case_label. + (finish_constructor_body): Same. + (finish_destructor_body): Pass location to build_stmt. + (cxx_maybe_build_cleanup): Same, but to build_compound_expr. + * call.c (build_new_op): Pass location to build_array_ref. + (build_x_va_arg): Pass location to build_va_arg. + * except.c (expand_end_catch_block): Pass location to + build_stmt. + * cp-tree.h (build_array_ref): New argument. + (build_compound_expr): Same. + (build_c_cast): Same. + * cp-gimplify.c (gimplify_if_stmt): Pass location on down. + (gimplify_switch_stmt): Same. + * typeck2.c (split_nonconstant_init_1): Same. + * pt.c (tsubst_copy): Same. + * semantics.c (add_decl_expr): Same. + (do_poplevel): Same. + (push_cleanup): Same. + (finish_goto_stmt): Same. + (finish_expr_stmt): Same. + (begin_if_stmt): Same. + (begin_while_stmt): Same. + (begin_do_stmt): Same. + (finish_return_stmt): Same. + (begin_for_stmt): Same. + (finish_break_stmt): Same. + (finish_continue_stmt): Same. + (begin_switch_stmt): Same. + (begin_try_block): Same. + (begin_handler): Same. + (finish_asm_stmt): Same. + (finish_label_stmt): Same. + (finish_stmt_expr_expr): Same. + (finalize_nrv_r): Same. + (finish_omp_atomic): Same. + * name-lookup.c (do_using_directive): Same. + * decl2.c (grok_array_decl): Same. + * parser.c (cp_parser_cast_expression): Same. + (cp_parser_selection_statement): Same. + (cp_parser_implicitly_scoped_statement): Same. + (cp_parser_objc_selector_expression): Same. + (cp_parser_objc_synchronized_statement): Same. + (cp_parser_objc_throw_statement): Same. + (cp_parser_omp_critical): Same. + (cp_parser_omp_master): Same. + * typeck.c (build_function_call): Add location argument. + * init.c: Add location argument to all build_decl calls. + * class.c: Same. + * method.c: Same. + * rtti.c: Same. + * tree.c: Same. + * pt.c: Same. + * semantics.c: Same. + * lex.c: Same. + * decl2.c: Same. + * cp-gimplify.c: Same. + * decl.c: Same. + (cp_make_fname_decl): Add location argument. Pass location ot + build_decl. + (finish_case_label): Same. + * cp-tree.h (finish_case_label): Add location argument. + * parser.c (cp_parser_label_for_labeled_statement): Pass location to + finish_case_label. + +2009-06-09 Jason Merrill + + PR c++/40381 + * decl2.c (mark_used): Return after complaining about deleted fn. + +2009-06-08 Jason Merrill + + * parser.c (cp_parser_type_id_1): 'auto' type is ok with a + late-specified return type. + +2009-06-08 Jakub Jelinek + + PR c++/40373 + * call.c (check_dtor_name): Return false even if + get_type_value (name) is error_mark_node. + + PR c++/40370 + PR c++/40372 + * parser.c (cp_parser_direct_declarator): Don't set TREE_SIDE_EFFECTS + on error_mark_node. Check for VLAs outside of function context + before check whether to wrap bounds into a NOP_EXPR with + TREE_SIDE_EFFECTS. + +2009-06-08 Alexandre Oliva + + * repo.c (get_base_filename): Use aux_base_name rather than + alternate temporary file during second compare debug compilation. + (finish_repo): Skip during -fcompare-debug-second. + +2009-06-06 Ian Lance Taylor + + * parser.c (cp_parser_label_for_labeled_statement): Support + attribute on labels if immediately followed by semicolon. + * semantics.c (finish_label_stmt): Return new label. + * pt.c (tsubst_expr): Handle attributes for LABEL_EXPR. + +2009-06-03 Ian Lance Taylor + + * Make-lang.in (cc1plus-checksum.o): Depend upon $(CONFIG_H) and + $(SYSTEM_H). + +2009-06-02 Mark Mitchell + + * decl.c (maybe_deduce_size_from_array_init): Use relayout_decl. + +2009-06-02 Jason Merrill + + PR c++/40308 + PR c++/40311 + * typeck.c (cp_build_modify_expr): Always pass init-lists to the + conversion code. + * call.c (implicit_conversion): Allow init-list conversion to scalar + during direct-initialization, too. Mark the conversion bad if it + has too many levels of braces. + (convert_like_real): And give a helpful error. + + PR c++/40306 + PR c++/40307 + * decl.c (cp_finish_decl): Handle auto deduction from (). + * typeck.c (build_x_indirect_ref): Handle dereferencing an operand + with dependent type that is known to be a pointer. + +2009-06-02 Simon Martin + + PR c++/38089 + * pt.c (register_specialization): Properly setup DECL_CONTEXT for + specializations in an invalid namespace. + +2009-06-01 Aldy Hernandez + + * error.c (print_instantiation_partial_context): Print column + numbers. + +2009-05-29 Ian Lance Taylor + + * error.c (cp_printer): Don't use va_arg with enum type. + +2009-05-28 Dodji Seketeli + + PR c++/39754 + * cp-tree.h (canonical_type_variant): Remove this function declaration. + (strip_typedefs): New function declaration. + * tree.c (strip_typedefs): New function definition. + (canonical_type_variant): Remove function definition. + * cvt.c (convert_from_reference): No need to use + canonical_type_variant. + * typeck.c (cp_build_indirect_ref): Likewise. + * error.c (dump_template_bindings): Use strip_typedefs instead of + canonical_type_variant. + * pt.c (convert_template_argument, unify): Likewise. + * mangle.c (canonicalize_for_substitution): Don't use + canonical_type_variant. + +2009-05-27 Jason Merrill + + * call.c (implicit_conversion): Handle conversion from + initializer-list to scalar. + (convert_like_real): Likewise. Avoid crashing on list + initialization with bad conversions. + (can_convert): Use LOOKUP_EXPLICIT. + (can_convert_arg_bad): Add flags parm. + * cp-tree.h: Adjust. + * typeck.c (convert_for_assignment): Pass flags. + +2009-05-27 Ian Lance Taylor + + * Make-lang.in (g++$(exeext)): Change $(COMPILER) to $(LINKER). + (cc1plus-dummy$(exeext), cc1plus$(exeext)): Likewise. + +2009-05-26 Ian Lance Taylor + + * Make-lang.in (g++spec.o): Use $(COMPILER). + (g++$(exeext), cc1plus-dummy$(exeext)): Likewise. + (cc1plus$(exeext)): Likewise. + +2009-05-26 Dodji Seketeli + + PR c++/40007 + * cp-tree.h (MEMBER_TYPES_NEEDING_ACCESS_CHECK): Remove this accessor. + (TI_TYPEDEFS_NEEDING_ACCESS_CHECKING): New accessor. + (get_types_needing_access_check): Declare new entry point. + * pt.c (append_type_to_template_for_access_check_1, + get_types_needing_access_check): New functions. + (perform_typedefs_access_check): Accept FUNCTION_DECLs and + RECORD_TYPEs rather than TEMPLATE_DECLs. Use the new + get_types_needing_access_check, no more + MEMBER_TYPES_NEEDING_ACCESS_CHECK. + (instantiate_class_template): Set input_location to the source + location of the most specialized template definition. + Perform access check using the RECORD_TYPE of the template, not its + associated most generic TEMPLATE_DECL. + (append_type_to_template_for_access_check): Augment function + comments. Use the new get_types_needing_access_check, not + MEMBER_TYPE_NEEDING_ACCESS_CHECK. Use the new + append_type_to_template_for_access_check_1 subroutine. + +2009-05-22 Jason Merrill + + PR c++/38064 + * typeck.c (cp_build_binary_op): Allow ENUMERAL_TYPE in + arithmetic comparisons. + (cp_common_type): Handle scoped enums. + + * call.c (promoted_arithmetic_type_p): Don't use INTEGRAL_TYPE_P. + (add_builtin_candidate, add_builtin_candidates): Likewise. + (convert_like_real): Likewise. + * class.c (check_bitfield_decl): Likewise. + * decl.c (check_static_variable_definition): Likewise. + (compute_array_index_type): Likewise. + * decl2.c (grokbitfield): Likewise. + * init.c (build_new_1): Likewise. + * pt.c (convert_nontype_argument): Likewise. + (current_instantiation): Likewise. + * tree.c (pod_type_p): Likewise. + * typeck.c (build_static_cast_1): Likewise. + (build_reinterpret_cast_1): Likewise. + +2009-05-22 Richard Guenther + + PR middle-end/38964 + * init.c (avoid_placement_new_aliasing): Remove. + (build_new_1): Do not call it. + +2009-05-22 Mark Mitchell + + * decl2.c (decl_needed_p): Consider dllexport'd functions needed. + * semantics.c (expand_or_defer_fn): Similarly. + +2009-05-20 Ian Lance Taylor + + * parser.c (cp_parser_postfix_expression): Change args to a vec. + Release it when done. + (tree_vector): Define typedef. Define VEC functions. + (cp_parser_parenthesized_expression_list): Change return type to + vec. Change all callers. + (cp_parser_new_expression): Change placement and initializer to + vecs. Release them when done. + (cp_parser_new_placement): Change return type to vec. Change all + callers. + (cp_parser_new_initializer): Likewise. + * typeck.c (build_function_call_vec): Just call + cp_build_function_call_vec. + (cp_build_function_call): Just build a vec and call + cp_build_function_call_vec. + (cp_build_function_call_vec): New function based on old + cp_build_function_call. + (convert_arguments): Remove nargs and argarray parameters. Change + values to a vec. Change caller. + (build_x_compound_expr_from_vec): New function. + (cp_build_modify_expr): Build vec to pass to + build_special_member_call. + * call.c (struct z_candidate): Add first_arg field. Change args + field to vec. + (convert_class_to_reference): Handle first argument separately. + (add_candidate): Add first_arg parameter. Change args parameter + to vec. Change all callers. + (add_function_candidate, add_conv_candidate): Likewise. + (add_template_candidate_real, add_template_candidate): Likewise. + (add_template_conv_candidate): Likewise. + (build_user_type_conversion_1): Handle first argument separately. + (resolve_args): Change return type and parameter type to vecs. + Change all callers. + (perform_overload_resolution): Change args parameter to vec. + Change all callers. + (build_new_function_call, build_operator_new_call): Likewise. + (add_candidates): Likewise. + (build_op_call): New globally visible function, built from and + replacing static function build_object_call. + (build_new_op): Don't handle CALL_EXPR. Build vec, not tree_list, + of arguments. + (build_op_delete_call): Build vec to pass to + cp_build_function_call_vec. + (build_temp): Build vec to pass to build_special_member_call. + (convert_like_real): Likewise. + (perform_direct_initialization_if_possible): Likewise. + (build_over_call): Handle first_arg field. Use build_call_array + rather than build_call_list. + (build_special_member_call): Change args parameter to vec. Change + all callers. + (build_new_method_call): Likewise. + * init.c (expand_default_init): Change parms to vec. + (build_raw_new_expr): Change placement and init to vecs. Change + all callers. + (build_new_1, build_new): Likewise. + * class.c (resolve_address_of_overloaded_function): Build array to + pass to fn_type_unification. + * pt.c (tsubst_copy_and_build): For NEW_EXPR build vecs to pass to + build_new. For CALL_EXPR create a vec rather than a tree_list; + expand a pack if necessary. + (fn_type_unification): Change args parameter to const tree *. Add + nargs parameter. Change all callers. + (type_unification_real): Likewise. + (unify): Build array to pass to type_unification_real. + (get_bindings): Build array to pass to fn_type_unification. + (any_type_dependent_arguments_p): Change args parameter to a vec. + Change all callers. + (make_args_non_dependent): Renamed from build_non_dependent_args. + Change return type to void. Change parameter type to vec. Change + all callers. + (do_auto_deduction): Pass an array to type_unification_real. + * semantics.c (perform_koenig_lookup): Change args to vec. Change + all callers. + (finish_call_expr): Change args to vec. Change all callers. Call + build_op_call instead of passing CALL_EXPR to build_new_op. + (cxx_omp_create_clause_info): Allocate vec to pass to + build_special_member_call. + * decl2.c (build_offset_ref_call_from_tree): Change args parameter + to vec. Change all callers. + * name-lookup.c (lookup_function_nonclass): Likewise. + (struct arg_lookup): Change args to vec. + (arg_assoc_namespace): Handle args as a vec. + (arg_assoc_args_vec): New static function. + (lookup_arg_dependent): Change args parameter to vec. Change all + callers. + * method.c (do_build_assign_ref): Allocate vec to pass to + build_special_member_call. + * except.c (build_throw): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * cvt.c (ocp_convert): Likewise. + * tree.c (build_min_non_dep_call_vec): Change last parameter to + vec. Change all callers. + * cp-tree.h: Update declarations. + * name-lookup.h: Update declarations. + +2009-05-20 Sandra Loosemore + + * typeck.c (default_conversion): Check targetm.promoted_type. + * decl.c (grokdeclarator): Check targetm.invalid_return_type. + (grokparms): Check targetm.invalid_parameter_type. + * cvt.c (ocp_convert): Check targetm.convert_to_type. + (build_expr_type_conversion): Check targetm.promoted_type. + +2009-05-19 Andrew Pinski + + * typeck.c (build_binary_op): Allow % on integal vectors. + +2009-05-18 Jason Merrill + + Implement explicit conversions ops as specified in N2437. + * decl.c (grokdeclarator): Handle explicit conversion ops. + (check_initializer): Pass flags to store_init_value. + * decl2.c (maybe_emit_vtables): Likewise. + * init.c (expand_aggr_init_1): Likewise. + * call.c (convert_class_to_reference): Take flags parm, + check DECL_NONCONVERTING_P. + (build_user_type_conversion_1): Check DECL_NONCONVERTING_P. + (add_builtin_candidates): Simplify getting type of conversion. + (build_object_call): Likewise. Check DECL_NONCONVERTING_P. + (implicit_conversion): Pass through LOOKUP_ONLYCONVERTING. + (reference_binding): Take flags parm. Direct-initialize copy parm. + (add_function_candidate): Direct-initialize the copy parm. + (add_conv_candidate): Use LOOKUP_IMPLICIT, not LOOKUP_NORMAL. + (build_builtin_candidate): Add LOOKUP_ONLYCONVERTING. + (conditional_conversion): Likewise. + (convert_like_real): Only complain about DECL_NONCONVERTING_P + constructors. + (perform_implicit_conversion_flags): Add flags parm to + perform_implicit_conversion. Improve diagnostics. + * cp-tree.h (LOOKUP_IMPLICIT): New macro. + (LOOKUP_COPY_PARM): New bit macro. + * cvt.c (build_expr_type_conversion): Check DECL_NONCONVERTING_P. + * typeck.c (convert_for_assignment): Take flags parm, pass it to + perform_implicit_conversion_flags. + (cp_build_modify_expr): Pass flags to convert_for_assignment. + (convert_for_initialization): Likewise. + * typeck2.c (store_init_value): Take flags parm, pass to + digest_init_flags. + (digest_init_flags): Add flags parm to digest_init. + (digest_init_r): Take flags parm, pass to convert_for_initialization. + (process_init_constructor_array): Pass it. + (process_init_constructor_record): Likewise. + (process_init_constructor_union): Likewise. + +2009-05-16 Jason Merrill + + PR c++/40139 + * pt.c (tsubst_qualified_id): Retain the type if we aren't dealing + with a dependent type. Actually look up the destructor. + * semantics.c (finish_id_expression): Fix logic. + (finish_qualified_id_expr): Don't try to use 'this' if we aren't in + a function. + * typeck.c (build_x_unary_op): Diagnose taking the address of a + constructor or destructor. + * tree.c (get_first_fn): Handle OFFSET_REF. + +2009-05-17 Joseph Myers + + * tree.c (cxx_printable_name_internal): Allow consecutive + translated and untranslated cached copies of the name of the + current function. + +2009-05-15 Ian Lance Taylor + + * cp-tree.h (enum cp_lvalue_kind_flags): Rename from + cp_lvalue_kind. Change all uses. + (enum base_access_flags): Rename from enum base_access. Change + all uses. + * parser.c (enum cp_parser_flags): Remove enum tag. + +2009-05-15 Manuel LĂłpez-Ibåñez + + PR 16302 + * call.c (build_new_op): Update calls to warn_logical_operator. + +2009-05-14 Ian Lance Taylor + + * class.c (layout_class_type): Change itk to unsigned int. + * decl.c (finish_enum): Change itk to unsigned int. + * parser.c (cp_parser_check_decl_spec): Change ds to int. Remove + casts. + +2009-05-13 David Mandelin : + + * decl.c (duplicate_decls): Preserve parameter attributes. + +2009-05-10 Jan Hubicka + + * decl2.c (cxx_callgraph_analyze_expr): Use + cgraph_mark_address_taken. + +2009-05-10 Joseph Myers + + * call.c (name_as_c_string): Call type_as_string_translate. + Translate identifiers to locale character set. + * cp-tree.h (lang_decl_name): Update prototype. + (type_as_string_translate, decl_as_string_translate, + cxx_printable_name_translate): Declare. + * cxx-pretty-print.c (M_): Define. + (pp_cxx_unqualified_id, pp_cxx_canonical_template_parameter): Mark + English fragments for conditional translation with M_. + * decl.c (grokdeclarator): Translate identifiers to locale + character set for diagnostics. + * error.c (M_): Define. + (dump_template_bindings, dump_type, dump_aggr_type, + dump_type_prefix, dump_global_iord, dump_simple_decl, dump_decl, + dump_function_decl, dump_template_parms, dump_expr, + dump_binary_op, op_to_string, assop_to_string): Mark English + fragments for conditional translation with M_. + (type_as_string): Disable translation of identifiers. + (type_as_string_translate): New. + (expr_as_string): Disable translation of identifiers. + (decl_as_string): Disable translation of identifiers. + (decl_as_string_translate): New. + (lang_decl_name): Add parameter translate. + (args_to_string): Call type_as_string_translate. + (cp_print_error_function): Call cxx_printable_name_translate. + (print_instantiation_full_context, + print_instantiation_partial_context): Call + decl_as_string_translate. + * parser.c (cp_lexer_get_preprocessor_token): Use %qE for + identifier in diagnostic. + * tree.c (cxx_printable_name): Change to + cxx_printable_name_internal. Add parameter translate. + (cxx_printable_name, cxx_printable_name_translate): New wrappers + round cxx_printable_name_internal. + +2009-05-08 H.J. Lu + + PR c/36892 + * call.c (build_call_a): Updated warn_deprecated_use call. + (build_over_call): Likewise. + * decl.c (grokdeclarator): Likewise. + (grokparms): Likewise. + * semantics.c (finish_id_expression): Likewise. + * typeck.c (build_class_member_access_expr): Likewise. + (finish_class_member_access_expr): Likewise. + +2009-05-06 Dodji Seketeli + + PR c++/17395 + * pt.c (tsubst_copy) : We don't want to tsubst the + whole list of PARM_DECLs, just the current one. + +2009-05-05 Shujing Zhao + + * cp-tree.h: + (opname_tab, assignop_tab, update_member_visibility, yyerror, yyhook, + mangle_compound_literal): Remove unused declarations. + (build_vfield_ref, cxx_print_statistics, clone_function_decl, + adjust_clone_args, maybe_push_cleanup_level, pushtag, make_anon_name, + pushdecl_top_level_maybe_friend, pushdecl_top_level_and_finish, + check_for_out_of_scope_variable, print_other_binding_stack, + maybe_push_decl, cxx_mark_addressable, force_target_expr, + build_target_expr_with_type, finish_case_label, + cxx_maybe_build_cleanup, begin_eh_spec_block, finish_eh_spec_block, + check_template_keyword, cxx_omp_predetermined_sharing, + cxx_omp_clause_default_ctor, cxx_omp_clause_copy_ctor, + cxx_omp_clause_assign_op, cxx_omp_clause_dtor, cxx_omp_finish_clause, + cxx_omp_privatize_by_reference): Rearrange the declarations line to + match the comment that indicates the .c file which the functions are + defined. + (cxx_print_xnode, cxx_print_decl, cxx_print_type, + cxx_print_identifier, cxx_print_error_function, pushdecl): Add comment. + +2009-05-05 Nathan Sidwell + + * typeck.c (cp_build_compound_expr): Require RHS to have a known + type. + * class.c (resolve_address_of_overloaded_function): Use + OVL_CURRENT for error message. + (instantiate_type): Forbid COMPOUND_EXPRs and remove code dealing + with them. Do not copy the node. + +2009-05-05 Jakub Jelinek + + PR c++/40013 + * pt.c (tsubst): If magic NOP_EXPR with side-effects has no type, + set it from its operand's type after tsubst_expr. + +2009-05-04 Manuel Lopez-Ibanez + + PR c++/28152 + * parser.c (cp_lexer_get_preprocessor_token): Do not store the + canonical spelling for keywords. + (cp_parser_attribute_list): Use the canonical spelling for + keywords in attributes. + +2009-05-01 Joseph Myers + + * cxx-pretty-print.c (is_destructor_name, pp_cxx_unqualified_id, + pp_cxx_template_keyword_if_needed, pp_cxx_postfix_expression, + pp_cxx_new_expression, pp_cxx_delete_expression, + pp_cxx_unary_expression, pp_cxx_assignment_operator, + pp_cxx_assignment_expression, pp_cxx_expression, + pp_cxx_function_specifier, pp_cxx_decl_specifier_seq, + pp_cxx_simple_type_specifier, pp_cxx_type_specifier_seq, + pp_cxx_exception_specification, pp_cxx_direct_declarator, + pp_cxx_ctor_initializer, pp_cxx_type_id, pp_cxx_statement, + pp_cxx_namespace_alias_definition, pp_cxx_template_parameter, + pp_cxx_canonical_template_parameter, pp_cxx_template_declaration, + pp_cxx_declaration, pp_cxx_typeid_expression, + pp_cxx_va_arg_expression, pp_cxx_offsetof_expression, + pp_cxx_trait_expression): Mostly use pp_string and + pp_cxx_ws_string in place of pp_identifier and pp_cxx_identifier + for non-identifiers. Mark English strings for translation. + * cxx-pretty-print.h (pp_cxx_ws_string): Define. + * error.c (dump_template_parameter, dump_template_bindings, + dump_type, dump_aggr_type, dump_type_prefix, dump_simple_decl, + dump_decl, dump_template_decl, dump_function_decl, + dump_parameters, dump_exception_spec, dump_template_parms, + dump_expr, dump_binary_op, dump_unary_op, op_to_string, + assop_to_string, args_to_string, cp_print_error_function, + print_instantiation_full_context, + print_instantiation_partial_context): Mostly use pp_string and + pp_cxx_ws_string in place of pp_identifier and pp_cxx_identifier + for non-identifiers. Mark English strings for translation. + (dump_global_iord): Mark strings for translation; use longer + strings instead of substituting single words. + (function_category): Return a format string marked for + translation, not a single word or phrase to substitute in a longer + phrase. + +2009-04-28 Ben Elliston + + PR c++/35652 + Revert: + + 2009-03-27 Manuel Lopez-Ibanez + + * typeck.c (cp_pointer_sum): Adjust call to pointer_int_sum. + +2009-04-27 Ian Lance Taylor + + * semantics.c (finish_omp_clauses): Change type of c_kind to enum + omp_clause_code. + +2009-04-27 Jakub Jelinek + + PR c++/39875 + * cvt.c (convert_to_void) : Only warn about + -Wunused-value if implicit. + +2009-04-24 Ian Lance Taylor + + * call.c (build_temp): Change 0 to enum constant. + * cp-tree.h (cp_lvalue_kind): Typedef to int rather than enum + type. + * cp-gimplify.c (cp_gimplify_expr): Add cast to enum type. + * decl2.c (constrain_visibility): Likewise. + * parser.c (cp_lexer_get_preprocessor_token): Likewise. + (cp_parser_flags): Typedef to int rather than enum type. + (cp_parser_expression_stack_entry): Change prec field to enum + cp_parser_prec. + + * typeck.c (build_modify_expr): Add lhs_origtype parameter. + Change all callers. + +2009-04-22 Dodji Seketeli + + PR c++/39639 + * parser.c (cp_parser_template_argument_list): Display an error + when an ellipsis is not preceded by a parameter pack. Also, warn + about variadic templates usage without -std=c++0x. + +2009-04-21 Taras Glek + + * cp-tree.h: Update GTY annotations to new syntax. + * decl.c: Likewise. + * mangle.c: Likewise. + * name-lookup.c: Likewise. + * name-lookup.h: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * semantics.c: Likewise. + * typeck2.c: Likewise. + +2009-04-22 Manuel Lopez-Ibanez + + PR c++/14875 + * parser.c (cp_parser_error): Pass token->flags to c_parse_error. + +2009-04-21 Manuel Lopez-Ibanez + + PR c++/35711 + * typeck.c (check_for_casting_away_constness): We diagnose casting + away any qualifiers not just constness. + (casts_away_constness): Mention that it handles more than just + constness. + +2009-04-21 Joseph Myers + + * ChangeLog, ChangeLog-1993, ChangeLog-1994, ChangeLog-1995, + ChangeLog-1996, ChangeLog-1997, ChangeLog-1998, ChangeLog-1999, + ChangeLog-2000, ChangeLog-2001, ChangeLog-2002, ChangeLog-2003, + ChangeLog-2004, ChangeLog-2005, ChangeLog-2006, ChangeLog-2007, + ChangeLog-2008, ChangeLog.ptr, ChangeLog.tree-ssa, NEWS, + cfns.gperf: Add copyright and license notices. + * cfns.h: Regenerate. + * ChangeLog, ChangeLog-2004: Correct dates. + +2009-04-21 Manuel LĂłpez-Ibåñez + + PR 16202 + * tree.c (lvalue_p_1): Use const_tree. + Use CONST_CAST_TREE to avoid warning. + (lvalue_p): Returns bool, receives const_tree. + +2009-04-21 Manuel Lopez-Ibanez + + PR c++/13358 + * parser.c (cp_parser_check_decl_spec): Drop redundant flags. + * error.c (pedwarn_cxx98): New. + * cp-tree.h (pedwarn_cxx98): Declare. + +2009-04-20 Le-Chun Wu + + PR c++/39803 + * init.c (build_vec_init): Set TREE_NO_WARNING on the + compiler-generated INDIRECT_REF expression. + +2009-04-20 Ian Lance Taylor + + * typeck.c (build_function_call_vec): New function. + (cp_build_function_call): Only pass first parameter to + objc_rewrite_function_call. + (build_modify_expr): Add rhs_origtype parameter. Change all + callers. + * decl.c (finish_decl): Add origtype parameter. Change all + callers. + * semantics.c (finish_call_expr): Pass VEC to + resolve_overloaded_builtin. + +2009-04-20 Ian Lance Taylor + + * cp-tree.h (base_access): Change typedef to int. + * parser.c (cp_parser_omp_flush): Change 0 to OMP_CLAUSE_ERROR. + (cp_parser_omp_threadprivate): Likewise. + * pt.c (unify_pack_expansion): Add casts to enum type. + +2009-04-19 Manuel LĂłpez-Ibåñez + + PR c/32061 + PR c++/36954 + * call.c (build_new_op): Save the original codes of operands + before folding. + +2009-04-18 Kazu Hirata + + * cp-tree.h: Remove the prototype for insert_block. + * decl.c (insert_block): Remove. + +2009-04-16 Ian Lance Taylor + + * cp-tree.h (enum tsubst_flags): Rename from enum tsubst_flags_t. + (tsubst_flags_t): Change typedef from enum type to int. + +2009-04-16 Paolo Bonzini + + * decl.c (check_initializer): Use TYPE_VECTOR_OPAQUE + instead of targetm.vector_opaque_p. + +2009-04-15 Le-Chun Wu + + PR c++/39551 + * call.c (build_over_call): Set TREE_NO_WARNING on the + compiler-generated INDIRECT_REF expression. + * cvt.c (convert_to_void): Emit warning when stripping off + INDIRECT_REF. + +2009-04-14 Diego Novillo + + * parser.c (cp_parser_type_specifier_seq): Move call to + invoke_plugin_callbacks ... + (cp_parser_type_specifier_seq): ... here. + +2009-04-14 Le-Chun Wu + + * Make-lang.in: Modify dependencies of files including plugin.h. + * decl.c (finish_function): Call invoke_plugin_callbacks. + * parser.c (cp_parser_type_specifier): Call invoke_plugin_callbacks. + +2009-04-14 Jason Merrill + + PR c++/39763 + * name-lookup.c (pushdecl_maybe_friend): Avoid all warnings + about shadowing by tentative parms. + +2009-04-13 Jason Merrill + + PR c++/39480 + * call.c (build_over_call): Don't call memcpy if the target is + the same as the source. + +2009-04-13 Jason Merrill + + PR c++/39750 + * pt.c (uses_template_parms): Handle CONSTRUCTOR. + +2009-04-12 Jason Merrill + + PR c++/39742 + * call.c (joust): Don't crash on variadic fn. + +2009-04-10 Jason Merrill + + PR c++/28301 + * parser.c (cp_parser_skip_to_end_of_block_or_statement): Return + if we see a close brace without an open brace. + +2009-04-10 H.J. Lu + + * parser.c (cp_parser_class_specifier): Remove the unused + has_trailing_semicolon. + +2009-04-10 Manuel LĂłpez-Ibåñez + + PR c++/20118 + * parser.c (cp_parser_check_template_parameters): Take a + cp_declarator parameter. + (cp_parser_elaborated_type_specifier): Update to + cp_parser_check_template_parameters. + (cp_parser_class_head): Likewise. + (cp_parser_check_declarator_template_parameters): Likewise. + (cp_parser_check_template_parameters): Handle first the non-error + conditions. Give more accurate diagnostics if a declarator is + given. + +2009-04-08 Jason Merrill + + PR c++/25185 + * error.c (dump_aggr_type): Chase template typedefs if + -fno-pretty-templates. + +2009-04-08 Dodji Seketeli + + PR c++/39637 + * parser.c (cp_parser_enumerator_definition): Make sure the + initializer of the enumerator doesn't contain any bare parameter pack. + +2009-04-07 Jason Merrill + + PR c++/34691 + * name-lookup.c (merge_functions): Keep multiple extern "C" functions. + * call.c (joust): Complain about mismatched default arguments + in extern "C" functions. + * class.c (resolve_address_of_overloaded_function): Handle multiple + extern "C" functions. + * pt.c (resolve_overloaded_unification): Likewise. + +2009-04-07 Jason Merrill + + PR c++/25185 + * error.c (dump_function_decl): Don't pretty-print templates + if -fno-pretty-templates. + (count_non_default_template_args): Print all args if + -fno-pretty-templates. + +2009-04-06 Jason Merrill + + PR c++/35146 + * pt.c (fn_type_unification): For DEDUCE_EXACT check that + the deduced template arguments give us the parameter types + we're looking for. + +2009-04-05 Giovanni Bajo + Jason Merrill + + PR c++/14912 + * error.c (count_non_default_template_args): New fn. + (dump_template_parms): Call it. + (dump_template_argument_list): Call it. Add parms parm. + (dump_template_argument): Adjust call to dump_template_argument_list. + (dump_type, dump_decl): Likewise. + (dump_template_bindings): Refactor logic. + +2009-04-03 Jason Merrill + + PR c++/25185 + * error.c (dump_template_bindings): Look through typedefs in + typename results. + (dump_type) [TYPENAME_TYPE]: Print the typedef name if any. + (find_typenames_r): Also collect typedefs. + * pt.c (unify): Strip typedefs. + + PR c++/39608 + * semantics.c (finish_id_expression): Don't assume a dependent + member of the current instantiation isn't a valid integral + constant expression. Check dependent_scope_p. + * pt.c (dependent_scope_p): Check TYPE_P. + (tsubst_copy): If args is null, just return. + +2009-04-02 Jason Merrill + + PR c++/25185 + * error.c (find_typenames, find_typenames_r): New fns. + (dump_function_decl): Call find_typenames. + (dump_template_bindings): Print typenames as well. + * pt.c (tsubst): Non-static. + * cp-tree.h: Declare it. + +2009-04-02 Dodji Seketeli + + PR c++/26693 + * decl2.c (grokfield): when a typedef appears in a + class, create the typedef variant type node for it. + (save_template_attributes): Creating typedef variant type node + here is now useless. + * decl.c (grokdeclarator): If the typedef'ed struct/class was + anonymous, set the proper type name to all its type variants. + (xref_basetypes) : Fixup the variant types after setting + TYPE_BINFO on REF. + * name-lookup.c (pushdecl_maybe_friend): Reuse the + set_underlying_type function to install typedef variant types. + * cp-tree.h (MEMBER_TYPES_NEEDING_ACCESS_CHECK): New template accessor + macro. + (append_type_to_template_for_access_check): New entry points. + * semantics.c (check_accessibility_of_qualified_id): + When a typedef that is a member of a class appears in a template, + add it to the template. It will be ... + * class.c (finish_struct_bits): Split type variant fixup into ... + (fixup_type_variants): A new entry point. + * pt.c (instantiate_class_template, instantiate_template ): ... access + checked at template instantiation time. + (resolve_type_name_type): The type name should be the name of the + main type variant. + (retrieve_specialization): Specializations of template typedefs aren't + to looked up in DECL_TEMPLATE_INSTANTIATIONS (tmpl). + (append_type_to_template_for_access_check): New entry point. + (tsubst_decl): For typedefs, build the variant type from the correct + original type. + (get_class_bindings): Fix function comment. + (perform_typedefs_access_check): New entry point. + +2009-03-31 Jason Merrill + + PR c++/34691 + * name-lookup.c (pushdecl_maybe_friend): Diagnose mismatched + extern "C" declarations. + + C++ DR 613 + * semantics.c (finish_non_static_data_member): Allow such references + without an associated object in sizeof/decltype/alignof. + + * ptree.c (cxx_print_decl): Pretty-print full name of + function/template. + (cxx_print_type): Pretty-print full name of class. + + * decl.c (grokdeclarator): Reject pointer to qualified function + type. + + PR c++/37806, core issue 547 + * typeck.c (cp_apply_type_quals_to_decl): Don't apply any quals + to a typedef. + * tree.c (cp_build_qualified_type_real): Don't apply restrict to a + function type. + * decl.h (enum decl_context): Add TEMPLATE_TYPE_ARG. + * decl.c (groktypename): Add is_template_arg parameter. + (grokdeclarator): Allow function cv-quals on a template type arg. + * parser.c (cp_parser_new_type_id, cp_parser_type_id): Add + is_template_arg argument in calls to groktypename. + * cp-tree.h: Adjust prototype. + * error.c (dump_type_prefix, dump_type_suffix): Fix plain + FUNCTION_TYPE printing. + + * mangle.c (write_expression): Mangle dependent name as + source-name. + + PR c++/38030, 38850, 39070 + * pt.c (type_dependent_expression_p_push): New fn. + (tsubst_copy_and_build) [CALL_EXPR]: Only do arg-dep lookup when the + substitution makes the call non-dependent. Preserve koenig_p. + * parser.c (cp_parser_postfix_expression): Only do arg-dep lookup + for non-dependent calls. + * semantics.c (finish_call_expr): Revert earlier changes. + * cp-tree.h: Revert change to finish_call_expr prototype. + +2009-03-29 Joseph Myers + + PR preprocessor/34695 + * cp-tree.h (cp_cpp_error): Remove. + * error.c (cp_cpp_error): Remove. + * parser.c (cp_lexer_new_main): Set done_lexing instead of + client_diagnostic and error callback. + +2009-03-28 Paolo Bonzini + + * cp/cp-objcp-common.h (LANG_HOOKS_STATICP): Remove. + * cp/cp-objcp-common.c (cxx_staticp): Remove. + * cp/cp-tree.h (cxx_staticp): Remove. + +2009-03-28 Jakub Jelinek + + PR c++/39554 + * parser.c (cp_parser_postfix_expression): Don't call + warning_if_disallowed_function_p. + +2009-03-27 Jan Hubicka + + * except.c (choose_personality_routine): Set terminate_node to abort + for java exceptions. + +2009-03-27 Dodji Seketeli + Jakub Jelinek + + PR debug/37959 + * cp-objcp-common.h (LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P): Define. + (cp_function_decl_explicit_p): New prototype. + * cp-objcp-common.c (cp_function_decl_explicit_p): New function. + +2009-03-27 Andrew Pinski + + PR c++/38638 + * parser.c (cp_parser_elaborated_type_specifier): If we have a + typename tag and don't have either a TYPE_DECL or a + TEMPLATE_ID_EXPR, set the type to NULL. + +2009-03-27 Simon Martin + + PR c++/37647 + * decl.c (grokdeclarator): Reject [con|de]stuctors in a non-class + scope. + +2009-03-27 Simon Martin + + PR c++/29727 + * decl.c (check_array_designated_initializer): Handle error_mark_node. + +2009-03-27 Manuel Lopez-Ibanez + + PR c++/35652 + * typeck.c (cp_pointer_sum): Adjust call to pointer_int_sum. + +2009-03-26 Andrew Haley + + PR C++/39380 + * decl2.c (possibly_inlined_p): If java exceptions are in use + don't inline a decl unless it is explicitly marked inline. + * lex.c: (pragma_java_exceptions): New variable. + (handle_pragma_java_exceptions): Set pragma_java_exceptions. + * cp-tree.h (pragma_java_exceptions): Declare new variable. + +2009-03-24 Jason Merrill + + PR c++/28274 + * name-lookup.c (pushdecl_maybe_friend): Check default args later. + +2009-03-23 Jakub Jelinek + + PR c/39495 + * semantics.c (handle_omp_for_class_iterator): Swap cond operands and + code if iter is the second operand. + * parser.c (cp_parser_binary_expression): Add no_toplevel_fold_p + argument. If it is set, don't build the toplevel expression with + build_x_binary_op, but build2. + (cp_parser_assignment_expression, cp_parser_omp_for_incr): Adjust + callers. + (cp_parser_omp_for_cond): Don't assume the first operand of the + comparison must be decl. + +2009-03-23 Jason Merrill + + PR c++/37729 + * pt.c (make_fnparm_pack): Split out from... + (instantiate_decl): ...here. + (tsubst_pack_expansion): Handle being called in a late-specified + return type. + + PR c++/39526 + * name-lookup.c (pushdecl_maybe_friend): Don't warn about shadowing + a parm with a parm. + +2009-03-20 Jason Merrill + + PR c++/28879 + * parser.c (cp_parser_direct_declarator): In a template, wrap + non-constant expression in NOP_EXPR with TREE_SIDE_EFFECTS set. + * pt.c (tsubst): Preserve it in a partial instantiation. + (dependent_type_p_r): Don't check value_dependent_expression_p. + * decl.c (compute_array_index_type): Don't check + value_dependent_expression_p if TREE_SIDE_EFFECTS. + + C++ core issue 703 + * typeck2.c (check_narrowing): Don't complain about loss of + precision when converting a floating-point constant. + +2009-03-19 Jakub Jelinek + + PR c/39495 + * parser.c (cp_parser_omp_for_cond): Don't check lhs if decl is NULL. + (cp_parser_omp_for_loop): Always use cp_parser_omp_for_cond. + +2009-03-18 Jakub Jelinek + + * parser.c (struct cp_token): Reorder fields for 64-bit hosts. + (eof_token): Adjust. + +2009-03-18 H.J. Lu + + PR c++/39425 + * parser.c (cp_parser_explicit_specialization): Don't skip the + rest of the specialization when begin_specialization returns + false. + +2009-03-17 Jason Merrill + + * decl.c (grokfndecl): Set DECL_CONTEXT on parms. + (duplicate_decls): Adjust DECL_CONTEXT of newdecl's parms. + * pt.c (check_explicit_specialization): Likewise. + (tsubst_copy) [PARM_DECL]: Return a dummy parm if we don't have a + local specialization. + * tree.c (cp_tree_equal) [PARM_DECL]: Check type and index, not name. + * decl2.c (parm_index): New fn. + * semantics.c (finish_decltype_type): Don't use describable_type. + * mangle.c (write_expression): Likewise. Mangle ALIGNOF_EXPR. + Give a sorry for unsupported codes rather than crash. Mangle + conversions with other than 1 operand. New mangling for PARM_DECL. + * operators.def (ALIGNOF_EXPR): Mangle as "az". + +2009-03-17 Jing Yu + + PR middle-end/39378 + * method.c (use_thunk): Change is_thunk from crtl to cfun. + +2009-03-17 Paolo Carlini + + PR c++/39475 + * semantics.c (check_trait_type): New. + (finish_trait_expr): Use it. + +2009-03-17 Jakub Jelinek + + * name-lookup.c (cp_emit_debug_info_for_using): Emit USING_STMTs + instead of calling imported_module_or_decl debug hook if + building_stmt_tree (). + * cp-gimplify.c (cp_gimplify_expr): Don't assert the first operand + is a NAMESPACE_DECL. + + PR debug/37890 + * name-lookup.c (do_namespace_alias): Don't call global_decl debug + hook at function scope. + + PR debug/39471 + * cp-gimplify.c (cp_gimplify_expr): Don't set DECL_NAME + on IMPORTED_DECL. + +2009-03-09 Jakub Jelinek + + PR c++/39371 + * semantics.c (finish_switch_cond): Don't call get_unwidened. + * decl.c (finish_case_label): Pass SWITCH_STMT_TYPE as 3rd argument + instead of TREE_TYPE (cond). + +2009-03-08 H.J. Lu + + PR c++/39060 + * parser.c (cp_parser_late_parsing_default_args): Continue + the loop when cp_parser_assignment_expression returns + error_mark_node. + +2009-03-07 Jason Merrill + + PR c++/39367 + * init.c (build_new_1): Don't use a VLA type. + (build_vec_init): Handle getting a pointer for BASE. + +2009-03-06 H.J. Lu + + PR c++/37520 + * cp-tree.h: Check NO_DOT_IN_LABEL before NO_DOLLAR_IN_LABEL + when mangling symbols. + +2009-03-06 Paolo Carlini + + PR c++/33492 + * error.c (dump_expr): Don't try to print THROW_EXPRs in full. + +2009-03-06 Alexandre Oliva + + * decl.c (record_builtin_java_type): Use canonicalized integer + types. + +2009-03-04 Jason Merrill + + PR c++/38908 + * class.c (is_really_empty_class): New fn. + * cp-tree.h: Declare it. + * cp-objcp-common.c (cp_expr_size): Use it. + + PR c++/13549 + * semantics.c (perform_koenig_lookup): Handle TEMPLATE_ID_EXPR. + * parser.c (cp_parser_postfix_expression): Call it for + TEMPLATE_ID_EXPR. + * tree.c (is_overloaded_fn): Look through TEMPLATE_ID_EXPR. + (get_first_fn): Likewise. + + PR c++/9634 + PR c++/29469 + PR c++/29607 + Implement DR 224. + * decl.c (make_typename_type): Do look inside currently open classes. + * parser.c (cp_parser_lookup_name): Likewise. + (cp_parser_template_name): Likewise. + * pt.c (dependent_scope_p): New function. + * cp-tree.h: Declare it. + * class.c (currently_open_class): Return fast if T isn't a class. + +2009-02-26 H.J. Lu + + PR c++/37789 + * parser.c (cp_parser_mem_initializer): Return error_mark_node + if cp_parser_mem_initializer_id returns error_mark_node. + +2009-02-24 Richard Guenther + + PR c++/39242 + * pt.c (instantiate_decl): Do not instantiate extern, non-inline + declared functions. + +2009-02-23 H.J. Lu + + PR c++/36411 + * pt.c (coerce_template_template_parms): Return 0 if parameter + is error_mark_node. + +2009-02-23 Jason Merrill + + * pt.c (unify): Call maybe_adjust_types_for_deduction when + deducing from an initializer list. + +2009-02-20 Jason Merrill + + PR c++/39225 + * decl.c (grokdeclarator): Handle ~identifier. + +2009-02-19 Jakub Jelinek + + PR target/39175 + * decl2.c (determine_visibility): If visibility changed and + DECL_RTL has been already set, call make_decl_rtl to update symbol + flags. + +2009-02-19 H.J. Lu + + PR c++/39188 + * cp-tree.h (maybe_commonize_var): New. + + * decl.c (maybe_commonize_var): Make it extern. + + * decl2.c (finish_anon_union): Call maybe_commonize_var. + +2009-02-18 H.J. Lu + + PR c++/39219 + * parser.c (cp_parser_enum_specifier): Apply all attributes. + +2009-02-18 Jason Merrill + + * cfns.h: Tweak pathname for cfns.gperf. + +2009-02-13 Jason Merrill + + PR c++/39070 + * semantics.c (finish_call_expr): Change koenig_p parm to int. + If -1, don't set KOENIG_LOOKUP_P but do keep hidden candidates. + * cp-tree.h: Adjust prototype. + * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Pass -1. + +2009-02-12 Jason Merrill + + PR c++/38950 + * pt.c (unify)[TEMPLATE_PARM_INDEX]: Convert to the tsubsted type. + +2009-02-11 Jason Merrill + + PR c++/39153 + * decl2.c (cp_write_global_declarations): + Check DECL_DEFAULTED_FN, not DECL_ARTIFICIAL. + + PR c++/30111 + * init.c (build_value_init_noctor): Split out from... + (build_value_init): ...here. + (expand_aggr_init_1): Handle value-initialization. + * cp-tree.h: Add declaration. + * class.c (type_has_user_provided_constructor): + Handle non-class arguments. + +2009-02-10 Jason Merrill + + PR c++/38649 + * class.c (defaultable_fn_p): Handle ... properly. + + PR c++/36744 + * tree.c (lvalue_p_1): Condition rvalue ref handling on + treat_class_rvalues_as_lvalues, too. + +2009-02-10 Paolo Carlini + + PR c++/34397 + * typeck.c (build_x_array_ref): New. + * cp-tree.h: Declare it. + * pt.c (tsubst_copy_and_build): Use it for case ARRAY_REF. + +2009-02-09 Jason Merrill + + PR c++/39109 + * semantics.c (simplify_aggr_init_expr): Do zero-initialization here. + * init.c (build_value_init): Not here. Don't build a TARGET_EXPR. + * tree.c (get_target_expr): Handle AGGR_INIT_EXPR. + * cp-gimplify.c (cp_gimplify_init_expr): Remove special handling + for build_value_init TARGET_EXPR. + * cp-tree.h (AGGR_INIT_ZERO_FIRST): New macro. + +2009-02-06 Paolo Carlini + + PR c++/35147 + PR c++/37737 + * cp-tree.h (TMPL_ARGS_HAVE_MULTIPLE_LEVELS): Check TREE_VEC_LENGTH. + +2009-02-04 Jakub Jelinek + + PR c++/39095 + * operators.def: Use COMPONENT_REF code for ->/pt operator again, + remove ./dt operator. + * mangle.c (write_expression): Handle COMPONENT_REF after handling + ADDR_EXPR, for COMPONENT_REF without ARROW_EXPR inside of it + write_string ("dt") instead of using operators.def. + +2009-02-03 Jason Merrill + + * typeck.c (cp_build_unary_op): Only complain about taking address + of main if pedantic. + +2009-02-03 Jakub Jelinek + + PR inline-asm/39059 + * parser.c (cp_parser_primary_expression): Reject FIXED_CSTs. + + PR c++/39056 + * typeck2.c (digest_init_r): Don't call process_init_constructor + for COMPLEX_TYPE. + +2009-02-03 Paolo Bonzini + + PR c++/36897 + * pt.c (convert_nontype_argument_function): Expect expr to be an + ADDR_EXPR. + + PR c++/37314 + * typeck.c (merge_types): Call resolve_typename_type if only + one type is a typename. + +2009-02-02 Jason Merrill + + PR c++/39054 + * parser.c (cp_parser_unqualified_id): Don't wrap error_mark_node + in BIT_NOT_EXPR. + +2009-02-01 Paolo Carlini + + PR c++/39053 + * parser.c (cp_parser_pure_specifier): If there are no tokens left + do not call cp_lexer_consume_token. + +2009-01-30 Jakub Jelinek + + PR c++/39028 + * parser.c (cp_parser_already_scoped_statement): Handle __label__ + declarations. + +2009-01-30 Paolo Carlini + + PR c++/33465 + * error.c (dump_expr): Handle FIX_TRUNC_EXPR and FLOAT_EXPR. + +2009-01-30 Paolo Carlini + + PR c++/38655 + * error.c (dump_type_prefix, dump_type_suffix): Handle FIXED_POINT_TYPE. + +2009-01-29 Paolo Carlini + + * typeck.c (invalid_nonstatic_memfn_p): Use + DECL_NONSTATIC_MEMBER_FUNCTION_P. + +2009-01-27 Paolo Carlini + + PR c++/37554 + * call.c (build_over_call): If convert_for_arg_passing returns + error_mark_node unconditionally return it. + +2009-01-22 Adam Nemet + + * class.c (check_field_decls): Also inherit packed for bitfields + regardless of their type. + +2009-01-22 Dodji Seketeli + + PR c++/38930 + * decl2.c (grokfield): Reverting changes of PR c++/26693 + (save_template_attributes): Likewise. + * decl.c (grokdeclarator): Likewise. + * name-lookup.c (pushdecl_maybe_friend): Likewise. + * cp-tree.h (MEMBER_TYPES_NEEDING_ACCESS_CHECK): Likewise. + (append_type_to_template_for_access_check): Likewise. + * semantics.c (check_accessibility_of_qualified_id): Likewise. + * pt.c (instantiate_class_template, instantiate_template ): Likewise. + (tsubst): Likewise. + (resolve_type_name_type): Likewise. + (append_type_to_template_for_access_check): Likewise. + +2009-01-21 Dodji Seketeli + + PR c++/26693 + * decl2.c (grokfield): when a typedef appears in a + class, create the typedef variant type node for it. + (save_template_attributes): Creating typedef variant type node + here is now useless. + * decl.c (grokdeclarator): If the typedef'ed struct/class was + anonymous, set the proper type name to all its type variants. + * name-lookup.c (pushdecl_maybe_friend): Reuse the + set_underlying_type function to install typedef variant types. + * cp-tree.h (MEMBER_TYPES_NEEDING_ACCESS_CHECK): New template accessor + macro. + (append_type_to_template_for_access_check): New entry points. + * semantics.c (check_accessibility_of_qualified_id): + When a typedef that is a member of a class appears in a template, + add it to the template. It will be ... + * pt.c (instantiate_class_template, instantiate_template ): ... access + checked at template instantiation time. + (tsubst): Handle the case of being called with NULL args. + (resolve_type_name_type): The type name should be the name of the + main type variant. + (append_type_to_template_for_access_check): New entry point. + +2009-01-19 Jason Merrill + + PR c++/23287 + * parser.c (cp_parser_unqualified_id): In a template, + accept ~identifier. + * typeck.c (lookup_destructor): Handle IDENTIFIER_NODE. + +2009-01-16 Jason Merrill + + PR c++/38877 + * tree.c (lvalue_p_1): Allow non-fields in COMPONENT_REF. + * init.c (build_new): Don't call describable_type unless we + have an auto. + + PR c++/29470 + * pt.c (tsubst_decl) [USING_DECL]: Propagate access flags. + + PR c++/38579 + * search.c (protected_accessible_p): N doesn't vary. + +2009-01-15 Jason Merrill + + PR c++/38850 + * pt.c (tsubst_copy_and_build): Tell finish_call_expr to + accept hidden friends. + +2009-01-15 Andrew Pinski + + PR C++/29388 + * decl.c (grokdeclarator): Check for a non namespace/class context. + +2009-01-15 Jason Merrill + + PR c++/36334 + PR c++/37646 + * tree.c (lvalue_p_1): Handle BASELINK. A COMPONENT_REF to + a function isn't necessarily an lvalue. Take tree, not const_tree. + (lvalue_p, real_lvalue_p): Take tree, not const_tree. + * typeck.c (lvalue_or_else): Likewise. + * cp-tree.h: Adjust prototypes. + +2009-01-15 Steve Ellcey + + PR c++/38357 + * pt.c (tsubst): Check for NULL args. + +2009-01-15 Dodji Seketeli + + PR c++/38636 + * name-lookup.c (pushtag): Don't create members to types that are not + being created. + +2009-01-14 Nick Clifton + + PR c++/37862 + * parser.c: Pass cp_id_kind computed in + cp_parser_postfix_dot_deref_expression to + cp_parser_primary_expression. + +2009-01-13 Jakub Jelinek + + PR c++/38795 + * tree.c (cp_walk_subtrees): Handle REINTERPRET_CAST_EXPR, + STATIC_CAST_EXPR, CONST_CAST_EXPR and DYNAMIC_CAST_EXPR the same + as CAST_EXPR. + +2009-01-12 Jason Merrill + Steve Ellcey + + PR c++/35109 + * name-lookup.c (lookup_name_real): Keep looking past a hidden + binding. + +2009-01-12 Dodji Seketeli + + PR c++/36019 + * pt.c (parameter_of_template_p): New function. + * cp-tree.h: Declare it. + * name-lookup.c (binding_to_template_parms_of_scope_p): New + function. + (outer_binding): Take template parameters in account when looking for + a name binding. + +2009-01-12 Jason Merrill + + PR c++/31488 + * tree.c (pod_type_p): Return 1 for structs created by the back end. + +2009-01-12 Jakub Jelinek + + PR c/32041 + * parser.c (cp_parser_builtin_offsetof): Allow `->' in + offsetof member-designator, handle it as `[0].'. + + PR c++/38794 + * decl.c (start_function): If grokdeclarator hasn't returned + FUNCTION_DECL nor error_mark_node, issue diagnostics. + +2009-01-11 Jakub Jelinek + + PR c++/36254 + * cp-gimplify.c (genericize_if_stmt): Renamed from ... + (gimplify_if_stmt): ... this. + (cp_gimplify_expr): Don't handle IF_STMT here. + (cp_genericize_r): Call genericize_if_stmt for IF_STMT. + +2009-01-10 Andrew Pinski + + PR c++/38648 + * typeck.c (cp_build_modify_expr): Check for NULL current_function_decl. + + PR c++/36695 + * typeck2.c (build_functional_cast): Check for reference type and NULL + PARMS. + +2009-01-09 Steve Ellcey + + * typeck.c (cp_build_unary_op): Check for ERROR_MARK. + +2009-01-09 Jakub Jelinek + + PR c++/35335 + * error.c (dump_expr): Handle EXPR_STMT like BIND_EXPR. + +2009-01-09 John F. Carr + + PR c++/37877 + * parser.c (cp_parser_class_specifier): Clear + parser->in_unbraced_linkage_specification_p while parsing class + specifiers. + +2009-01-07 Jakub Jelinek + + PR c++/38725 + * semantics.c (finish_goto_stmt): Convert destination to + void *. + +2009-01-06 Jason Merrill + + PR c++/35297 + PR c++/35477 + PR c++/35784 + PR c++/36846 + PR c++/38276 + * pt.c (check_default_tmpl_args): Don't complain about + out-of-order parameter packs in the enclosing class + or parameter packs after default args. + (coerce_template_parms): If we have more than one + parameter pack, don't flatten argument packs. + (template_args_equal): Handle argument packs. + (comp_template_args): Don't flatten argument packs. + (check_instantiated_arg): Split out from... + (check_instantiated_args): Here. Handle arg packs. + (convert_template_argument): Just check that nontype argument + packs have the right type. + +2009-01-05 Dodji Seketeli + + PR c++/38472 + * typeck.c (type_after_usual_arithmetic_conversions): Fix a typo. + +2009-01-05 Jason Merrill + + PR c++/38698 + * typeck2.c (process_init_constructor_union): Handle union with + no fields. + + * mangle.c (write_expression): Remove mangling for zero-operand + casts. + + PR c++/38701 + * decl.c (cp_finish_decl): Clear DECL_INITIAL for invalid + defaulting. + + PR c++/38702 + * class.c (defaultable_fn_p): Only operator== can be a copy + assignment operator. + +2009-01-02 Jason Merrill + + PR c++/38698 + * typeck2.c (process_init_constructor_union): Handle excess + initializers. + (process_init_constructor_record): Likewise. + + PR c++/38684 + * typeck2.c (digest_init_r): Don't use process_init_constructor + for non-aggregate classes. + + +Copyright (C) 2009 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog-2010 b/gcc/cp/ChangeLog-2010 new file mode 100644 index 000000000..5f563157c --- /dev/null +++ b/gcc/cp/ChangeLog-2010 @@ -0,0 +1,4064 @@ +2010-12-28 Jason Merrill + + PR c++/47068 + * semantics.c (finish_id_expression): Don't note non-names + as being used in the class. + +2010-12-23 Jason Merrill + + * parser.c (cp_parser_unary_expression): Remove redundant C++0x + check. + +2010-12-27 Jakub Jelinek + + PR c++/46626 + * semantics.c (build_data_member_initialization): For CLEANUP_STMT + recurse into CLEANUP_BODY. + +2010-12-25 Kai Tietz + + PR c++/15774 + * decl.c (decls_match): Check for FUNCTION_DECL + also for identity of compatible attributes. + +2010-12-22 Nathan Froyd + + * decl.c (decls_match, duplicate_decls): Use prototype_p. + * pt.c (push_template_decl_real): Likewise. + +2010-12-22 Jason Merrill + + PR c++/47003 + * tree.c (stabilize_expr): Really stabilize scalar glvalues. + +2010-12-22 Rodrigo Rivas Costa + + * parser.c (cp_parser_unary_expression): Call pedwarn for alignof + with expression. + +2010-12-18 Nicola Pero + + * parser.c (cp_parser_objc_try_catch_finally_statement): Call + objc_maybe_warn_exceptions. + (cp_parser_objc_synchronized_statement): Same change. + +2010-12-18 Joseph Myers + + * pt.c (most_specialized_class): Use ngettext to determine + "candidates are:" / "candidate is" message. + +2010-12-17 Jason Merrill + + PR c++/46670 + * pt.c (value_dependent_expression_p) [ARRAY_REF]: Handle + properly. + +2010-12-15 Nathan Froyd + + PR c++/39859 + PR c++/44522 + PR c++/44523 + * parser.c (struct cp_parser): Add colon_corrects_to_scope_p field. + (cp_parser_new): Initialize it. + (cp_parser_nested_name_specifier_opt): Auto-correct colons to + scopes if we are able to. + (cp_parser_question_colon_clause): Disallow colon correction. + (cp_parser_label_for_labeled_statement): Likewise. + (cp_parser_range_for): Likewise. + (cp_parser_enum_specifier): Likewise. + (cp_parser_class_head): Likewise. + (cp_parser_member_declaration): Likewise. + +2010-12-15 Nathan Froyd + + PR c++/46852 + * parser.c (cp_parser_class_specifier): Check for TYPE_P. + +2010-12-15 Jakub Jelinek + + PR debug/46815 + * cp-gimplify.c (cp_genericize): When changing RESULT_DECL + into invisible reference, change also DECL_VALUE_EXPR of + NRV optimized variable. + +2010-12-15 Paolo Carlini + + PR c++/42083 + * init.c (build_value_init): Check build_special_member_call return + value for error_mark_node. + +2010-12-14 Jason Merrill + + PR c++/46930 + * decl.c (grokdeclarator): Reject uninitialized constexpr + static data member. + +2010-12-14 Nathan Froyd + + PR c++/45330 + * cp-tree.h (suggest_alternatives_for): Add location_t parameter. + * name-lookup.c (suggest_alternatives_for): Likewise. Adjust. + * lex.c (unqualified_name_lookup_error): Adjust call to it. + * semantics.c (qualified_name_lookup_error): Move to... + * error.c (qualified_name_lookup_error): ...here. Call. + suggest_alternatives_for. + +2010-12-13 Jason Merrill + + PR c++/46873 + PR c++/46877 + * semantics.c (build_data_member_initialization): Handle + cv-qualified data member. + +2010-12-13 Jan Hubicka + + PR middle-end/45388 + * decl2.c (start_objects): Do not generate collect2 recognicable name + for static ctor. + +2010-12-12 Paolo Carlini + + PR c++/46901 + * typeck.c (convert_for_assignment): Fix typo in warning message. + +2010-12-10 Jakub Jelinek + + PR c++/46001 + * decl.c (record_builtin_java_type): Call build_distinct_type_copy + on build_nonstandard_integer_type result for __java_* types. + +2010-12-10 Nathan Froyd + + * decl.c (grokmethod): Test DECL_CLASS_SCOPE_P. + * error.c (dump_decl): Test DECL_FILE_SCOPE_P. + +2010-12-10 Nathan Froyd + + * cp-tree.h (readonly_error_kind): Delete. + (readonly_error): Rename to... + (cxx_readonly_error): ...this. Change second argument to be an + enum lvalue_use. + * semantics.c (finish_asm_stmt): Call cxx_readonly_error. + * typeck.c (cp_build_unary_op): Likewise. + (cp_build_modify_expr): Likewise. + * typeck2.c (readonly_error): Rename to... + (cxx_readonly_error): ...this. Delegate to readonly_error for + most cases. + +2010-12-10 Nicola Pero + + * parser.c (cp_parser_objc_superclass_or_category): Recognize + Objective-C 2.0 class extensions. Added iface_p and + is_class_extension arguments. + (cp_parser_objc_class_interface): Updated call to + cp_parser_objc_superclass_or_category. + (cp_parser_objc_class_implementation): Same change. + +2010-12-09 Nathan Froyd + + * call.c (print_conversion_rejection): Indent messages two spaces. + +2010-12-09 Nathan Froyd + + * typeck.c (cp_build_indirect_ref): Call invalid_indirection_error. + +2010-12-09 Nathan Froyd + + * typeck.c (composite_pointer_error): New function. + (composite_pointer_type_r, composite_pointer_type): Call it. + +2010-12-08 Jason Merrill + + PR c++/46348 + * semantics.c (cxx_eval_vec_init_1): Handle value-init. + (cxx_eval_vec_init): Pass value_init arg. + +2010-12-08 Nathan Froyd + + PR c++/45329 + * call.c (struct conversion): Document bad_p field. + (enum rejection_reason_code): Define. + (struct conversion_info): Define. + (struct rejection_reason): Define. + (struct z_candidate): Add `reason' field. + (add_candidate): Add `reason' parameter. Store it in CAND. + (alloc_rejection, arity_rejection, arg_conversion_rejection): + New functions. + (bad_arg_conversion_rejection): New function. + (convert_class_to_reference): Add comment. + (remaining_arguments): New function. + (add_function_candidate): Record rejection reason and pass it to + add_candidate. + (add_conv_candidate, build_builtin_candidate): Likewise. + (add_template_candidate_real): Likewise. + (print_conversion_rejection): New function. + (print_z_candidate): Print CAND->REASON if it exists. Adjust + diagnostic strings. + (print_z_candidates): Add location_t argument. Adjust calling + sequence for print_z_candidate. Print header line directly. + (build_user_type_conversion_1): Add reason for rejection to + CAND. Adjust call to print_z_candidates. + (print_error_for_call_failure): New function. + (build_new_function_call): Call it. Adjust call to + print_z_candidates. + (build_operator_new_call): Likewise. + (build_op_call): Likewise. + (build_conditional_expr): Likewise. + (build_new_op): Likewise. + (build_new_method_call): Likewise. + +2010-12-08 Jason Merrill + + PR c++/45822 + * cp-tree.h (LOOKUP_DEFAULTED): New. + * call.c (add_function_candidate): Check it. + * method.c (synthesized_method_walk): Set it. + (do_build_copy_assign): Likewise. + * init.c (perform_member_init): Likewise. + (emit_mem_initializers): Likewise. + + PR c++/46736 + * decl.c (cp_finish_decl): Complain about an implicitly deleted + method defaulted outside the class. + * method.c (maybe_explain_implicit_delete): Don't check DECL_INITIAL. + +2010-12-07 Joseph Myers + + * rtti.c: Don't include assert.h. + +2010-12-07 Nathan Froyd + + PR c++/45330 + * cp-tree.h (suggest_alternatives_for, location_of): Declare. + * error.c (dump_expr): Handle TYPE_DECL. + (location_of): Unstaticize. + * name-lookup.c (suggest_alternatives_for): New function. + * lex.c (unqualified_name_lookup_error): Call it. + +2010-12-06 Nicola Pero + + * call.c: Include c-family/c-objc.h. + * decl.c: Same change. + * decl2.c: Same change. + * error.c: Same change. + * lex.c: Same change. + * parser.c: Same change. + * pt.c: Same change. + * semantics.c: Same change. + * typeck.c: Same change. + * Make-lang.in (cp/decl.o): Depend on c-family/c-objc.h. + (cp/decl2.o): Same change. + (cp/call.o): Same change. + (cp/error.o): Same change. + (cp/lex.o): Same change. + (cp/parser.o): Same change. + (cp/pt.o): Same change. + (cp/semantics.o): Same change. + (cp/typeck.o): Same change. + * config-lang.in (gtfiles): Added c-family/c-objc.h. + +2010-12-03 Jason Merrill + + PR c++/46645 + * semantics.c (build_data_member_initialization): Remove assert. + + PR c++/46058 + * tree.c (lvalue_kind) [SCOPE_REF]: Handle non-dependent case. + +2010-12-03 Richard Guenther + + PR c/46745 + * error.c (dump_expr): Handle MEM_REF. + +2010-12-03 Laurynas Biveinis + + * cp-tree.h (struct aggr_init_expr_arg_iterator_d): Remove GTY + tag. + +2010-12-02 Nicola Pero + + * parser.c (cp_parser_objc_throw_statement): Use + cp_parser_expression, not cp_parser_assignment_expression, to + parse the argument of a @throw. + +2010-12-01 Joseph Myers + + * cp-objcp-common.c, lex.c, typeck.c: Don't include toplev.h. + * Make-lang.in (cp/lex.o, cp/cp-objcp-common.o, cp/typeck2.o): + Update dependencies. + +2010-11-30 Nicola Pero + + * decl.c (finish_function): Call objc_finish_function when + compiling Objective-C++. + * call.c (standard_conversion): Do not call + objc_non_volatilized_type(). + (implicit_conversion): Same change. + * typeck.c (comp_ptr_ttypes_real): Same change. + +2010-11-30 Joseph Myers + + * cp-gimplify.c, cp-lang.c, cvt.c, cxx-pretty-print.c, error.c, + except.c, expr.c, friend.c, init.c, mangle.c, name-lookup.c, + optimize.c, parser.c, rtti.c, tree.c, typeck2.c: Don't include + toplev.h. + * Make-lang.in: Dependencies for above files changed to remove + toplev.h. + +2010-11-29 Dodji Seketeli + + PR c++/42260 + * call.c (add_builtin_candidate): At this point the resulting type + of an indirection operator should be complete. + +2010-11-29 Dodji Seketeli + + PR c++/45383 + Reverted patch for PR c++/42260 + * cp-tree.h (lookup_conversions): Reverted "Add new bool parameter to + declarationE." + * search.c (lookup_conversion): Reverted "Use new bool parameter in + definition". + * call.c (add_builtin_candidates): Reverted "Don't lookup template + conversion" + (convert_class_to_reference, build_user_type_conversion_1, + build_op_call): Reverted "Adjust". + * cvt.c (build_expr_type_conversion): Reverted "Likewise". + +2010-11-29 Nicola Pero + + * parser.c (cp_parser_objc_try_catch_finally_statement): Parse + @catch(...) and pass NULL_TREE to objc_begin_catch_clause() in + that case. Improved error recovery. Reorganized code to be + almost identical to c_parser_objc_try_catch_finally_statement. + +2010-11-27 Nicola Pero + + PR objc++/46222 + * decl.c (grokdeclarator): Replaced an assert (for a case that can + never happen in C++, but could happen in ObjC++ for invalid code) + with a check that prints an error message and returns + error_mark_node. + +2010-11-23 Jeffrey Yasskin + + PR c++/46527 + * pt.c (instantiate_decl): Propagate the template's location to + its instance. + +2010-11-20 Joseph Myers + + * name-lookup.c (handle_namespace_attrs): Don't check + HANDLE_PRAGMA_VISIBILITY. + * parser.c (cp_parser_namespace_definition): Don't check + HANDLE_PRAGMA_VISIBILITY. + +2010-11-20 Nathan Froyd + + PR c++/16189 + PR c++/36888 + PR c++/45331 + * parser.c (cp_lexer_set_token_position): New function. + (cp_lexer_previous_token_position): New function. + (cp_lexer_previous_token): Call it. + (cp_parser_class_specifier): Try to gracefully handle a missing + semicolon. + +2010-11-20 Jakub Jelinek + + PR c++/46538 + * decl.c (cp_make_fname_decl): Return error_mark_node if + current_binding_level has already sk_function_parms kind. + + PR c++/46526 + * semantics.c (cxx_eval_call_expression): Unshare the result. + +2010-11-19 Nicola Pero + + * parser.c (cp_parser_objc_protocol_declaration): Pass attributes + to objc_declare_protocols. + +2010-11-18 Nathan Froyd + + PR c/33193 + * typeck.c (cp_build_unary_op): Call build_real_imag_expr for + REALPART_EXPR and IMAGPART_EXPR. + +2010-11-16 Jason Merrill + + * call.c (convert_like_real): Don't make a temp for copy-list-init. + (build_over_call): Don't handle that here. + (build_new_method_call): Use COMPLETE_OR_OPEN_TYPE_P for error. + + PR c++/46497 + * call.c (build_over_call): Check for =delete even when trivial. + + DR 1004 + * decl.c (make_unbound_class_template): Handle using + injected-type-name as template. + +2010-11-15 Nicola Pero + + * typeck.c (cp_build_unary_op): Use + objc_build_incr_expr_for_property_ref to build the pre/post + increment/decrement of an Objective-C property ref. + +2010-11-13 Jason Merrill + + * decl.c (cp_finish_decl): Use resolve_nondeduced_context for auto. + * init.c (build_new): Likewise. + * pt.c (tsubst_decl): Likewise. + (do_auto_deduction): Likewise. + (resolve_nondeduced_context): Use build_offset_ref and + cp_build_addr_expr. + +2010-11-12 Joseph Myers + + * Make-lang.in (g++spec.o): Use $(OPTS_H). + +2010-11-13 Ville Voutilainen + + Core 1135, 1136, 1145, 1149 + * method.c (defaultable_fn_check): Do not disallow defaulting a + non-public or explicit special member function on its first + declaration. + +2010-11-12 James Dennett + + PR/39415 + * typeck.c (build_static_cast_1): Convert to the target type + when doing static_cast(Base*). + +2010-11-10 Jason Merrill + + PR c++/46420 + * pt.c (tsubst_copy_and_build) [TARGET_EXPR]: New case. + [CONSTRUCTOR]: Use the tsubsted type. + + PR c++/46369 + * semantics.c (cxx_eval_bit_field_ref): New. + (cxx_eval_constant_expression): Call it. + +2010-11-10 Joseph Myers + + * cvt.c (cp_convert_to_pointer): Use %' in diagnostic. + * decl.c (layout_var_decl, maybe_commonize_var, grokdeclarator): + Use %' in diagnostics. + * decl2.c (check_classfn): Use %' in diagnostic. + * init.c (build_java_class_ref): Use %' in diagnostic. + (build_delete): Remove trailing '.' from diagnostic. + * method.c (do_build_copy_assign, walk_field_subobs): Use %' in + diagnostics. + * name-lookup.c (pushdecl_maybe_friend): Use %' in diagnostic. + * parser.c (cp_parser_exception_specification_opt): Remove + trailing '.' from diagnostic. + (cp_parser_objc_interstitial_code): Use %qs for quoting in + diagnostic. + * pt.c (check_valid_ptrmem_cst_expr): Use %< and %> for quoting in + diagnostic. + * repo.c (reopen_repo_file_for_write): Use %' in diagnostic. + +2010-11-10 Nathan Froyd + + PR c++/46065 + * decl.c (poplevel_named_label_1): Use TREE_CHAIN if necessary. + +2010-11-09 Jakub Jelinek + + PR c++/45894 + * tree.c (lvalue_kind): Don't crash if ref has NULL type. + +2010-11-08 Jason Merrill + + PR c++/46382 + * semantics.c (check_constexpr_ctor_body): New fn. + * parser.c (cp_parser_ctor_initializer_opt_and_function_body): Call it. + * cp-tree.h: Declare it. + + PR c++/46335 + * tree.c (bot_manip): Check TREE_SIDE_EFFECTS as well. + + Correct conversion/overflow behavior. + * cvt.c (ignore_overflows): Move here from typeck.c. + (ocp_convert): Use it. + (cp_fold_convert): Use it. Don't call rvalue. + * typeck.c (build_static_cast_1): Don't use it. Do call rvalue. + * error.c (location_of): Handle expressions, too. + * class.c (check_bitfield_decl): Set input_location around call to + cxx_constant_value. + * semantics.c (cxx_eval_outermost_constant_expr): Don't + print the expression if it already had TREE_OVERFLOW set. + (reduced_constant_expression_p): Check TREE_OVERFLOW_P for C++98, too. + (verify_constant): Allow overflow with a permerror if we're + enforcing. + (cxx_eval_outermost_constant_expr): Use verify_constant. + (adjust_temp_type): Use cp_fold_convert. + * decl.c (build_enumerator): Don't call constant_expression_warning. + * decl2.c (grokbitfield): Likewise. + +2010-11-06 Jason Merrill + + PR c++/46348 + * init.c (perform_member_init): Use build_vec_init_expr for + value-init of arrays, too. + * cp-gimplify.c (cp_gimplify_expr): Use VEC_INIT_EXPR_VALUE_INIT. + * cp-tree.h (VEC_INIT_EXPR_IS_CONSTEXPR): New macro. + (VEC_INIT_EXPR_VALUE_INIT): New macro. + * semantics.c (potential_constant_expression): No longer static. + Check VEC_INIT_EXPR_IS_CONSTEXPR. + * tree.c (build_vec_init_expr): Handle value-init. Set + VEC_INIT_EXPR_IS_CONSTEXPR and VEC_INIT_EXPR_VALUE_INIT. + +2010-11-06 Nathan Froyd + + PR c++/45332 + * parser.c (cp_lexer_previous_token): New function. + (cp_parser_member_declaration): Use previous token for error + messages. Assume semicolon presence rather than grovelling for + the next one. + +2010-11-06 Joern Rennecke + + PR middle-end/46314 + * method.c (make_alias_for_thunk): + Use targetm.asm_out.generate_internal_label. + +2010-11-05 Jason Merrill + + PR c++/45473 + * search.c (look_for_overrides): A constructor is never virtual. + +2010-11-05 Jakub Jelinek + + PR c++/46160 + * cp-gimplify.c (cp_gimplify_expr): Drop volatile MEM_REFs + on the RHS to avoid infinite recursion with gimplify_expr. + +2010-11-05 Jason Merrill + + PR c++/46304 + * pt.c (tsubst_copy): Handle COMPLEX_CST. + +2010-11-04 Nicola Pero + + Fixed using the Objective-C 2.0 dot-syntax with class names. + * parser.c (cp_parser_primary_expression): Recognize Objective-C + 2.0 dot-syntax with class names and process it. + (cp_parser_nonclass_name): Recognize Objective-C 2.0 dot-syntax + with class names. + (cp_parser_class_name): Same change. + (cp_parser_simple_type_specifier): Tidied comments. + +2010-11-04 Jason Merrill + + PR c++/46298 + * semantics.c (build_constexpr_constructor_member_initializers): + Handle an enclosing STATEMENT_LIST. + + * semantics.c (speculative_access_check): New. + * cp-tree.h: Declare it. + * call.c (build_over_call): Use it. + * class.c (type_has_constexpr_default_constructor): Use locate_ctor. + * method.c (locate_ctor): Use push/pop_deferring_access_checks. + +2010-11-03 Jason Merrill + + PR c++/46293 + * semantics.c (build_data_member_initialization): Handle + value-init of aggregate empty base. + + PR c++/46289 + * call.c (can_convert_array): New fn. + (build_aggr_conv): Use it. + + PR c++/46289 + * semantics.c (build_constexpr_constructor_member_initializers): + Avoid ICE on error. + +2010-11-02 Dodji Seketeli + + * cp-tree.h (enum tsubst_flags): + Remove. + * pt.c (tsubst): Remove the use of tf_no_class_instantiations. + +2010-11-03 Jason Merrill + + PR c++/46277 + * init.c (expand_default_init): Avoid ICE if we can't figure out + which function is being called. + +2010-11-02 Nathan Froyd + + * class.c (build_base_path, add_vcall_offset): Use build_zero_cst + instead of fold_convert. + * init.c (build_zero_init): Likewise. + * typeck.c (cp_build_binary_op): Likewise. + +2010-11-02 Dodji Seketeli + + PR c++/46170 + PR c++/46162 + * pt.c (check_valid_ptrmem_cst_expr): Add a complain parameter to + control diagnostic. + (convert_nontype_argument, convert_nontype_argument): Pass the + complain parameter down to check_valid_ptrmem_cst_expr. + +2010-11-02 Dodji Seketeli + + PR c++/45606 + * cp-tree.h (TEMPLATE_TYPE_PARM_SIBLING_PARMS): Remove. + (struct template_parm_index_s): New field. + (TEMPLATE_PARM_NUM_SIBLINGS): New accessor. + (process_template_parm): Extend the API to accept the number of + template parms in argument. + (cp_set_underlying_type): Remove this. + * class.c (build_self_reference): Require canonical type equality + back on the self reference of class. + * decl2.c (grokfield): Require canonical type equality back on + typedef class fields. + * name-lookup.c (pushdecl_maybe_friend): Require canonical type + equality back on typedefs. + * parser.c (cp_parser_template_parameter_list): Do not require + canonical type equality on dependent types created during template + parameters parsing. + * pt.c (fixup_template_type_parm_type, fixup_template_parm_index) + (fixup_template_parm, fixup_template_parms): New private + functions. + (current_template_args): Declare this. + (process_template_parm): Pass the total number of template parms + to canonical_type_parameter. + (build_template_parm_index): Add a new argument to carry the total + number of template parms. + (reduce_template_parm_level, process_template_parm, make_auto): + Adjust. + (current_template_args): Fix this for template template + parameters. + (tsubst_template_parm): Split out of ... + (tsubst_template_parms): ... this. + (reduce_template_parm_level): Don't loose + TEMPLATE_PARM_NUM_SIBLINGS when cloning a TEMPLATE_PARM_INDEX. + (template_parm_to_arg): Extracted this function from + current_template_args. Make it represent invalid template parms + with an error_mark_node instead of a LIST_TREE containing an + error_mark_node. + (current_template_args): Use template_parm_to_arg. + (dependent_template_arg_p): Consider an invalid template argument + as dependent. + (end_template_parm_list): Do not update template sibling parms + here anymore. Use fixup_template_parms instead. + (process_template_parm): Pass the number of template parms to + canonical_type_parameter. + (make_auto): Require structural equality on auto + TEMPLATE_TYPE_PARM for now. + (unify): Coerce template parameters + using all the arguments deduced so far. + (tsubst): Pass the number of sibling parms to + canonical_type_parameter. + * tree.c (cp_set_underlying_type): Remove. + * typeck.c (get_template_parms_of_dependent_type) + (incompatible_dependent_types_p): Remove. + (structural_comptypes): Do not call incompatible_dependent_types_p + anymore. + (comp_template_parms_position): Re-organized. Take the length of + template parms list in account. + +2010-11-01 Jason Merrill + + * semantics.c (call_stack, call_stack_tick, cx_error_context): New. + (last_cx_error_tick, push_cx_call_context, pop_cx_call_context): New. + (cxx_eval_call_expression): Call push/pop_cx_call_context instead + of giving follow-on errors. + * error.c (maybe_print_constexpr_context): New. + (cp_diagnostic_starter): Call it. + * cp-tree.h: Declare cx_error_context. + + * semantics.c (cxx_eval_constant_expression): Explain + unacceptable use of variable better. + +2010-11-01 Gabriel Dos Reis + Jason Merrill + + * call.c (null_ptr_cst_p): Use maybe_constant_value. + (set_up_extended_ref_temp): Support constant initialization. + (initialize_reference): Adjust. + * class.c (check_bitfield_decl): Use cxx_constant_value. + * cvt.c (ocp_convert): Don't use integral_constant_value when + converting to class type. + * decl.c (finish_case_label): Use maybe_constant_value. + (build_init_list_var_init): Support constant initialization. + (check_initializer): Likewise. Reorganize. + (cp_finish_decl): Likewise. + (expand_static_init): Likewise. + (compute_array_index_type): Use maybe_constant_value. + Add complain parm. + (create_array_type_for_decl, grokdeclarator): Pass it. + (build_enumerator): Use cxx_constant_value. + * decl2.c (grokfield): Use maybe_constant_init. + * except.c (check_noexcept_r): Handle constexpr. + (build_noexcept_spec): Use maybe_constant_value. + * init.c (expand_default_init): Support constant initialization. + (build_vec_init): Likewise. + (constant_value_1): Adjust. + (build_new_1): Adjust. + * parser.c (cp_parser_constant_expression): Allow non-integral + in C++0x mode. + (cp_parser_direct_declarator): Don't fold yet in C++0x mode. + (cp_parser_initializer_clause): Toss folded result if non-constant. + * pt.c (fold_decl_constant_value): Remove. + (convert_nontype_argument): Use maybe_constant_value. Give clearer + error about overflow. + (tsubst): Move array bounds handling into compute_array_index_type. + (value_dependent_expression_p): Handle constant CALL_EXPR. + (tsubst_decl): Don't set + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P yet. + (tsubst_expr) [DECL_EXPR]: Pass it into cp_finish_decl. + (instantiate_decl): Here too. + * semantics.c (finish_static_assert): Use maybe_constant_value. + (ensure_literal_type_for_constexpr_object): Make sure type is complete. + (potential_constant_expression): Use maybe_constant_value. + * tree.c (cast_valid_in_integral_constant_expression_p): Any cast + is potentially valid in C++0x. + * typeck2.c (store_init_value): Handle constant init. + (check_narrowing): Use maybe_constant_value. + (build_functional_cast): Set TREE_CONSTANT on literal T(). + * cp-tree.h (DECL_INTEGRAL_CONSTANT_VAR_P): Remove. + (LOOKUP_ALREADY_DIGESTED): New. + (compute_array_index_type): Adjust prototype. + + * semantics.c (constexpr_call): New datatype. + (constexpr_call_table): New global table. + (constexpr_call_hash): New. + (constexpr_call_equal): Likewise. + (maybe_initialize_constexpr_call_table): Likewise. + (lookup_parameter_binding): Likewise. + (cxx_eval_builtin_function_call): Likewise. + (cxx_bind_parameters_in_call): Likewise. + (cxx_eval_call_expression): Likewise. + (cxx_eval_unary_expression): Likewise. + (cxx_eval_binary_expression): Likewise. + (cxx_eval_conditional_expression): Likewise. + (cxx_eval_array_reference): Likewise. + (cxx_eval_component_reference): Likewise. + (cxx_eval_logical_expression): Likewise. + (cxx_eval_object_construction): Likewise. + (cxx_eval_constant_expression): Likewise. + (cxx_eval_indirect_ref): Likewise. + (cxx_constant_value): Likewise. + (cxx_eval_bare_aggregate): Likewise. + (adjust_temp_type): New. + (reduced_constant_expression_p): New. + (verify_constant): New. + (cxx_eval_vec_init, cxx_eval_vec_init_1): New. + (cxx_eval_outermost_constant_expr): New. + (maybe_constant_value, maybe_constant_init): New. + (cxx_eval_constant_expression): Use them. + * pt.c (iterative_hash_template_arg): No longer static. + * cp-tree.h: Declare fns. + + * cp-tree.h (register_constexpr_fundef): Declare. + * decl.c (maybe_save_function_definition): New. + (finish_function): Use it. + * semantics.c (constexpr_fundef): New datatype. + (constexpr_fundef_table): New global table. + (constexpr_fundef_equal): New. + (constexpr_fundef_hash): Likewise. + (retrieve_constexpr_fundef): Likewise. + (validate_constexpr_fundecl): Store in the table. + (build_data_member_initialization): New fn. + (build_constexpr_constructor_member_initializers): New. + (register_constexpr_fundef): Define. + (is_this_parameter): New. + (get_function_named_in_call): Likewise. + (get_nth_callarg): Likewise. + (check_automatic_or_tls): New. + (morally_constexpr_builtin_function_p): New. + (potential_constant_expression): New. + +2010-11-01 Jason Merrill + + * decl2.c (decl_constant_var_p): New fn. + (decl_maybe_constant_var_p): New fn. + (mark_used): Rework instantiation of things needed for constant + expressions. + * cp-tree.h: Declare new fns. + * pt.c (instantiate_decl): Handle cp_unevaluated_operand. + (always_instantiate_p): Use decl_maybe_constant_var_p. + (instantiate_decl): Don't defer constexpr functions. + * repo.c (repo_emit_p): Use decl_maybe_constant_var_p. + * semantics.c (finish_id_expression): Use decl_constant_var_p. + Check for valid name in constant expr after mark_used. + +2010-10-31 Jason Merrill + + * class.c (is_really_empty_class): Work when type is not complete. + (synthesized_default_constructor_is_constexpr): New. + (add_implicitly_declared_members): Use it. + (type_has_constexpr_default_constructor): Likewise. + * cp-tree.h: Declare it. + * method.c (synthesized_method_walk): Use it. + + * decl.c (pop_switch): Use EXPR_LOC_OR_HERE. + * typeck.c (convert_for_assignment): Likewise. + + * parser.c (cp_parser_diagnose_invalid_type_name): Give helpful + message about constexpr without -std=c++0x. + + * decl.c (grokdeclarator): Don't ICE on constexpr non-static data + member. + +2010-10-30 Nathan Froyd + + * class.c (layout_vtable_decl): Call build_array_of_n_type. + (build_vtt, build_ctor_vtabl_group): Likewise. + +2010-10-30 Nicola Pero + + Implemented Objective-C 2.0 @property, @synthesize and @dynamic. + * parser.c (cp_parser_objc_at_property_declaration): Removed + parsing of RID_COPIES and RID_IVAR. Updated call to + objc_add_property_declaration. + * typecheck.c (finish_class_member_access_expr): Call + objc_maybe_build_component_ref instead of objc_build_setter_call. + (cp_build_modify_expr): Call objc_maybe_build_modify_expr instead + of objc_build_getter_call. + +2010-10-27 Jason Merrill + + * cp-tree.h (cp_trait_kind): Add CPTK_IS_LITERAL_TYPE. + * cxx-pretty-print.c (pp_cxx_trait_expression): Handle it. + * semantics.c (trait_expr_value, finish_trait_expr): Likewise. + * parser.c (cp_parser_primary_expression): Handle RID_IS_LITERAL_TYPE. + (cp_parser_trait_expr): Likewise. + +2010-10-27 Gabriel Dos Reis + Jason Merrill + + * decl.c (finish_case_label): Use decl_constant_value. + + * method.c (synthesized_method_walk): Track constexprness too. + (process_subob_fn, walk_field_subobs): Likewise. + (implicitly_declare_fn): Set DECL_DECLARED_CONSTEXPR_P. + (defaulted_late_check): Handle DECL_DECLARED_CONSTEXPR_P. + * class.c (add_implicitly_declared_members): Handle + constexpr default ctor. + + * parser.c (cp_parser_ctor_initializer_opt_and_function_body): + Make sure a constexpr ctor has an empty body. + * class.c (type_has_constexpr_default_constructor): New. + * cp-tree.h: Declare it. + * init.c (perform_member_init): Complain about uninitialized + member in constexpr ctor. + (emit_mem_initializers): And uninitialized base. + * decl.c (check_tag_decl): Fix typo. + + * semantics.c (valid_type_in_constexpr_fundecl_p): New fn. + (is_valid_constexpr_fn): New fn. + (validate_constexpr_fundecl): Use it. + * decl.c (validate_constexpr_redeclaration): New. + (duplicate_decls): Use it. + (cp_finish_decl): Call validate_constexpr_fundecl and + ensure_literal_type_for_constexpr_object here. + (start_decl): Not here. Don't ICE on constexpr reference. + (check_for_uninitialized_const_var): Don't handle constexpr specially. + (grokfndecl): Set DECL_DECLARED_CONSTEXPR_P. + (check_static_variable_definition): Give friendly message about + missing constexpr. + (grokdeclarator): Complain about typedef and volatile with constexpr. + Reorganize. Give sorry about non-static data members in C++0x mode. + (start_preparsed_function): Check validate_constexpr_fundecl here. + (check_function_type): Not here. + * decl2.c (finish_static_data_member_decl): Don't complain about + in-class init. + * parser.c (CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR): New. + (cp_parser_condition): Pass it to cp_parser_decl_specifier_seq. + (cp_parser_decl_specifier_seq): Handle it. + (cp_parser_explicit_instantiation): Diagnose inline and constexpr. + + * class.c (check_bases): Propagate non-literality. + (check_field_decls): Likewise. + (finalize_literal_type_property): New. + (check_bases_and_members): Call it. + * cp-tree.h (TYPE_HAS_CONSTEXPR_CTOR): New. + (lang_type_class): Add has_constexpr_ctor field. + (DECL_DECLARED_CONSTEXPR_P): Strip template. + * decl.c (grok_special_member_properties): Set + TYPE_HAS_CONSTEXPR_CTOR. + +2010-10-27 Jason Merrill + + * call.c (build_integral_nontype_arg_conv): New. + * cp-tree.h: Declare it. + * pt.c (convert_nontype_argument): Use it. + + * error.c (dump_simple_decl): Print constexpr. + + * cvt.c (build_up_reference): Use target_type for the temporary var. + + * except.c (build_throw): Set EXPR_LOCATION. + + * tree.c (build_cplus_new): Handle CONSTRUCTOR. + + * semantics.c (finish_compound_stmt): Avoid creating an + unnecessary BIND_EXPR. + + * call.c (convert_like_real): Don't check narrowing if the element + is also an initializer-list. + +2010-10-27 Nicola Pero + + * parser.c (cp_parser_objc_at_property_declaration): Recognize + RID_ASSIGN, RID_COPY, RID_RETAIN, RID_READWRITE and RID_NONATOMIC. + Do not use objc_set_property_attr, but use local variables + instead. Detect repeated usage of setter, getter and ivar + attributes. Improved error processing when a setter name does not + end in ':'. Do not check for CPP_CLOSE_PAREN after we determined + that the token is a keyword. Updated call to + objc_add_property_declaration. + +2010-10-27 Nicola Pero + + * parser.c (cp_parser_objc_property_decl): Renamed to + cp_parser_objc_struct_declaration. Return the parsed trees + instead of calling objc_add_property_variable directly. Detect + missing or invalid declspecs. Implemented attributes. Do not eat + the ';' at the end. Exit loop whenever a non-comma is parsed, not + just EOF. + (cp_parser_objc_at_property): Renamed to + cp_parser_objc_at_property_declaration. Updated calls to + objc_add_property_variable, now objc_add_property_declaration, and + to cp_parser_objc_property_decl, now + cp_parser_objc_struct_declaration. Rewritten all code to be more + robust in dealing with syntax errors, and almost identical to the + one in c_parser_objc_at_property_declaration. + (cp_parser_objc_property_attrlist): Removed. + (cp_parser_objc_method_prototype_list): Updated call to + cp_parser_objc_at_property. + (cp_parser_objc_method_definition_list): Same change. + (cp_parser_objc_class_ivars): Detect a number of invalid + declarations of instance variables and produce errors when they + are found. + +2010-10-26 Jason Merrill + + * tree.c (build_vec_init_expr): Split out from... + (build_array_copy): ...here. + * init.c (perform_member_init): Use it. + * cp-tree.h: Declare it. + * cp-gimplify.c (cp_gimplify_init_expr): Don't gimplify the slot for + VEC_INIT_EXPR and AGGR_INIT_EXPR here. Drop pre/post parameters. + (cp_gimplify_expr): Handle array default-initialization via + VEC_INIT_EXPR. + + * tree.c (stabilize_expr): Handle xvalues properly. + + * call.c (build_over_call): Use argarray[0] for 'this' argument. + + * decl.c (finish_function): Don't look at function_depth. + +2010-10-25 Rodrigo Rivas Costa + + Implement opaque-enum-specifiers for C++0x. + * cp-tree.h (SET_OPAQUE_ENUM_P): New. + (OPAQUE_ENUM_P): New. + (ENUM_FIXED_UNDERLYING_TYPE_P): New. + (start_enum): Update prototype. + (finish_enum_value_list): New prototype. + * parser.c (cp_parser_elaborated_type_specifier): Issue a pedwarn if + "enum class" is used in an elaborated-type-specifier. + (cp_parser_enum_specifier): Rewrite to parse opaque-enum-specifiers. + * decl.c (copy_type_enum): New. + (finish_enum_value_list): New, with code from finish_enum. + (finish_enum): A lot of code removed. Added a gcc_assert. + (start_enum): Add parameters enumtype and is_new. + Rewrite to work with opaque-enum-specifiers. + * pt.c (maybe_process_partial_specialization): Allow for template + specialization of enumerations, with a pedwarn. + (lookup_template_class): Update call to start_enum. Call to + SET_OPAQUE_ENUM_P. + (tsubst_enum): Call to begin_scope, finish_scope and + finish_enum_value_list. + +2010-10-24 Nicola Pero + + Removed Objective-C++ specific replacement of cxx_printable_name. + * cp-objcp-common.h: Added LANG_HOOKS_DECL_PRINTABLE_NAME, set + to cxx_printable_name for both C++ and Objective-C++. + * cp-lang.h: Removed LANG_HOOKS_DECL_PRINTABLE_NAME. + + * error.c (dump_decl): For Objective-C++, call + objc_maybe_printable_name here ... + * tree.c (cxx_printable_name_internal): ... instead of here. + +2010-10-23 Nicola Pero + + * tree.c (cxx_printable_name_internal): In Objective-C++, call + objc_maybe_printable_name. + +2010-10-22 Jason Merrill + + PR c++/46129 + * pt.c (instantiate_class_template): Don't instantiate default + arguments. + + PR c++/46103 + * init.c (build_vec_init): Handle memberwise move. + +2010-10-21 Paolo Carlini + + PR c++/46117 + * call.c (add_function_candidate): Don't use TREE_VALUE on null + parmnode. + +2010-10-20 Nicola Pero + + * parser.c (cp_parser_objc_method_type): Mark inline. Return a + bool instead of calling objc_set_method_type. + (cp_parser_objc_method_signature): Updated calls to + cp_parser_objc_method_type and to objc_build_method_signature. + (cp_parser_objc_method_prototype_list): Updated calls to + objc_add_method_declaration. Use token->type to determine if it + is a class method or not. + (cp_parser_objc_method_definition_list): Same change. + +2010-10-20 Rodrigo Rivas Costa + + PR c++/46056 + * parser.c (cp_convert_range_for): Call cp_finish_decl + instead of finish_expr_stmt. + +2010-10-20 Nicola Pero + + * cp-lang.c (finish_file): Removed. + * decl2.c (cp_write_global_declarations): Call + objc_write_global_declarations when compiling Objective-C++. + +2010-10-19 Paolo Carlini + + PR c++/46046 + * pt.c (add_to_template_args): Check extra_args for error_mark_node. + (coerce_template_parms): Likewise for args. + +2010-10-18 Nicola Pero + + Implemented parsing @synthesize and @dynamic for Objective-C++. + * parser.c (cp_parser_objc_method_definition_list): Recognize + RID_AT_SYNTHESIZE and RID_AT_DYNAMIC. + (cp_parser_objc_at_dynamic_declaration): New. + (cp_parser_objc_at_synthesize_declaration): New. + +2010-10-18 Nicola Pero + + * parser.c (cp_parser_objc_identifier_list): Check the return + value of cp_parser_identifier and react if it is error_mark_node. + +2010-10-18 Nicola Pero + + Merge from apple/trunk branch on FSF servers. + + 2005-03-01 Fariborz Jahanian + + Radar 4451818 + * call.c (standard_conversion, implicit_conversion): Ignore + 'volatile' attribute of artificially volatized type in objc when + evaluating various conversion weights. + + 2005-11-08 Fariborz Jahanian + + Radar 4330422 + * typeck.c (comp_ptr_ttypes_real): Remove the hack. un-volatize the + artiificially 'volatized' type before doing pointer comparison. + +2010-10-18 Jakub Jelinek + + PR c/46015 + * semantics.c (finish_goto_stmt): Call mark_rvalue_use on computed + goto destination. + +2010-10-17 Nicola Pero + + Merge from apple/trunk branch on FSF servers. + + 2006-04-19 Fariborz Jahanian + + Radar 4516785 + * parser.c (cp_parser_simple_type_specifier): Don't lookup for + objc object types if type is scope qualified. + +2010-10-17 Nicola Pero + + Merge from apple/trunk branch on FSF servers. + + 2006-03-27 Fariborz Jahanian + + Radar 4133425 + * lex.c (unqualified_name_lookup_error): Issue diagnostic + for private 'ivar' access. + +2010-10-17 Iain Sandoe + + * parser.c (cp_parser_objc_visibility_spec): Update to use visibility + enum, and handle @package. + +2010-10-15 Jason Merrill + + PR c++/45983 + * tree.c (cp_build_qualified_type_real): Don't reuse a variant + with a different typedef variant of the element type. + +2010-10-14 Iain Sandoe + + merge from FSF apple 'trunk' branch. + 2006 Fariborz Jahanian + + Radars 4436866, 4505126, 4506903, 4517826 + * typeck.c (finish_class_member_access_expr): Handle CLASS.property + syntax. + (cp_build_modify_expr): Likewise. + * parser.c (cp_parser_objc_method_prototype_list): Handle @property. + (cp_parser_objc_method_definition_list): Likewise. + (cp_parser_objc_property_decl): New. + (cp_parser_objc_property_attrlist): New. + (cp_parser_objc_at_property): New. + +2010-10-14 Richard Guenther + + PR lto/44561 + * cp-tree.h (NULLPTR_TYPE_P): Adjust. + * decl.c (cxx_init_decl_processing): Build a NULLPTR_TYPE node, + use build_int_cst. + * error.c (dump_type): Handle NULLPTR_TYPE. + (dump_type_prefix): Likewise. + (dump_type_suffix): Likewise. + * mangle.c (write_type): Likewise. + * name-lookup.c (arg_assoc_type): Likewise. + * rtti.c (typeinfo_in_lib_p): Likewise. + * pt.c (tsubst): Likewise. + +2010-10-13 Jason Merrill + + PR c++/45984 + * class.c (fixup_attribute_variants): New fn. + * cp-tree.h: Declare it. + * pt.c (instantiate_class_template): Call it. + * semantics.c (begin_class_definition): Call it. + +2010-10-13 Richard Henderson + + * cp-lang.c (cp_eh_personality): Update call to + build_personality_function. + * except.c (choose_personality_routine): Update function comment. + +2010-10-13 Richard Guenther + + * tree.c (cp_free_lang_data): Free DECL_NAMESPACE_USERS and + clear DECL_CHAIN of NAMESPACE_DECLs. + +2010-10-11 Martin Jambor + + PR c++/45562 + * cp-tree.h (current_class_ref): Check that cp_function_chain is + non-NULL. + * call.c (build_cxx_call): Likewise. + +2010-10-10 Jason Merrill + + * pt.c (tsubst_default_argument): Handle DEFAULT_ARG. + (tsubst_default_arguments): Only do this once for cloned fns. + (tsubst): Use typedef_variant_p. Handle LANG_TYPE. Don't + handle expressions. + (tsubst_expr): Avoid calling tsubst_expr for non-expressions. + (tsubst_copy_and_build): Likewise. + (tsubst_initializer_list): Likewise. + (tsubst_copy): Change default to gcc_unreachable. Handle + OVERLOAD and PTRMEM_CST. + +2010-10-10 Jason Merrill + + PR lto/45959 + PR lto/45960 + * pt.c (tsubst_copy) [INTEGER_CST]: Instantiate the type. + +2010-10-07 Andi Kleen + + * Make-lang.in (c++_OBJS): Remove dummy-checksum.o. + (cc1plus-dummy): Remove. + (cc1plus-checksum): Change to run checksum over object files + and options only. + +2010-10-08 Joseph Myers + + * cp-objcp-common.h (LANG_HOOKS_INIT_OPTIONS_STRUCT): Define. + +2010-10-07 Nicola Pero + + * cp-tree.def: Changed type of AT_ENCODE_EXPR from tcc_unary to + tcc_expression. + * cxx-pretty-print.c (pp_cxx_unary_expression): Added case for + AT_ENCODE_EXPR. + * error.c (dump_expr): Added case for AT_ENCODE_EXPR. + * pt.c (tsubst_copy): Added case for AT_ENCODE_EXPR. + (value_dependent_expression_p): Added case for AT_ENCODE_EXPR. + (type_dependent_expression_p): Added case for AT_ENCODE_EXPR. + * parser.c (cp_parser_objc_encode_expression): Updated comment. + +2010-10-07 Nicola Pero + + Merge from apple/trunk branch on FSF servers. + + 2006-04-26 Fariborz Jahanian + + Radar 4508851 + * parser.c (cp_parser_objc_interstitial_code): Recognize + and parse RID_NAMESPACE keyword. + +2010-10-07 Iain Sandoe + + * parser.c (cp_parser_objc_method_tail_params_opt): Peek new token after + finding ellipsis, before checking for attributes. + +2010-10-06 Nicola Pero + + Merge from apple/trunk branch on FSF servers. + * cp-tree.def: Added AT_ENCODE_EXPR here instead of to the no + longer existing gcc/c-common.def. + + 2005-12-14 Fariborz Jahanian + + Radar 4278774 + * pt.c (tsubst_copy_and_build): Instantiate @endcode(T). + * parser.c (cp_parser_objc_encode_expression): Build a templatized + parse tree for @encode(T). + + 2005-12-14 Fariborz Jahanian + + Radar 4278774 + * c-common.def: Add new expression code AT_ENCODE_EXPR. + +2010-10-06 Eric Botcazou + + PR c++/45908 + * typeck.c (cp_build_addr_expr_1): Add check for incomplete types in + code folding offsetof-like computations. + +2010-10-05 Nicola Pero + + PR objc++/31125 + * parser.c (cp_parser_objc_class_interface): If no identifier + follows an @interface token, stop parsing the interface after + printing an error. + (cp_parser_objc_class_implementation): If no identifier follows an + @implementation token, stop parsing the implementation after + printing an error. + +2010-10-05 Nicola Pero + + PR objc++/23707 + * parser.c (cp_parser_objc_method_keyword_params): If the required + colon is not found while parsing parameters, stop parsing them. + +2010-10-05 Nicola Pero + + PR objc++/31126 + * parser.c (cp_parser_objc_class_ivars): Do not eat the EOF or + @end after detecting it. Print an error if @end is found without + a '}'. + (cp_parser_objc_method_prototype_list): Do not eat the EOF after + detecting it. Fixed reading the next token when continuing + because of an error in a method signature. Print an error if EOF + is found without an '@end'. + (cp_parser_objc_method_definition_list): Same change. + +2010-10-05 Nicola Pero + + Merge from apple/trunk branch on FSF servers: + + 2005-10-17 Fariborz Jahanian + + Radar 4290840 + * parser.c (cp_parser_objc_method_keyword_params): Check for valid + method parameters and issue error. + (cp_parser_objc_method_definition_list): Check for invalid tokens + which cannot start a function definition. + + 2005-10-14 Fariborz Jahanian + + Radar 4294425 + * parser.c (cp_parser_objc_message_args): Check for missing message + arguments and syntax error. + + 2005-10-13 Fariborz Jahanian + + Radar 4261146 + * parser.c (cp_parser_objc_class_ivars): Check for @end/eof while + looking for '}'. + + 2005-08-15 Ziemowit Laski + + Radar 4093475 + * parser.c (cp_parser_objc_interstitial_code): Catch stray + '{' and '}' tokens and issue appropriate errors. + + 2005-08-02 Ziemowit Laski + + Radar 4185810 + (cp_parser_statement_seq_opt): In addition to '}' and + end-of-file, a statement sequence may also be terminated + by a stray '@end'. + +2010-10-05 Joseph Myers + + * cp-tree.h (cxx_print_error_function, + cxx_initialize_diagnostics): Declare using diagnostic_context + typedef. + +2010-10-04 Andi Kleen + + * Make-lang.in (g++, cc1plus): Add + to build rule. + +2010-10-04 Jason Merrill + + * tree.c (decl_storage_duration): New. + * cp-tree.h: Declare it. + (duration_kind): Return values. + +2010-10-03 Jason Merrill + + * typeck.c (require_complete_type_sfinae): Add complain parm to... + (require_complete_type): ...this function. + (cp_build_array_ref, convert_arguments): Use it. + (convert_for_initialization, cp_build_modify_expr): Likewise. + * cp-tree.h: Declare it. + * call.c (build_over_call): Use it. + +2010-09-30 Iain Sandoe + + merge from FSF 'apple/trunk' branch. + 2006-01-30 Fariborz Jahanian + + Radar 4386773 + * cp/parser.c (cp_parser_objc_interstitial_code): For + @optional/@required set the optional/required flag. + +2010-09-30 Nicola Pero + + * parser.c (cp_lexer_get_preprocessor_token): Tidied up comments + and indentation when finding an Objective-C++ CPP_AT_NAME token. + +2010-09-29 Richard Guenther + + * cp-tree.h (CP_DECL_CONTEXT): Check DECL_FILE_SCOPE_P. + (CP_TYPE_CONTEXT): Similar. + (FROB_CONTEXT): Frob global_namespace to the global + TRANSLATION_UNIT_DECL. + * decl.c (cxx_init_decl_processing): Build a TRANSLATION_UNIT_DECL, + set DECL_CONTEXT of global_namespace to it. + (start_decl): Use CP_DECL_CONTEXT and test TYPE_P + instead of zeroing context. + (cp_finish_decl): Use DECL_FILE_SCOPE_P. + (grokfndecl): Likewise. + (start_preparsed_function): Likewise. + * name-lookup.c (maybe_push_decl): Use DECL_NAMESPACE_SCOPE_P. + (namespace_binding): Use SCOPE_FILE_SCOPE_P. + * pt.c (template_class_depth): Use CP_TYPE_CONTEXT. + (is_specialization_of_friend): Use CP_DECL_CONTEXT. + (push_template_decl_real): Likewise. + (tsubst_friend_class): Likewise. Adjust context comparisons. + (instantiate_class_template): Use CP_TYPE_CONTEXT. + (tsubst): Do not substitute into TRANSLATION_UNIT_DECL. + * cxx-pretty-print.c (pp_cxx_nested_name_specifier): Use + SCOPE_FILE_SCOPE_P. + +2010-09-29 Yao Qi + + * decl.c (get_atexit_node): Fix typo. + +2010-09-28 Jason Merrill + + * tree.c (lvalue_kind): Rename from lvalue_p_1, make nonstatic. + (real_lvalue_p): Take const_tree. + * cp-tree.h: Adjust. + * typeck.c (lvalue_or_else): Make temporary arg a permerror. + (cp_build_addr_expr_1): Likewise. + +2010-09-28 Iain Sandoe + + Partially merged from apple/trunk branch on FSF servers: + 2006-04-26 Fariborz Jahanian + Radar 3803157 (method attributes) + + * parser.c (cp_parser_objc_method_keyword_params): Handle attributes. + (cp_parser_objc_method_tail_params_opt): Likewise. + (cp_parser_objc_method_signature): Likewise. + (cp_parser_objc_method_maybe_bad_prefix_attributes): New. + (cp_parser_objc_method_prototype_list): Handle attributes. + (cp_parser_objc_method_definition_list): Likewise. + +2010-09-28 Richard Henderson + + * cp-lang.c: Include "target.h". + (cp_eh_personality): Use targetm.except_unwind_info. + * Make-lang.in (cp-lang.o): Update deps. + +2010-09-28 Iain Sandoe + + * parser.c (cp_parser_objc_valid_prefix_attributes): New. + (cp_parser_declaration): Parse prefix attributes for ObjC++. + (cp_parser_objc_protocol_declaration): Handle attributes. + (cp_parser_objc_class_interface): Likewise. + (cp_parser_objc_declaration): Likewise. + +2010-09-27 Jason Merrill + + Require lvalues as specified by the standard. + * typeck.c (lvalue_or_else): Use real_lvalue_p. + (cp_build_addr_expr_1): Split out of cp_build_unary_op. + (cp_build_addr_expr, cp_build_addr_expr_strict): Interfaces. + (decay_conversion, get_member_function_from_ptrfunc): Adjust. + (build_x_unary_op, build_reinterpret_cast_1): Adjust. + (build_const_cast_1): Adjust. + * cp-tree.h: Declare new fns. + * call.c (build_this, convert_like_real, build_over_call): Adjust. + (initialize_reference): Adjust. + * class.c (build_base_path, convert_to_base_statically): Adjust. + (build_vfn_ref, resolve_address_of_overloaded_function): Adjust. + * cvt.c (build_up_reference, convert_to_reference): Adjust. + * decl.c (register_dtor_fn): Adjust. + * decl2.c (build_offset_ref_call_from_tree): Adjust. + * except.c (initialize_handler_parm): Adjust. + * init.c (build_offset_ref, build_delete, build_vec_delete): Adjust. + * rtti.c (build_dynamic_cast_1, tinfo_base_init): Adjust. + * tree.c (stabilize_expr): Adjust. + +2010-09-27 Nicola Pero + + Merge from apple/trunk branch on FSF servers: + + 2005-12-15 Fariborz Jahanian + + Radar 4229905 + * typeck.c (composite_pointer_type): Call objc_have_common_type + when comparing two objective-c pointer types. + + 2005-07-18 Ziemowit Laski + + Radar 4175534 + * call.c (standard_conversion): Do not issue warnings when + comparing ObjC pointer types. + + 2005-06-22 Ziemowit Laski + + Radar 4154928 + * call.c (standard_conversion): Allow for a pointer conversion + between any two ObjC pointer types. + * typeck.c (composite_pointer_type): Determine common type + for two ObjC pointer types. + +2010-09-24 Jan Hubicka + + * decl.c (finish_function): Use decl_replaceable_p + * method.c (make_alias_for_thunk): Update call of + cgraph_same_body_alias. + +2010-09-24 Jason Merrill + + * decl.c (compute_array_index_type): Remember type dependence of + array bound. + * pt.c (dependent_type_p_r): Don't recompute it here. + + * error.c (dump_expr) [CASE_CONVERT]: Print conversion between + reference and pointer to the same type as "*" or "&". + +2010-09-24 Nicola Pero + + * typeck.c (warn_args_num): Use warning 'too many arguments to + method [methodname]' for an Objective-C method instead of the less + satisfactory 'too many arguments to function' (with no method + name). + +2010-09-21 Jason Merrill + + * mangle.c (write_expression) [SCOPE_REF]: Only do -fabi-version=1 + special handling if we know the member. + +2010-09-18 Jason Merrill + + * call.c (compare_ics): Do lvalue/rvalue reference binding + comparison for ck_list, too. + +2010-09-15 Jason Merrill + + * semantics.c (finish_id_expression): Diagnose use of function + parms in evaluated context outside function body. + + * decl2.c (grokbitfield): Diagnose non-integral width. + + * call.c (convert_like_real): Use the underlying type of the + reference for the temporary. + +2010-09-15 Jakub Jelinek + + PR c++/45635 + * class.c (build_vtbl_initializer): Use fn instead of init's operand + as first argument to FDESC_EXPR. + +2010-09-15 Paolo Carlini + + PR c++/45665 + * decl.c (grokdeclarator): Check build_memfn_type return value + for error_mark_node. + +2010-09-13 Rodrigo Rivas Costa + + * semantics.c (finish_for_stmt): Always test flag_new_for_scope. + (begin_range_for_stmt): Likewise. + +2010-09-11 Rodrigo Rivas + + Implement range-based for-statements. + * cp-tree.def (RANGE_FOR_STMT): New. + * cp-tree.h (RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY): New. + (cp_convert_range_for): Declare. + * pt.c (tsubst_expr): Add RANGE_FOR_STMT. + (tsubst_copy_and_build): perform_koenig_lookup takes extra argument. + * semantics.c (begin_range_for_stmt): New. + (finish_range_for_decl): New. + (finish_for_stmt): Accept also RANGE_FOR_STMT. + (perform_koenig_lookup): Add extra argument include_std. + * parser.c (cp_parser_c_for): New with code from + cp_parser_iteration_statement(). + (cp_parser_range_for): New. + (cp_convert_range_for): New. + (cp_parser_iteration_statement): Add range-for support. + (cp_parser_condition): Adjust comment. + (cp_parser_postfix_expression): perform_koenig_lookup takes extra + argument. + * dump.c (cp_dump_tree): Add RANGE_FOR_STMT. + * cxx-pretty-print.c: Likewise. + * lex.c (cxx_init): Likewise. + * name-lookup.c (lookup_function_nonclass): Add extra argument + include_std. + (lookup_arg_dependent): Likewise. + * name-lookup.h: Likewise. + +2010-09-10 Rodrigo Rivas Costa + + PR c++/43824 + * error.c (maybe_warn_cpp0x): Add new warning + CPP0X_INLINE_NAMESPACES. + * parser.c (cp_parser_namespace_definition): Likewise. + * cp-tree.h (cpp0x_warn_str): Likewise. + +2010-09-10 Richard Guenther + + * decl.c (reshape_init_vector): For VECTOR_TYPEs, use + TYPE_VECTOR_SUBPARTS instead of TYPE_DEBUG_REPRESENTATION_TYPE. + +2010-09-10 Jan Hubicka + + PR tree-optimization/45605 + * cp/class.c (build_vtbl_initializer): Avoid wrong type conversion in + ADDR_EXPR. + +2010-09-08 Jakub Jelinek + + PR c++/45588 + * pt.c (tsubst) : Call mark_rvalue_use + before calling fold_decl_constant_value. + +2010-09-07 Arnaud Charlet + + * cp-tree.h (build_enumerator): Add new location_t parameter. + (build_lang_decl_loc): New function. + * decl.c (build_enumerator): New parameter loc. Use it when calling + build_decl. Replace build_lang_decl with build_lang_decl_loc. + * pt.c (tsubst_enum): Adjust call to build_enumerator. + * parser.c (cp_parser_enumerator_definition): Ditto. + * lex.c (build_lang_decl_loc): New function. + +2010-09-06 Dodji Seketeli + + PR c++/45200 + PR c++/45293 + PR c++/45558 + * tree.c (strip_typedefs): Strip typedefs from the context of + TYPENAME_TYPEs. + +2010-09-06 Mark Mitchell + + * typeck.c (cp_build_binary_op): Call do_warn_double_promotion. + * call.c (build_conditional_expr): Likewise. + (convert_arg_to_ellipsis): Likewise. + +2010-09-06 Arnaud Charlet + + * parser.c (make_pointer_declarator, make_reference_declarator, + make_call_declarator, make_array_declarator): Set declarator->id_loc. + (cp_parser_init_declarator): Adjust location of decl if appropriate. + +2010-09-06 Jason Merrill + + * call.c (implicit_conversion): Fix value-init of enums. + (convert_like_real): Likewise. + + * decl.c (cp_finish_decl): Don't change init for auto deduction. + + * pt.c (fold_non_dependent_expr_sfinae): Split out from... + (fold_non_dependent_expr): ...here. + (convert_nontype_argument): Use it. Take complain parm. + Use perform_implicit_conversion instead of ocp_convert. + Allow cv-qual changes. + (convert_template_argument): Pass complain down. + (tsubst_template_arg): Suppress constant expression warnings. + Don't fold here. + + * method.c (synthesized_method_walk): In constructors, also check + subobject destructors. + + * semantics.c (finish_compound_literal): Always build a + TARGET_EXPR. + +2010-08-30 Paolo Carlini + + PR c++/45043 + * decl.c (grokdeclarator): Use MAIN_NAME_P only on IDENTIFIER_NODEs. + +2010-08-30 Jakub Jelinek + + PR middle-end/45423 + * parser.c (cp_parser_omp_atomic): Handle boolean + {PRE,POST}_INCREMENT. + +2010-08-29 Jason Merrill + + PR c++/44991 + * parser.c (cp_parser_parameter_declaration): Pop parameter decls + after tentative parsing. + +2010-08-22 Joseph Myers + + * Make-lang.in (g++spec.o): Update dependencies. + * g++spec.c: Include opts.h + (MATH_LIBRARY, LIBSTDCXX): Remove initial "-l". + (lang_specific_driver): Use cl_decoded_option structures. + +2010-08-20 Nathan Froyd + + * call.c: Use FOR_EACH_VEC_ELT. + * class.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * error.c: Likewise. + * except.c: Likewise. + * mangle.c: Likewise. + * method.c: Likewise. + * name-lookup.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * repo.c: Likewise. + * semantics.c: Likewise. + * typeck2.c: Likewise. + +2010-08-19 Jason Merrill + + * call.c (reference_related_p): Check for error_mark_node. + (add_function_candidate): Check it instead of + same_type_ignoring_top_level_qualifiers_p. + + PR c++/45315 + * init.c (build_new_1): Don't use build_value_init in a template. + (build_value_init): Make sure we don't. + + PR c++/45307 + * cp-gimplify.c (cp_gimplify_expr): Also remove assignment + of empty class CONSTRUCTOR. + + * except.c (pending_noexcept, pending_noexcept_checks): New. + (perform_deferred_noexcept_checks): New. + (maybe_noexcept_warning): Split from... + (finish_noexcept_expr): ...here. Adjust. + * decl2.c (cp_write_global_declarations): Call + perform_deferred_noexcept_checks. + * cp-tree.h: And declare it. + +2010-08-18 Nathan Froyd + + PR c++/45049 + * name-lookup.c (push_overloaded_decl): Change DECL_CHAIN to + TREE_CHAIN. + +2010-08-17 Kai Tietz + + * class.c (note_name_declared_in_class): Make in 'extern "C"' blocks, + or if -fms-extensions is enabled check, check permissive. + +2010-08-09 Jason Merrill + + PR c++/45236 + * pt.c (lookup_template_class): Don't re-coerce outer parms. + +2010-08-09 Nathan Froyd + + * call.c (add_builtin_candidates): Use VECs for local variable + `types'. Adjust remainder of function accordingly. + +2010-08-09 Nathan Froyd + + * name-lookup.c (is_associated_namespace): Convert local variables + to be VECs instead of TREE_LISTs. + +2010-08-09 Nathan Froyd + + * tree.c (varargs_function_p): Use stdarg_p. + +2010-08-07 Nathan Froyd + + * parser.c (cp_default_arg_entry): Declare. Declare a VEC of it. + (cp_unparsed_functions_entry): Declare. Declare a VEC of it. + (cp_parser) [unparsed_functions_queues]: Rename to unparsed_queues. + Change type to a VEC. + (unparsed_funs_with_default_args): Define. + (unparsed_funs_with_definitions): Define. + (push_unparsed_function_queues): New function. + (cp_parser_new): Call it. + (pop_unparsed_function_queues): New function. + (cp_parser_class_specifier): Adjust processing of unparsed functions. + (cp_parser_template_declaration_after_export): Use VEC_safe_push. + (cp_parser_save_member_function_body): Likewise. + (cp_parser_late_parsing_for_member): Call push_unparsed_function_queues + and pop_unparsed_function_queues. + (cp_parser_late_parsing_default_args): Likewise. + (cp_parser_save_default_args): Use VEC_safe_push. + +2010-08-07 Nathan Froyd + + * name-lookup.h (cp_label_binding): Declare. Declare a VEC type + containing it. + (cp_binding_level): Convert shadowed_labels and dead_vars_from_for + fields to VECs. + * decl.c (poplevel): Adjust for type changes. + (declare_local_label): Likewise. + +2010-08-06 Jason Merrill + + * typeck.c (complete_type_or_maybe_complain): Split out from... + (complete_type_or_else): Here. + (build_class_member_access_expr): Call it. + (finish_class_member_access_expr): Likewise. + * call.c (build_special_member_call): Likewise. + * cvt.c (build_expr_type_conversion): Likewise. + * init.c (build_new): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * cp-tree.h: Declare it. + + * init.c (build_value_init): Add complain parm. + (build_value_init_noctor): Likewise. + (perform_member_init): Pass it. + (expand_aggr_init_1): Likewise. + (build_new_1): Likewise. + (build_vec_init): Likewise. + * pt.c (tsubst_expr): Likewise. + * typeck2.c (build_functional_cast): Likewise. + * cp-tree.h: Adjust. + * tree.c (build_target_expr_with_type): Handle error_mark_node. + + * typeck.c (decay_conversion): Any expression with type nullptr_t + decays to nullptr. + +2010-07-30 Ulrich Weigand + + PR c++/45112 + * decl.c (duplicate_decls): Merge DECL_USER_ALIGN and DECL_PACKED. + +2010-07-27 Jason Merrill + + * pt.c (tsubst_expr) [DECL_EXPR]: Handle getting an AGGR_INIT_EXPR + from build_value_init. + * init.c (build_value_init_noctor): Give error for unknown array + bound. + +2010-07-27 Joseph Myers + + * cp-objcp-common.h (LANG_HOOKS_MISSING_ARGUMENT): Remove. + +2010-07-27 Joseph Myers + + * cp-objcp-common.c (cxx_initialize_diagnostics): First call + c_common_initialize_diagnostics. + * cp-objcp-common.h (LANG_HOOKS_OPTION_LANG_MASK, + LANG_HOOKS_COMPLAIN_WRONG_LANG_P): Define. + +2010-07-21 Jason Merrill + + * tree.c (cp_tree_equal): Fix CONSTRUCTOR handling. + + * parser.c (cp_parser_init_declarator): Pass LOOKUP_NORMAL + to cp_finish_decl. + +2010-07-20 Jeffrey Yasskin + + PR c++/44641 + * pt.c (instantiate_class_template): Propagate the template's + location to its instance. + +2010-07-20 Jason Merrill + + PR c++/44967 + * pt.c (tsubst_copy_and_build): Rework last change. + + PR c++/44967 + * pt.c (tsubst_copy_and_build): Handle partial substitution of + CALL_EXPR. + +2010-07-19 Jason Merrill + + PR c++/44996 + * semantics.c (finish_decltype_type): Correct decltype + of parenthesized rvalue reference variable. + + PR c++/44969 + * tree.c (cp_tree_equal): Compare type of *CAST_EXPR. + * pt.c (iterative_hash_template_arg): Hash type of *CAST_EXPR. + +2010-07-19 Paolo Carlini + + PR c++/44969 + * typeck.c (build_x_compound_expr_from_list): Add tsubst_flags_t + parameter. + * cp-tree.h: Adjust declaration. + * init.c (perform_member_init): Adjust caller. + * decl.c (grok_reference_init, cp_finish_decl): Likewise. + * typeck2.c (store_init_value): Likewise. + (build_functional_cast): Pass complain argument to + build_x_compound_expr_from_list. + +2010-07-16 Jason Merrill + + PR c++/32505 + * pt.c (process_partial_specialization): Diagnose partial + specialization after instantiation. + (most_specialized_class): Add complain parm. + + * ptree.c (cxx_print_xnode): Handle TEMPLATE_INFO. + +2010-07-15 Nathan Froyd + + * init.c (build_new_1): Use cp_build_function_call_nary instead of + cp_build_function_call. + +2010-07-15 Jason Merrill + + PR c++/44909 + * call.c (add_function_candidate): If we're working on an implicit + declaration, don't consider candidates that won't match. + * typeck.c (same_type_ignoring_top_level_qualifiers_p): Now a fn. + * cp-tree.h (same_type_ignoring_top_level_qualifiers_p): Adjust. + + Revert: + * cp-tree.h (struct lang_type_class): Add has_user_opeq. + (TYPE_HAS_USER_OPEQ): New. + * decl.c (grok_special_member_properties): Set it. + * class.c (add_implicitly_declared_members): Don't lazily declare + constructors/operator= if a base or member has a user-declared one. + (check_bases_and_members, check_bases): Adjust. + (check_field_decls, check_field_decl): Adjust. + +2010-07-15 Anatoly Sokolov + + * decl.c (integer_three_node): Remove. + (cxx_init_decl_processing): Do not initialize the integer_three_node. + * cp-tree.h (integer_three_node): Remove. + +2010-07-15 Nathan Froyd + + * cp-tree.h: Carefully replace TREE_CHAIN with DECL_CHAIN. + * call.c: Likewise. + * class.c: Likewise. + * cp-gimplify.c: Likewise. + * decl.c: Likewise. + * decl2.c: Likewise. + * init.c: Likewise. + * mangle.c: Likewise. + * name-lookup.c: Likewise. + * optimize.c: Likewise. + * parser.c: Likewise. + * pt.c: Likewise. + * rtti.c: Likewise. + * search.c: Likewise. + * semantics.c: Likewise. + * typeck.c: Likewise. + * typeck2.c: Likewise. + +2010-07-14 Jason Merrill + + * init.c (sort_mem_initializers): Rename "field_type" to "ctx". + (build_field_list): Cache field type. + + Implement C++0x unrestricted unions (N2544) + * class.c (check_field_decl): Loosen union handling in C++0x. + * method.c (walk_field_subobs): Split out from... + (synthesized_method_walk): ...here. Set msg before loops. + (process_subob_fn): Check for triviality in union members. + * init.c (sort_mem_initializers): Splice out uninitialized + anonymous unions and union members. + (push_base_cleanups): Don't automatically destroy anonymous unions + and union members. + +2010-07-13 Jason Merrill + + PR c++/44909 + * cp-tree.h (struct lang_type_class): Add has_user_opeq. + (TYPE_HAS_USER_OPEQ): New. + * decl.c (grok_special_member_properties): Set it. + * class.c (add_implicitly_declared_members): Don't lazily declare + constructors/operator= if a base or member has a user-declared one. + (check_bases_and_members, check_bases): Adjust. + (check_field_decls, check_field_decl): Adjust. + * method.c (synthesized_method_walk): Initialize check_vdtor. + + PR c++/44540 + * mangle.c (write_type): Canonicalize. + (canonicalize_for_substitution): Retain cv-quals on FUNCTION_TYPE. + (write_CV_qualifiers_for_type): Ignore them in abi>=5. + +2010-07-13 Paolo Carlini + + PR c++/44908 + * call.c (convert_like_real): Adjust convert_ptrmem call, pass + complain argument. + * typeck.c (get_delta_difference): Update prototype, add a + tsubst_flags_t parameter; update get_delta_difference_1 calls and + add checks for error_mark_node. + (get_delta_difference_1): Update prototype, add a tsubst_flags_t + parameter; update lookup_base call. + (build_ptrmemfunc): Update prototype, add a tsubst_flags_t + parameter; update get_delta_difference call and add check for + error_mark_node. + (convert_ptrmem): Update prototype, add a tsubst_flags_t + parameter; update get_delta_difference call and add check for + error_mark_node; update build_ptrmemfunc call. + (build_static_cast_1): Adjust convert_ptrmem call. + (expand_ptrmemfunc_cst): Adjust get_delta_difference call. + (cp_build_unary_op): Adjust build_ptrmemfunc call. + * cvt.c (cp_convert_to_pointer, convert_force): Adjust convert_ptrmem + and build_ptrmemfunc calls. + * cp-tree.h: Update build_ptrmemfunc and convert_ptrmem prototypes. + +2010-07-12 Paolo Carlini + + PR c++/44907 + * call.c (build_temp): Add tsubst_flags_t complain parameter; + adjust build_special_member_call call, pass complain. + (convert_like_real): Adjust build_temp call, pass complain. + +2010-07-09 Jason Merrill + + PR c++/43120 + * cp-tree.h (BV_LOST_PRIMARY): New macro. + * class.c (update_vtable_entry_for_fn): Fix covariant thunk logic. + Set BV_LOST_PRIMARY. + (build_vtbl_initializer): Check BV_LOST_PRIMARY. + +2010-07-08 Jason Merrill + + PR c++/43120 + * class.c (update_vtable_entry_for_fn): Fix handling of dummy + virtual bases for covariant thunks. + +2010-07-08 Manuel LĂłpez-Ibåñez + + * cp-tree.h: Do not include toplev.h. + +2010-07-06 Jason Merrill + + PR c++/44703 + * call.c (is_std_init_list): Look through typedefs. + + PR c++/44778 + * init.c (build_offset_ref): If scope isn't dependent, + don't exit early. Look at TYPE_MAIN_VARIANT. + * pt.c (tsubst_copy) [OFFSET_REF]: Do substitution. + + * error.c (dump_function_decl): Don't crash on null DECL_NAME. + +2010-07-06 Shujing Zhao + + * cp-tree.h (impl_conv_void): New type. + (convert_to_void): Adjust prototype. + * cvt.c (convert_to_void): Use impl_conv_void, emit and adjust the + diagnostic for easy translation. Change caller. + * typeck.c: Update call to convert_to_void. + * semantics.c: Likewise. + * init.c: Likewise. + +2010-07-05 Nathan Froyd + + * decl.c (cp_finish_decl): Call add_local_decl. + * optimize.c (clone_body): Adjust for new type of cfun->local_decls. + +2010-07-05 Paolo Carlini + + * pt.c (tsubst): Early declare code = TREE_CODE (t) and use it + throughout. + +2010-07-05 Shujing Zhao + + PR c++/22138 + * parser.c (cp_parser_primary_expression): Error if local template is + declared. + +2010-07-02 Le-Chun Wu + + PR/44128 + * name-lookup.c (pushdecl_maybe_friend): Warn when a local decl + (variable or type) shadows another type. + +2010-07-02 Jakub Jelinek + + PR c++/44780 + * typeck.c (convert_for_assignment): When converting a convertible + vector type or objc++ types, call mark_rvalue_use. + * typeck2.c (build_m_component_ref): Use return values from + mark_rvalue_use or mark_lvalue_use. + * class.c (build_base_path): Likewise. + * call.c (build_conditional_expr): Likewise. + +2010-07-02 Paolo Carlini + + PR c++/44039 + * pt.c (tsubst_baselink): Return error_mark_node if lookup_fnfields + returns NULL_TREE. + +2010-07-01 Richard Guenther + + * cp-gimplify.c (cp_gimplify_expr): Open-code the rhs + predicate we are looking for, allow non-gimplified + INDIRECT_REFs. + +2010-06-30 Paolo Carlini + + PR c++/44628 + * typeck.c (cp_build_unary_op): Early return error_mark_node when + arg is NULL_TREE too. + * call.c (convert_class_to_reference): Return error_mark_node when + expr is NULL_TREE. + +2010-06-30 Michael Matz + + * repo.c (finish_repo): Fix typo. + +2010-06-30 Nathan Froyd + + * parser.c (cp_parser_omp_for_loop): Use a VEC for for_block. + +2010-06-30 Nathan Froyd + + * repo.c (pending_repo): Change type to a VEC. + (finish_repo): Adjust for new type of pending_repo. + (repo_emit_p): Likewise. + +2010-06-30 Manuel LĂłpez-Ibåñez + + * tree.c: Include gimple.h. Do not include tree-flow.h + * decl.c: Do not include tree-flow.h + * Make-lang.in: Adjust dependencies. + +2010-06-29 Nathan Froyd + + * decl.c (incomplete_var): Declare. Declare VECs containing them. + (incomplete_vars): Adjust comment. Change type to a VEC. + (maybe_register_incomplete_var): Adjust for new type. + (complete_vars): Adjust iteration over incomplete_vars. + +2010-06-29 Nathan Froyd + + * decl.c (struct named_label_entry): Change type of bad_decls field + to a VEC. + (poplevel_named_label_1): Adjust for new type of bad_decls. + (check_goto): Likewise. + +2010-06-29 Jason Merrill + + Enable implicitly declared move constructor/operator= (N3053). + * class.c (add_implicitly_declared_members): A class with no + explicitly declared copy or move constructor gets both declared + implicitly, and similarly for operator=. + (check_bases): A type with no copy ctor does not inhibit + a const copy ctor in a derived class. It does mean the derived + one is non-trivial. + (check_field_decl): Likewise. + (check_bases_and_members): A nonexistent copy ctor/op= is non-trivial. + * tree.c (type_has_nontrivial_copy_init): Adjust semantics. + (trivially_copyable_p): Likewise. + * call.c (convert_like_real): Use type_has_nontrivial_copy_init. + * class.c (finish_struct_bits): Likewise. + * tree.c (build_target_expr_with_type): Likewise. + * typeck2.c (store_init_value): Likewise. + + Enable implicitly deleted functions (N2346) + * class.c (check_bases_and_members): Adjust lambda flags. + * method.c (implicitly_declare_fn): Set DECL_DELETED_FN if appropriate. + + * decl2.c (mark_used): Adjust error for use of deleted function. + + Machinery to support implicit delete/move. + * cp-tree.h: (struct lang_type_class): Add lazy_move_assign, + has_complex_move_ctor, has_complex_move_assign bitfields. + (CLASSTYPE_LAZY_MOVE_ASSIGN): New. + (TYPE_HAS_COMPLEX_MOVE_ASSIGN): New. + (TYPE_HAS_COMPLEX_MOVE_CTOR): New. + (enum special_function_kind): Add sfk_move_assignment. + (LOOKUP_SPECULATIVE): New. + * call.c (build_over_call): Return early if it's set. + (build_over_call): Use trivial_fn_p. + * class.c (check_bases): If the base has no default constructor, + the derived one is non-trivial. Handle move ctor/op=. + (check_field_decl): Likewise. + (check_bases_and_members): Handle move ctor/op=. + (add_implicitly_declared_members): Handle CLASSTYPE_LAZY_MOVE_ASSIGN. + (type_has_move_constructor, type_has_move_assign): New. + * decl.c (grok_special_member_properties): Handle move ctor/op=. + * method.c (type_has_trivial_fn, type_set_nontrivial_flag): New. + (trivial_fn_p): New. + (do_build_copy_constructor): Use it. + (do_build_assign_ref): Likewise. Handle move assignment. + (build_stub_type, build_stub_object, locate_fn_flags): New. + (locate_ctor): Use locate_fn_flags. + (locate_copy, locate_dtor): Remove. + (get_dtor, get_default_ctor, get_copy_ctor, get_copy_assign): New. + (process_subob_fn, synthesized_method_walk): New. + (maybe_explain_implicit_delete): New. + (implicitly_declare_fn): Use synthesized_method_walk, + type_has_trivial_fn, and type_set_nontrivial_flag. + (defaulted_late_check): Set DECL_DELETED_FN. + (defaultable_fn_check): Handle sfk_move_assignment. + (lazily_declare_fn): Clear CLASSTYPE_LAZY_* early. Don't declare + implicitly deleted move ctor/op=. + * search.c (lookup_fnfields_1): Handle sfk_move_assignment. + (lookup_fnfields_slot): New. + * semantics.c (omp_clause_info_fndecl): Remove. + (cxx_omp_create_clause_info): Use get_default_ctor, get_copy_ctor, + get_copy_assign, trivial_fn_p. + (trait_expr_value): Adjust call to locate_ctor. + * tree.c (special_function_p): Handle sfk_move_assignment. + + * class.c (type_has_virtual_destructor): New. + * cp-tree.h: Declare it. + * semantics.c (trait_expr_value): Use it. + + * call.c (build_over_call): Only give warnings with tf_warning. + + * name-lookup.c (pop_scope): Handle NULL_TREE. + + * cp-tree.h (TYPE_HAS_ASSIGN_REF): Rename to TYPE_HAS_COPY_ASSIGN. + (TYPE_HAS_CONST_ASSIGN_REF): Rename to TYPE_HAS_CONST_COPY_ASSIGN. + (TYPE_HAS_INIT_REF): Rename to TYPE_HAS_COPY_CTOR. + (TYPE_HAS_CONST_INIT_REF): Rename to TYPE_HAS_CONST_COPY_CTOR. + (TYPE_HAS_COMPLEX_ASSIGN_REF): Rename to TYPE_HAS_COMPLEX_COPY_ASSIGN. + (TYPE_HAS_COMPLEX_INIT_REF): Rename to TYPE_HAS_COMPLEX_COPY_CTOR. + (TYPE_HAS_TRIVIAL_ASSIGN_REF): Rename to TYPE_HAS_TRIVIAL_COPY_ASSIGN. + (TYPE_HAS_TRIVIAL_INIT_REF): Rename to TYPE_HAS_TRIVIAL_COPY_CTOR. + (CLASSTYPE_LAZY_ASSIGNMENT_OP): Rename to CLASSTYPE_LAZY_COPY_ASSIGN. + (sfk_assignment_operator): Rename to sfk_copy_assignment. + * decl.c, call.c, class.c, init.c, method.c, pt.c, ptree.c: Adjust. + * search.c, semantics.c, tree.c: Adjust. + + * pt.c (dependent_scope_ref_p): Remove. + (value_dependent_expression_p): Don't call it. + (type_dependent_expression_p): Here either. + * init.c (build_offset_ref): Set TREE_TYPE on a qualified-id + if the scope isn't dependent. + + * pt.c (convert_nontype_argument): Use mark_lvalue_use if we want + a reference. + + PR c++/44587 + * pt.c (has_value_dependent_address): New. + (value_dependent_expression_p): Check it. + (convert_nontype_argument): Likewise. Call decay_conversion before + folding if we want a pointer. + * semantics.c (finish_id_expression): Don't add SCOPE_REF if the + scope is the current instantiation. + +2010-06-28 Jakub Jelinek + + PR c++/44682 + * class.c (build_base_path): If want_pointer, call mark_rvalue_use + on expr. + +2010-06-28 Steven Bosscher + + * init.c: Do not include except.h. + * decl.c: Likewise. + * expr.c: Likewise. + * cp-lang.c: Likewise. + * pt.c: Likewise. + * semantics.c: Likewise. + * decl2.c: Likewise. + * except.c: Likewise. + (init_exception_processing): Do not set the removed + lang_protect_cleanup_actions here. + (cp_protect_cleanup_actions): Make non-static and remove prototype. + (doing_eh): New, moved from except.c but removed the do_warning flag. + (expand_start_catch_block): Update doing_eh call. + (expand_end_catch_block): Likewise. + (build_throw): Likewise. + * cp-tree.h: Prototype cp_protect_cleanup_actions. + * cp-objcp-common.h: Set LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS to + cp_protect_cleanup_actions. + * Make-lang.in: Update dependencies. + +2010-06-26 Jason Merrill + + * call.c (add_function_candidate): Set LOOKUP_COPY_PARM for any + constructor called with a single argument that takes a reference + to the constructor's class. + (BAD_CONVERSION_RANK): New. + (compare_ics): Use it to compare bad ICSes. + +2010-06-25 Joseph Myers + + * lang-specs.h: Remove +e handling. + +2010-06-24 Andi Kleen + + * parser.c: (cp_parser_question_colon_clause): + Switch to use cp_lexer_peek_token. + Call warn_for_omitted_condop. Call pedwarn for omitted + middle operand. + +2010-06-22 Jakub Jelinek + + PR c++/44619 + * typeck2.c (build_m_component_ref): Call mark_lvalue_use on + datum and mark_rvalue_use on component. + + PR c++/44627 + * error.c (dump_expr): Don't look at CALL_EXPR_ARG (t, 0) if + the CALL_EXPR has no arguments. + +2010-06-21 Jason Merrill + + * typeck.c (comp_except_specs): Fix ce_derived with noexcept. + + * semantics.c (check_trait_type): Check COMPLETE_TYPE_P for array + element type. + +2010-06-17 Nathan Froyd + + * name-lookup.c (struct arg_lookup): Convert namespaces and + classes fields to VEC. + (arg_assoc_namespace): Adjust for new type of namespaces. + (arg_assoc_class): Adjust for new type of classes. + (lookup_arg_dependent): Use make_tree_vector and + release_tree_vector. + * typeck2.c (build_x_arrow): Use vec_member. + +2010-06-17 Manuel LĂłpez-Ibåñez + + PR c++/44486 + * error.c (dump_decl): Better wording for anonymous namespace. + +2010-06-16 Nathan Froyd + + * class.c (build_vtbl_initializer): Adjust computation of new_position + and which entry to add padding for. + +2010-06-16 Jason Merrill + + * except.c (check_noexcept_r): Return the problematic function. + (finish_noexcept_expr): Give -Wnoexcept warning. Add complain parm. + * pt.c (tsubst_copy_and_build): Pass it. + * parser.c (cp_parser_unary_expression): Likewise. + * cp-tree.h: Adjust prototype. + + * method.c (defaulted_late_check): Give the defaulted method + the same exception specification as the implicit declaration. + +2010-06-15 Jason Merrill + + * class.c (add_implicitly_declared_members): Implicit assignment + operators can also be virtual overriders. + * method.c (lazily_declare_fn): Likewise. + + * call.c (convert_like_real): Give "initializing argument of" + information for ambiguous conversion. Give source position + of function. + + * call.c (print_z_candidates): Do print viable deleted candidates. + (joust): Don't choose a deleted function just because its worst + conversion is better than another candidate's worst. + + * call.c (convert_like_real): Don't complain about + list-value-initialization from an explicit constructor. + + * decl.c (duplicate_decls): Use DECL_IS_BUILTIN rather than test + DECL_SOURCE_LOCATION directly. + + * class.c (type_has_user_provided_default_constructor): Use + sufficient_parms_p. + + * call.c (is_subseq): Handle ck_aggr, ck_list. + (compare_ics): Treat an aggregate or ambiguous conversion to the + same type as involving the same function. + +2010-06-13 Shujing Zhao + + * typeck.c (convert_for_assignment): Fix comment. Change message + format from %d to %qP. + (convert_for_initialization): Fix comment. + +2010-06-11 Shujing Zhao + + * cp-tree.h (expr_list_kind): New type. + (impl_conv_rhs): New type. + (build_x_compound_expr_from_list, convert_for_initialization): Adjust + prototype. + (typeck.c (convert_arguments): Use impl_conv_rhs and emit the + diagnostics for easy translation. Change caller. + (convert_for_initialization): Use impl_conv_rhs and change caller. + (build_x_compound_expr_from_list): Use expr_list_kind and emit the + diagnostics for easy translation. Change caller. + * decl.c (bad_spec_place): New enum. + (bad_specifiers): Use it and emit the diagnostics for easy + translation. Change caller. + * pt.c (coerce_template_parms): Put the diagnostics in full sentence. + +2010-06-09 Nathan Froyd + + * cp-tree.h (struct saved_scope): Change decl_ns_list field type + to a VEC. + * decl2.c (cp_write_global_declarations): Adjust for new type of + decl_namespace_list. + * name-lookup.c (current_decl_namespace): Likewise. + (push_decl_namespace): Likewise. + (pop_decl_namespace): Likewise. + +2010-06-09 Nathan Froyd + + * call.c (build_java_interface_fn_ref): Call build_function_type_list + instead of build_function_type. + * decl.c (cxx_init_decl_processing): Likewise. + (declare_global_var): Likewise. + (get_atexit_node): Likewise. + (expand_static_init): Likewise. + * decl2.c (start_objects): Likewise. + (start_static_storage_duration_function): Likewise. + * except.c (init_exception_processing): Likewise. + (build_exc_ptr): Likewise. + (build_throw): Likewise. + * rtti.c (throw_bad_cast): Likewise. + (throw_bad_typeid): Likewise. + (build_dynamic_cast_1): Likewise. + +2010-06-09 Nathan Froyd + + * call.c (build_call_n): Call XALLOCAVEC instead of alloca. + (build_op_delete_call): Likewise. + (build_over_call): Likewise. + * cp-gimplify.c (cxx_omp_clause_apply_fn): Likewise. + * pt.c (process_partial_specialization): Likewise. + (tsubst_template_args): Likewise. + * semantics.c (finish_asm_stmt): Likewise. + +2010-06-08 Nathan Sidwell + + * decl.c (record_key_method_defined): New, broken out of ... + (finish_function): ... here. Call it. + (start_decl): Treat aliases as definitions. + +2010-06-08 Laurynas Biveinis + + * typeck2.c (abstract_virtuals_error): Use typed GC allocation. + + * pt.c (maybe_process_partial_specialization): Likewise. + (register_specialization): Likewise. + (add_pending_template): Likewise. + (lookup_template_class): Likewise. + (push_tinst_level): Likewise. + + * parser.c (cp_lexer_new_main): Likewise. + (cp_lexer_new_from_tokens): Likewise. + (cp_token_cache_new): Likewise. + (cp_parser_context_new): Likewise. + (cp_parser_new): Likewise. + (cp_parser_nested_name_specifier_opt): Likewise. + (cp_parser_template_id): Likewise. + + * name-lookup.c (binding_entry_make): Likewise. + (binding_table_construct): Likewise. + (binding_table_new): Likewise. + (cxx_binding_make): Likewise. + (pushdecl_maybe_friend): Likewise. + (begin_scope): Likewise. + (push_to_top_level): Likewise. + + * lex.c (init_reswords): Likewise. + (retrofit_lang_decl): Likewise. + (cxx_dup_lang_specific_decl): Likewise. + (copy_lang_type): Likewise. + (cxx_make_type): Likewise. + + * decl.c (make_label_decl): Likewise. + (check_goto): Likewise. + (start_preparsed_function): Likewise. + (save_function_data): Likewise. + + * cp-tree.h (TYPE_SET_PTRMEMFUNC_TYPE): Likewise. + + * cp-objcp-common.c (decl_shadowed_for_var_insert): Likewise. + + * class.c (finish_struct_1): Likewise. + + * cp-tree.h (struct lang_type): Add variable_size GTY option. + (struct lang_decl): Likewise. + + * parser.c (cp_parser_new): Update comment to not reference + ggc_alloc. + +2010-06-07 Jason Merrill + + PR c++/44366 + * error.c (dump_parameters): Mask out TFF_SCOPE. + (dump_simple_decl): Don't print the scope of a PARM_DECL. + (dump_scope): Remove no-op mask. + + PR c++/44401 + * parser.c (cp_parser_lookup_name): Fix naming the constructor. + + * cp-tree.h (COMPLETE_OR_OPEN_TYPE_P): New macro. + * init.c (build_offset_ref): Use it. + * pt.c (maybe_process_partial_specialization): Use it. + (instantiate_class_template): Use it. + * search.c (lookup_base): Use it. + +2010-06-07 Jakub Jelinek + + PR c++/44444 + * expr.c (mark_exp_read): Handle INDIRECT_REF. + * cvt.c (convert_to_void): Handle INDIRECT_REF like + handled_component_p. + + PR c++/44443 + * decl.c (initialize_local_var): If TREE_USED is set on the type, + set also DECL_READ_P on the decl. + +2010-05-25 Dodji Seketeli + + PR c++/44188 + * cp-tree.h (typedef_variant_p): Move this declaration to + gcc/tree.h. + * tree.c (typedef_variant_p): Move this definition to gcc/tree.c. + * decl.c (grokdeclarator): Do not rename debug info of an + anonymous tagged type named by a typedef. + +2010-06-05 Fabien ChĂȘne + + PR c++/44086 + * class.c (check_field_decls): Move the call to + check_bitfield_decl before trying to set the + CLASSTYPE_READONLY_FIELDS_NEED_INIT flag. + +2010-06-05 Steven Bosscher + + * typeck.c: Update include path for moved files. + * decl.c: Likewise. + * rtti.c: Likewise. + * cp-gimplify.c: Likewise. + * cp-lang.c: Likewise. + * pt.c: Likewise. + * semantics.c: Likewise. + * cxx-pretty-print.h: Likewise. + * decl2.c: Likewise. + * parser.c: Likewise. + * cp-objcp-common.c: Likewise. + * cp-tree.h: Likewise. + * name-lookup.c: Likewise. + * lex.c: Likewise. + * name-lookup.h: Likewise. + * config-lang.in: Update paths in gtfiles for files in c-family/. + * Make-lang.in: Likewise. + +2010-06-04 Magnus Fromreide + + * cvt.c (cp_convert_to_pointer): Use null_ptr_cst_p. + * typeck.c (build_ptrmemfunc): Likewise. + +2010-06-04 Jason Merrill + + * typeck2.c (merge_exception_specifiers): Adjust merging of + throw() and noexcept(true). + + * pt.c (value_dependent_expression_p) [NOEXCEPT_EXPR]: Avoid + using an uninitialized variable. + + * cxx-pretty-print.c (pp_cxx_unary_expression): Handle NOEXCEPT_EXPR. + (pp_cxx_expression): Likewise. + + Implement noexcept-specification (15.4) + * parser.c (cp_parser_exception_specification_opt): Parse it. + Give -Wdeprecated warning about throw() specs. + * pt.c (tsubst_exception_specification): Handle it. + * error.c (dump_exception_spec): Handle it. + (dump_expr): Handle NOEXCEPT_EXPR. + * cxx-pretty-print.c (pp_cxx_exception_specification): Likewise. + * typeck.c (comp_except_specs): Handle compatibility rules. + Change exact parm to take an enum. + * typeck2.c (merge_exception_specifiers): Handle noexcept. + * except.c (nothrow_spec_p, type_noexcept_p): New fns. + (type_throw_all_p, build_noexcept_spec): New fns. + * cp-tree.h (TYPE_NOTHROW_P, TYPE_NOEXCEPT_P): Use them. + (comp_except_specs): Define ce_derived, ce_normal, ce_exact enums. + (cp_tree_index): Add CPTI_NOEXCEPT_TRUE_SPEC, CPTI_NOEXCEPT_FALSE_SPEC. + (noexcept_true_spec, noexcept_false_spec): New macros. + * name-lookup.c (pushdecl_maybe_friend): Adjust. + * search.c (check_final_overrider): Adjust. + * decl.c (check_redeclaration_exception_specification): Adjust. + (use_eh_spec_block): Use type_throw_all_p. + (cxx_init_decl_processing): Set noexcept_false_spec,noexcept_true_spec. + Give operator new a noexcept-specification in C++0x mode. + * tree.c (build_exception_variant, cxx_type_hash_eq): Adjust. + (cp_build_type_attribute_variant): Don't test TYPE_RAISES_EXCEPTIONS. + + Implement noexcept operator (5.3.7) + * cp-tree.def (NOEXCEPT_EXPR): New. + * except.c (check_noexcept_r, finish_noexcept_expr): New. + * cp-tree.h: Declare finish_noexcept_expr. + * parser.c (cp_parser_unary_expression): Parse noexcept-expression. + * pt.c (tsubst_copy_and_build): And tsubst it. + (type_dependent_expression_p): Handle it. + (value_dependent_expression_p): Handle it. + + * call.c (build_conditional_expr): Never fold in unevaluated context. + * tree.c (build_aggr_init_expr): Propagate TREE_NOTHROW. + * semantics.c (simplify_aggr_init_expr): Likewise. + * typeck.c (merge_types): Call merge_exception_specifiers. + * decl.c (duplicate_decls): Check DECL_SOURCE_LOCATION rather than + DECL_ANTICIPATED for preferring new type. + +2010-06-04 Joseph Myers + + * g++spec.c (lang_specific_driver): Use GCC-specific formats in + diagnostics. + +2010-06-04 Jakub Jelinek + + PR c++/44412 + * typeck.c (build_class_member_access_expr): Call mark_exp_read + on object for static data members. + +2010-06-04 Jakub Jelinek + Jason Merrill + + PR c++/44362 + * call.c (build_conditional_expr): If both arg2 and arg3 are lvalues + with the same type, call mark_lvalue_use on both. + +2010-06-03 Nathan Froyd + + * class.c (struct vtbl_init_data_s): Remove last_init field. + (struct secondary_vptr_vtt_init_data_s): Change type of inits field + to a VEC. + (finish_vtbls): Use a VEC rather than a TREE_LIST for the accumulated + initializers. + (build_vtt): Likewise. + (initialize_vtable): Take a VEC instead of a tree. + (build_vtt_inits): Change return type to void. Take a VEC ** + instead of a tree *; accumulate results into said VEC. + (build_ctor_vtbl_group): Use a VEC rather than a TREE_LIST for the + accumulated initializers. Pass the vtable to accumulate_vtbl_inits. + (accumulate_vtbl_inits): Add extra vtable tree parameter; take a VEC + instead of a tree. + (dfs_accumulate_vtbl_inits): Likewise. Change return type to void. + (build_vtbl_initializer): Add VEC parameter; accumulate initializers + into it. + (dfs_build_secondary_vptr_vtt_inits): Use CONSTRUCTOR_APPEND_ELT + rather than tree_cons. + (build_vbase_offset_vtbl_entries): Likewise. + (add_vcall_offset): Likewise. + (build_rtti_vtbl_entries): Likewise. + * cp-tree.h (initialize_artificial_var): Take a VEC instead of a tree. + * decl.c (initialize_artificial_var): Use build_constructor instead + of build_constructor_from_list. + +2010-06-03 H.J. Lu + + PR c++/44294 + * class.c (layout_class_type): Check MAX_FIXED_MODE_SIZE on + bit-field. + +2010-06-02 Jonathan Wakely + + * parser.c (cp_parser_mem_initializer_list): Change error text. + +2010-06-02 Jakub Jelinek + + * cp-objcp-common.c (shadowed_var_for_decl): Change into + tree_decl_map hashtab from tree_map. + (decl_shadowed_for_var_lookup, decl_shadowed_for_var_insert): Adjust. + (init_shadowed_var_for_decl): Adjust initialization. + + PR c++/44361 + * cvt.c (convert_to_void): If implicit is NULL, call mark_rvalue_use + instead of calling mark_exp_read only when not an assignment. + + PR debug/44367 + * semantics.c (finalize_nrv): Don't copy DECL_ARTIFICIAL, DECL_IGNORED_P, + DECL_SOURCE_LOCATION and DECL_ABSTRACT_ORIGIN from var to result. + Set DECL_VALUE_EXPR on var. + +2010-06-02 Jason Merrill + + * error.c (dump_type): Improve typedef handling. + + PR c++/9726 + PR c++/23594 + PR c++/44333 + * name-lookup.c (same_entity_p): New. + (ambiguous_decl): Multiple declarations of the same entity + are not ambiguous. + +2010-06-01 Jason Merrill + + DR 990 + * call.c (add_list_candidates): Prefer the default constructor. + (build_aggr_conv): Treat missing initializers like { }. + * typeck2.c (process_init_constructor_record): Likewise. + * init.c (expand_default_init): Use digest_init for + direct aggregate initialization, too. + + * call.c (add_list_candidates): Split out... + (build_user_type_conversion_1): ...from here. + (build_new_method_call): And here. + (implicit_conversion): Propagate LOOKUP_NO_NARROWING. + + PR c++/44358 + * call.c (build_list_conv): Set list-initialization flags properly. + +2010-06-01 Nathan Froyd + + * typeck2.c (build_x_arrow): Make types_memoized a VEC. + +2010-06-01 Arnaud Charlet + Matthew Gingell + + * Make-lang.in (CXX_C_OBJS): Add c-ada-spec.o. + * decl2.c: Include langhooks.h and c-ada-spec.h. + (cpp_check, collect_source_refs, collect_ada_namespace, + collect_all_refs): New functions. + (cp_write_global_declarations): Add handling of -fdump-ada-spec. + * lang-specs.h: Ditto. + +2010-05-29 Nathan Froyd + + * cp-tree.h (cp_build_function_call_nary): Declare. + * typeck.c (cp_build_function_call_nary): Define. + * decl.c (register_dtor_fn): Use it instead of + cp_build_function_call. + (cxx_maybe_build_cleanup): Likewise. + * decl2.c (generate_ctor_or_dtor_function): Likewise. + * except.c (do_get_exception_ptr): Likewise. + (do_begin_catch): Likewise. + (do_allocate_exception): Likewise. + (do_free_exception): Likewise. + (build_throw): Likewise. Use cp_build_function_call_vec instead + of cp_build_function_call. + (do_end_catch): Likewise. + +2010-05-29 Nathan Froyd + + * cp-tree.h (struct cp_decl_specifier_seq): Move type_location field up. + (struct cp_declarator): Move id_loc field up. + +2010-05-29 Steven Bosscher + + * cp-tree.h (ATTRIBUTE_GCC_CXXDIAG): Remove. Require that + this file is included before c-common.h. Define GCC_DIAG_STYLE + before including diagnostic-core.h and toplev.h. + (pedwarn_cxx98): Use ATTRIBUTE_GCC_DIAG. + * pt.c: Include cp-tree.h before c-common.h. + +2010-05-29 Steven Bosscher + + * tree.c (c_register_addr_space): Add stub. + +2010-05-28 Joseph Myers + + * g++spec.c (lang_specific_driver): Use fatal_error instead of + fatal. + +2010-05-28 Dodji Seketeli + + Revert fix of PR c++/44188 + * cp-tree.h (typedef_variant_p): Revert moving this declaration to + gcc/tree.h. + * tree.c (typedef_variant_p): Revert moving this definition to + gcc/tree.c. + * decl.c (grokdeclarator): Revert naming typedef handling. + +2010-05-27 Joseph Myers + + * call.c: Include diagnostic-core.h instead of diagnostic.h. + * cp-lang.c: Don't include diagnostic.h + * name-lookup.c: Include diagnostic-core.h instead of + diagnostic.h. + (cp_emit_debug_info_for_using): Use seen_error. + * optimize.c: Include diagnostic-core.h instead of diagnostic.h. + * parser.c: Include diagnostic-core.h instead of diagnostic.h. + * pt.c (iterative_hash_template_arg): Use seen_error. + * repo.c: Include diagnostic-core.h instead of diagnostic.h. + * typeck2.c: Include diagnostic-core.h instead of diagnostic.h. + * Make-lang.in (cp/cp-lang.o, cp/typeck2.o, cp/call.o, cp/repo.o, + cp/optimize.o, cp/parser.o, cp/name-lookup.o): Update + dependencies. + +2010-05-25 Dodji Seketeli + + PR c++/44188 + * cp-tree.h (typedef_variant_p): Move this declaration to + gcc/tree.h. + * tree.c (typedef_variant_p): Move this definition to gcc/tree.c. + * decl.c (grokdeclarator): Do not rename debug info of an + anonymous tagged type named by a typedef. + +2010-05-27 Jason Merrill + + PR c++/43555 + * decl.c (grokdeclarator) [cdk_pointer et al]: Force evaluation of + anonymous VLA size. + +2010-05-27 Kai Tietz + + PR bootstrap/44287 + * rtti.c (emit_support_tinfos): Check for NULL_TREE. + * class.c (layout_class_type): Likewise. + * decl.c (finish_enum): Likewise. + * mangle.c (write_builitin_type): Likewise. + +2010-05-26 Kai Tietz + + * cp-tree.h (cp_decl_specifier_seq): Add new bifield + explicit_int128_p. + * decl.c (grokdeclarator): Handle __int128. + * parser.c (cp_lexer_next_token_is_decl_specifier_ke): Likewise. + (cp_parser_simple_type_specifier): Likewise. + * rtti.c (emit_support_tinfos): Add int128 nodes for rtti. + * typeck.c (cp_common_type): Handle __int128. + * mangle.c (integer_type_codes): Add itk_int128 and + itk_unsigned_int128. + +2010-05-26 Jason Merrill + + PR c++/43382 + * pt.c (tsubst_pack_expansion): Don't get confused by recursive + unification. + +2010-05-26 Steven Bosscher + + * cp-lang.c: Do not include expr.h. + +2010-05-26 Steven Bosscher + + * decl.c: Do not include rtl.h + * semantics.c: Likewise. + +2010-05-25 Steven Bosscher + + * cp-tree.h: Do not include splay-tree.h. + (struct prtmem_cst): Remove unused field and false comment. + * typeck.c: Do not include rtl.h, expr.h, and tm_p.h. + * optimize.c: Do not inclde rtl.h, insn-config.h, and integrate.h. + * init.c: Do not include rtl.h and expr.h. + * class.c: Do not include rtl.h. Include splay-tree.h. + (build_clone): Use plain NULL instead of NULL_RTX. + * decl.c: Do not include expr.h. Explain why rtl.h has to be + included. Include splay-tree.h. + * method.c: Do not include rtl.h and expr.h. + (use_thunk): Use plain NULL instead of NULL_RTX. + * except.c: Do not include rtl.h, expr.h, and libfuncs.h. + * tree.c: Do not include rtl.h, insn-config.h, integrate.h, + and target.h. Include splay-tree.h. + * expr.c: Do not include rtl.h and expr.h. + * pt.c: Do not include obstack.h and rtl.h. + (tsubst_friend_function): Use plain NULL instead of NULL_RTX. + (tsubst_decl): Likewise. + (instantiate_decl): Likewise. + * semantics.c: Do not include exprt.h and debug.h. Explain why + rtl.h has to be included. + * decl2.c: Do not include rtl.h and expr.h. Include splay-tree.h. + * call.c: Do not include rtl.h and expr.h. + * search.c: Do not include obstack.h and rtl.h. + * friend.c: Do not include rtl.h and expr.h. + * Make-lang.in: Update dependencies. + +2010-05-25 Jakub Jelinek + + PR c++/18249 + * parser.c (non_integral_constant): Add NIC_NONE. + (required_token): Add RT_NONE. + (cp_parser_unary_expression): Initialize non_constant_p + to NIC_NONE. + (cp_parser_asm_definition): Initialize missing to RT_NONE. + (cp_parser_primary_expression, cp_parser_postfix_expression, + cp_parser_cast_expression, cp_parser_binary_expression, + cp_parser_functional_cast): Fix formatting. + +2010-05-25 Shujing Zhao + + PR c++/18249 + * parser.c: Remove inclusion of dyn-string.h. + (non_integral_constant): New enum. + (name_lookup_error): New enum. + (required_token): New enum. + (cp_parser_required_error): New function. + (cp_parser_require): Change the type of variable token_desc to + required_token and use cp_parser_required_error. + (cp_parser_require_keyword): Likewise. + (cp_parser_error): Use gmsgid as parameter. + (cp_parser_name_lookup_error): Change the type of variable desired to + name_lookup_error and put the diagnostic in the full sentences. Change + caller. + (cp_parser_non_integral_constant_expression): Change the type of the + variable thing to non_integral_constant and put the diagnostics in + full sentences. Change caller. + +2010-05-24 Eric Botcazou + + PR middle-end/44100 + * typeck.c (cp_build_unary_op): Fold offsetof-like computations. + +2010-05-24 Joseph Myers + + * error.c (cp_diagnostic_starter): Update call to + diagnostic_build_prefix. + (cp_print_error_function, + print_instantiation_partial_context_line): Check show_column flag + in context. + +2010-05-24 Jason Merrill + + PR c++/41510 + * decl.c (check_initializer): Don't wrap an init-list in a + TREE_LIST. + * init.c (build_aggr_init): Don't assume copy-initialization if + init has CONSTRUCTOR_IS_DIRECT_INIT. + * call.c (build_new_method_call): Sanity check. + +2010-05-24 Nathan Froyd + + * rtti.c (tinfo_base_init): Use build_constructor instead of + build_constructor_from_list. Don't cons a tree node for + returning. + (generic_initializer): Use build_constructor_single instead of + build_constructor_from_list. + (ptr_initializer): Use build_constructor instead of + build_constructor_from_list + (ptm_initializer): Likewise. + (class_initializer): Likewise. Take varargs instead of TRAIL. + (get_pseudo_ti_init): Adjust calls to class_initializer. Use + build_constructor instead of build_constructor_from_list. + +2010-05-22 Steven Bosscher + + * semantics.c: Include bitmap.h. + * Make-lang.in: Update dependencies. + +2010-05-22 Jan Hubicka + + * decl2.c (maybe_emit_vtables): Produce same comdat group when outputting + comdat vtables. + (cxx_callgraph_analyze_expr): Remove code marking vtables needed. + +2010-05-21 Joseph Myers + + * cxx-pretty-print.c: Correct merge error. + +2010-05-21 Joseph Myers + + * error.c: Include tree-diagnostic.h and tree-pretty-print.h. + (cp_print_error_function): Use diagnostic_abstract_origin macro. + (cp_printer): Handle %K here using percent_K_format. + * cxx-pretty-print.c: Include tree-pretty-print.h. + * Make-lang.in (cp/error.o, cp/cxx-pretty-print.o): Update + dependencies. + +2010-05-21 Steven Bosscher + + * error.c, tree.c, typeck2.c, cxx-pretty-print.c, mangle.c: + Clean up redundant includes. + +2010-05-20 Paolo Carlini + + PR c++/30298 + * decl.c (xref_basetypes): Return false in case of ill-formed + redefinition. + +2010-05-19 Jason Merrill + + * call.c (reference_binding): Use cp_build_qualified_type_real + and cp_type_quals consistently. + (add_function_candidate): Likewise. + (build_conditional_expr): Likewise. + (convert_like_real): Likewise. + (type_passed_as): Likewise. + * class.c (add_method): Likewise. + (same_signature_p): Likewise. + (layout_class_type): Likewise. + * decl.c (cxx_init_decl_processing): Likewise. + (cp_fname_init): Likewise. + (grokdeclarator): Likewise. + * decl2.c (cp_reconstruct_complex_type): Likewise. + * init.c (build_new_1): Likewise. + * method.c (do_build_copy_constructor): Likewise. + (implicitly_declare_fn): Likewise. + * pt.c (tsubst_aggr_type): Likewise. + (tsubst): Likewise. + * rtti.c (init_rtti_processing): Likewise. + (build_headof): Likewise. + (build_dynamic_cast_1): Likewise. + (tinfo_base_init): Likewise. + (emit_support_tinfos): Likewise. + * semantics.c (capture_decltype): Likewise. + * tree.c (cv_unqualified): Likewise. + * typeck.c (composite_pointer_type): Likewise. + (string_conv_p): Likewise. + + * mangle.c (write_CV_qualifiers_for_type): Tweak. + + * call.c (initialize_reference): Use CP_TYPE_CONST_P. + * decl.c (start_decl): Likewise. + * semantics.c (finish_compound_literal): Likewise. + * typeck.c (check_return_expr): Use CP_TYPE_VOLATILE_P. + (cp_type_readonly): Remove. + * cp-tree.h: Remove declaration. + + * typeck.c (merge_types): Preserve memfn quals. + + * decl.c (grokdeclarator): Don't check quals on fn type. + * typeck.c (cp_apply_type_quals_to_decl): Likewise. + * tree.c (cp_build_qualified_type_real): Simplify qualifier checking. + + PR c++/44193 + * typeck.c (type_memfn_quals): New fn. + (apply_memfn_quals): New fn. + (cp_type_quals): Return TYPE_UNQUALIFIED for FUNCTION_TYPE. + (cp_type_readonly): Use cp_type_quals. + * cp-tree.h: Add declarations. + * tree.c (cp_build_qualified_type_real): Don't set, but do + preserve, quals on FUNCTION_TYPE. + (strip_typedefs): Use apply_memfn_quals and type_memfn_quals. + * decl.c (build_ptrmem_type): Likewise. + (grokdeclarator): Likewise. + (static_fn_type): Likewise. + * decl2.c (change_return_type): Likewise. + (cp_reconstruct_complex_type): Likewise. + * pt.c (tsubst_function_type): Likewise. + (unify): Likewise. + (tsubst): Likewise. Drop special FUNCTION_TYPE substitution code. + +2010-05-18 Nathan Froyd + + * tree.c (build_min_non_dep_call_vec): Update comment. + +2010-05-17 Jason Merrill + + * call.c (struct z_candidate): Add explicit_targs field. + (add_template_candidate_real): Set it. + (build_over_call): Use it to control init-list warning. + + PR c++/44157 + * call.c (build_over_call): Limit init-list deduction warning to + cases where the argument is actually an init-list. + + PR c++/44158 + * call.c (build_over_call): Don't do bitwise copy for move ctor. + +2010-05-17 Dodji Seketeli + Jason Merrill + + PR c++/44108 + * decl.c (compute_array_index_type): Call mark_rvalue_use. + +2010-05-15 Jason Merrill + + * cp-tree.h (TYPE_NOEXCEPT_P): New macro. + * except.c (begin_eh_spec_block): Use MUST_NOT_THROW_EXPR if + TYPE_NOEXCEPT_P. + (finish_eh_spec_block): Adjust. + +2010-05-15 Jakub Jelinek + + PR c++/44148 + * pt.c (tsubst): Unshare template argument. + +2010-05-15 Steven Bosscher + + * decl.c: Include tree-iterator.h, as fixup for tree-inline.h changes. + * Make-lang.in: Fix dependencies accordingly. + +2010-05-14 Jason Merrill + + C++ DR 475 + * except.c (build_throw): Simplify, adjust for DR 475. + + PR c++/44127 + * except.c (dtor_nothrow): Return nonzero for type with + trivial destructor. + + PR c++/44127 + * cp-gimplify.c (gimplify_must_not_throw_expr): Use + gimple_build_eh_must_not_throw. + +2010-05-14 Martin Jambor + + * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef + and define. + +2010-05-14 Jonathan Wakely + + * call.c (build_new_method_call): Change warning text. + * typeck2.c (build_functional_cast): Change error text. + +2010-05-14 Shujing Zhao + + PR c++/30566 + * name-lookup.c (pushdecl_maybe_friend): Avoid the warnings about + shadowing the outer parameter or variables by the declaration of + nested function in nested structure or class. Warn the shadowing by + the declaration of nested lambda expression. + +2010-05-13 Jason Merrill + + * typeck.c (cp_build_array_ref): Factor out from... + (build_array_ref): ...here. Drop complain parm. + (build_new_op): Adjust. + * class.c (build_vtbl_ref_1): Adjust. + * decl2.c (grok_array_decl): Adjust. + * cp-tree.h: Adjust prototypes. + +2010-05-13 Jan Hubicka + + * decl.c (cp_finish_decl): Do not worry about used attribute. + +2010-05-12 Jason Merrill + + * typeck.c (build_array_ref): Take complain parm. + * cp-tree.h: Add it to prototype. + * call.c (build_new_op): Pass it. + * class.c (build_vtbl_ref): Pass it. + * decl2.c (grok_array_decl): Pass it. + + PR bootstrap/44048 + PR target/44099 + * cp-tree.def (NULLPTR_TYPE): Remove. + * cp-tree.h (NULLPTR_TYPE_P): New. + (SCALAR_TYPE_P): Use it. + (nullptr_type_node): New. + (cp_tree_index): Add CPTI_NULLPTR_TYPE. + * decl.c (cxx_init_decl_processing): Call record_builtin_type on + nullptr_type_node. + * cvt.c (ocp_convert): Use NULLPTR_TYPE_P instead of NULLPTR_TYPE. + * cxx-pretty-print.c (pp_cxx_constant): Likewise. + * error.c (dump_type, dump_type_prefix, dump_type_suffix): Likewise. + * mangle.c (write_type): Likewise. + * name-lookup.c (arg_assoc_type): Likewise. + * typeck.c (build_reinterpret_cast_1): Likewise. + * rtti.c (typeinfo_in_lib_p): Likewise. + (emit_support_tinfos): Remove local nullptr_type_node. + + * cp-tree.h (UNKNOWN_TYPE): Remove. + * decl.c (cxx_init_decl_processing): Use LANG_TYPE instead. + * error.c (dumy_type, dump_type_prefix, dump_type_suffix): Likewise. + * typeck2.c (cxx_incomplete_type_diagnostic): Likewise. + * class.c (instantiate_type): Check unknown_type_node rather than + UNKNOWN_TYPE. + * name-lookup.c (maybe_push_decl): Likewise. + * rtti.c (get_tinfo_decl_dynamic): Likewise. + (get_typeid): Likewise. + * semantics.c (finish_offsetof): Likewise. + + PR c++/20669 + * call.c (add_template_candidate_real): If deduction fails, still + add the template as a non-viable candidate. + (equal_functions): Handle template candidates. + (print_z_candidate): Likewise. + (print_z_candidates): Likewise. + (build_new_function_call): Likewise. + + * cp-tree.h (LOOKUP_LIST_ONLY): New. + * call.c (add_candidates): Enforce it. + (build_new_method_call): Try non-list ctor if no viable list ctor. + (build_user_type_conversion_1): Likewise. + + * call.c (add_candidates): Distinguish between type(x) and + x.operator type(). + (convert_class_to_reference): Set LOOKUP_NO_CONVERSION. + (build_new_method_call): Give better error for conversion op. + + * call.c (add_candidates): Add first_arg and return_type parms. + Add special constructor/conversion op handling. + (convert_class_to_reference): Use it. + (build_user_type_conversion_1): Likewise. + (build_op_call): Likewise. + (build_new_method_call): Likewise. + (build_new_op): Adjust. + (perform_overload_resolution): Adjust. + +2010-05-11 Paolo Carlini + + PR c++/34272 + PR c++/43630 + PR c++/34491 + * pt.c (process_partial_specialization): Return error_mark_node + in case of unused template parameters in partial specialization. + +2010-05-11 Jakub Jelinek + + PR c++/44062 + * semantics.c (finish_expr_stmt): Don't call mark_exp_read here... + * cvt.c (convert_to_void): ... but here. If expr is a COMPOUND_EXPR, + look at its second operand. + +2010-05-10 Jason Merrill + + PR c++/44017 + * semantics.c (baselink_for_fns): Revert earlier change. + + PR c++/44045 + * typeck.c (cp_build_modify_expr): Complain about assignment to + array from init list. + +2010-05-10 Fabien ChĂȘne + + PR c++/43719 + * decl.c (check_initializer): strip array type before checking for + uninitialized const or ref members. + +2010-05-07 Fabien ChĂȘne + + PR c++/43951 + * init.c (diagnose_uninitialized_cst_or_ref_member_1): Returns the + error count. Emit errors only if compain is true. + (build_new_1): Do not return error_mark_node if + diagnose_uninitialized_cst_or_ref_member_1 does not diagnose any + errors. Delay the check for user-provided constructor. + (perform_member_init): Adjust. + * cp-tree.h (diagnose_uninitialized_cst_or_ref_member): Change the + prototype. + +2010-05-06 Magnus Fromreide + Jason Merrill + + Add support for C++0x nullptr. + * cp-tree.def: Add NULLPTR_TYPE. + * cp-tree.h: Add nullptr_node. + (cp_tree_index): Add CPTI_NULLPTR. + (SCALAR_TYPE_P): Add NULLPTR_TYPE. + * call.c (null_ptr_cst_p): Handle nullptr. + (standard_conversion): Likewise. + (convert_arg_to_ellipsis): Likewise. + * mangle.c (write_type): Likewise. + * name-lookup.c (arg_assoc_type): Likewise. + * parser.c (cp_parser_primary_expression): Likewise. + * typeck.c (cp_build_binary_op): Likewise. + (build_reinterpret_cast_1): Likewise. + * error.c (dump_type): Likewise. + (dump_type_prefix, dump_type_suffix): Likewise. + * decl.c (cxx_init_decl_processing): Likewise. + * cxx-pretty-print.c (pp_cxx_constant): Likewise. + * cvt.c (ocp_convert): Likewise. + * rtti.c (typeinfo_in_lib_p, emit_support_tinfos): Put + nullptr_t tinfo in libsupc++. + +2010-05-06 Jason Merrill + + * semantics.c (simplify_aggr_init_expr): Use INIT_EXPR. + +2010-04-22 Jakub Jelinek + Dodji Seketeli + + PR c/18624 + * cp-tree.h (mark_exp_read, rvalue_use, lvalue_use, type_use): + Declare ... + * expr.c (mark_exp_read, rvalue_use, lvalue_use, type_use): ... new fns. + * typeck.c (cxx_sizeof_expr, cxx_alignof_expr): Call type_use. + (decay_conversion, perform_integral_promotions): Call rvalue_use. + (cp_build_unary_op): Call lvalue_use. + * decl.c (unused_but_set_errorcount): New variable. + (poplevel): Issue -Wunused-but-set-variable diagnostics. + (duplicate_decls): Merge DECL_READ_P flags. + (start_cleanup_fn): Set DECL_READ_P flag. + (finish_function): Issue -Wunused-but-set-parameter diagnostics. + * tree.c (rvalue): Call rvalue_use. + * pt.c (convert_nontype_argument): Likewise. + * semantics.c (finish_expr_stmt, finish_asm_stmt, finish_typeof, + finish_decltype_type): Likewise. + * call.c (convert_like_real) : Call rvalue use. + (build_x_va_arg, build_new_method_call, build_over_call): Call lvalue_use + or rvalue_use depending on the expr. + * init.c (build_new, build_delete): Likewise. + * rtti.c (build_typeid, build_dynamic_cast_1): Likewise. + +2010-05-05 Jason Merrill + + PR c++/43787 + * cp-gimplify.c (cp_gimplify_expr): Remove copies of empty classes. + * call.c (build_over_call): Don't try to avoid INIT_EXPR copies here. + +2010-05-04 Paolo Carlini + + PR c++/43028 + * pt.c (unify): Check each elt for error_mark_node. + +2010-05-04 Jason Merrill + + PR c++/38064 + * typeck.c (cp_build_binary_op): Allow enums for <> as well. + +2010-05-04 Paolo Carlini + + PR c++/43705 + * call.c (build_new_method_call): Return error_mark_node if fns is + NULL_TREE. + +2010-05-03 Dodji Seketeli + + PR c++/43953 + * pt.c (most_specialized_class): Pretend we are processing + a template decl during the call to coerce_template_parms. + +2010-05-03 Jason Merrill + + PR c++/42810 + PR c++/43680 + * decl.c (finish_enum): Use the TYPE_MIN_VALUE and TYPE_MAX_VALUE + from the selected underlying type unless -fstrict-enums. Set + ENUM_UNDERLYING_TYPE to have the restricted range. + * cvt.c (type_promotes_to): Use ENUM_UNDERLYING_TYPE. + * class.c (check_bitfield_decl): Likewise. + +2010-05-01 H.J. Lu + + PR c++/43951 + * init.c (build_new_1): Revert the accidental checkin in + revision 158918. + +2010-04-30 Jason Merrill + + PR c++/43868 + * cxx-pretty-print.c (pp_cxx_decl_specifier_seq): Move pmf handling... + (pp_cxx_type_specifier_seq): ...here. + +2010-04-30 Steven Bosscher + + * optimize.c, parser.c, mangle.c, cp-tree.h: Do not include varray.h. + * Make-lang.in: Don't include varray.h dependency in CXX_TREE_H. + +2010-04-30 Shujing Zhao + + PR c++/43779 + * typeck.c (warn_args_num): New function. + (convert_arguments): Use warn_args_num to print the diagnostic + messages. + +2010-04-29 Fabien ChĂȘne + + PR c++/43890 + * init.c (diagnose_uninitialized_cst_or_ref_member): check for + user-provided constructor while recursing. + +2010-04-28 Manuel LĂłpez-Ibåñez + + PR c++/9335 + * error.c (print_instantiation_partial_context_line): Handle + recursive instantiation. + (print_instantiation_partial_context): Likewise. + +2010-04-27 Jason Merrill + + * init.c (perform_member_init): Check CLASS_TYPE_P. + +2010-04-27 Fabien ChĂȘne + + PR c++/29043 + * init.c (perform_member_init): check for uninitialized const or + reference members, including array types. + +2010-04-24 Jason Merrill + + * tree.c (get_fns): Split out from get_first_fn. + * cp-tree.h: Declare it. + * search.c (shared_member_p): Use it. + * semantics.c (finish_qualified_id_expr): Simplify. + (finish_id_expression): Simplify. + + * semantics.c (finish_non_static_data_member): Call maybe_dummy_object + whenever object is NULL_TREE. Don't do 'this' capture here. + (finish_qualified_id_expr): Pass NULL_TREE. + (finish_id_expression): Likewise. + (lambda_expr_this_capture): Likewise. + + * semantics.c (finish_qualified_id_expr): Use maybe_dummy_object + rather than checking current_class_ref directly. + (finish_call_expr): Likewise. + + PR c++/43856 + * name-lookup.c (qualify_lookup): Disqualify lambda op(). + * class.c (current_nonlambda_class_type): New fn. + * semantics.c (nonlambda_method_basetype): New. + * cp-tree.h: Declare them. + * tree.c (maybe_dummy_object): Handle implicit 'this' capture. + + * semantics.c (baselink_for_fns): Correct BASELINK_BINFO. + + PR c++/43875 + * semantics.c (lambda_return_type): Complain about + braced-init-list. + + PR c++/43790 + * tree.c (cv_unqualified): Handle error_mark_node. + + PR c++/41468 + * call.c (convert_like_real) [ck_ambig]: Just return error_mark_node + if we don't want errors. + + PR c++/41468 + * class.c (convert_to_base): Add complain parameter. Pass + ba_quiet to lookup_base if we don't want errors. + (build_vfield_ref): Pass complain to convert_to_base. + * call.c (convert_like_real): Likewise. + (initialize_reference): Likewise. + (perform_direct_initialization_if_possible): Pass complain to + convert_like_real. + * cp-tree.h: Adjust. + +2010-04-27 Fabien ChĂȘne + Jason Merrill + + PR c++/42844 + * decl.c (check_for_uninitialized_const_var): Handle classes that need + constructing, too. + (check_initializer): Call it for classes that need constructing, too. + * class.c (in_class_defaulted_default_constructor): New. + * cp-tree.h: Declare it. + +2010-04-20 Jason Merrill + + PR c++/9335 + * init.c (constant_value_1): Treat error_mark_node as a constant + if DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P is set. + * cvt.c (ocp_convert): Handle getting error_mark_node from + integral_constant_value. + * decl.c (compute_array_index_type): Likewise. + +2010-04-20 Dodji Seketeli + + PR c++/43800 + PR c++/43704 + * typeck.c (incompatible_dependent_types_p): If one of the + compared types if not a typedef then honour their main variant + equivalence. + +2010-04-20 Jakub Jelinek + + * cp-tree.h (TYPE_REF_IS_RVALUE): Remove. + +2010-04-19 Dodji Seketeli + + PR c++/43704 + * typeck.c (structural_comptypes): Test dependent typedefs + incompatibility before testing for their main variant based + equivalence. + +2010-04-19 Jakub Jelinek + + * cp-tree.h (SCOPED_ENUM_P, UNSCOPED_ENUM_P, SET_SCOPED_ENUM_P): Use + ENUM_IS_SCOPED bit instead of TYPE_LANG_FLAG_5. + +2010-04-18 Eric Botcazou + + * decl.c (cxx_init_decl_processing): Remove second argument in call to + build_common_tree_nodes. + +2010-04-14 Jason Merrill + + PR c++/36625 + * parser.c (cp_parser_parenthesized_expression_list): Change + is_attribute_list parm to int to indicate whether or not to + handle initial identifier specially. + (cp_parser_attribute_list): Use attribute_takes_identifier_p. + +2010-04-13 Jason Merrill + + * call.c (type_decays_to): Check MAYBE_CLASS_TYPE_P instead of + CLASS_TYPE_P. + * parser.c (cp_parser_lambda_expression): Complain about lambda in + unevaluated context. + * pt.c (iterative_hash_template_arg): Don't crash on lambda. + +2010-04-12 Jason Merrill + + PR c++/43641 + * semantics.c (maybe_add_lambda_conv_op): Use build_call_a and tweak + return value directly. + + * call.c (type_decays_to): Call cv_unqualified for non-class type. + +2010-04-12 Fabien Chene + + PR c++/25811 + * cp-tree.h (diagnose_uninitialized_cst_or_ref_member): Declare. + * init.c (build_new_1): Check for uninitialized const members and + uninitialized reference members, when using new without + new-initializer. Call diagnose_uninitialized_cst_or_ref_member. + (diagnose_uninitialized_cst_or_ref_member): Define, call + diagnose_uninitialized_cst_or_ref_member_1. + (diagnose_uninitialized_cst_or_ref_member_1): New function. + +2010-04-12 Richard Guenther + + PR c++/43611 + * semantics.c (expand_or_defer_fn_1): Do not keep extern + template inline functions. + +2010-04-09 Manuel LĂłpez-Ibåñez + + PR c++/28584 + * typeck.c (cp_build_c_cast): Warn for casting integer to larger + pointer type. + +2010-04-07 Jason Merrill + + PR c++/43016 + * decl.c (start_preparsed_function): Do defer nested functions. + + PR c++/11094, DR 408 + * cp-tree.h (VAR_HAD_UNKNOWN_BOUND, SET_VAR_HAD_UNKNOWN_BOUND): New. + * decl2.c (finish_static_data_member_decl): Set it. + * decl.c (duplicate_decls): Propagate it. + * pt.c (tsubst_decl): Don't substitute the domain of an array + VAR_DECL if it's set. + (regenerate_decl_from_template): Substitute it here. + (type_dependent_expression_p): Return true if it's set. + * semantics.c (finish_decltype_type): Instantiate such a variable. + * typeck.c (cxx_sizeof_expr): Likewise. + (strip_array_domain): New. + + PR c++/43145 + * name-lookup.c (current_decl_namespace): Non-static. + (pop_nested_namespace): Sanity check. + * cp-tree.h: Declare current_decl_namespace. + * decl.c (grokvardecl): Use it instead of current_namespace. + (grokfndecl): Likewise. + + PR c++/38392 + * pt.c (tsubst_friend_function): Instatiate a friend that has already + been used. + + * pt.c (print_template_statistics): New. + * cp-tree.h: Declare it. + * tree.c (cxx_print_statistics): Call it. + + PR c++/41970 + * decl.c (grokvardecl): Tweak warning message. + (grokfndecl): Likewise. + +2010-04-07 Dodji Seketeli + + PR c++/42697 + *pt.c (tsubst_decl): Get the arguments of a specialization from + the specialization template, not from the most general template. + +2010-04-07 Dodji Seketeli + + PR c++/40239 + * typeck2.c (process_init_constructor_record): + value-initialize members that are are not explicitely + initialized. + +2010-04-07 Jie Zhang + + PR c++/42556 + * typeck2.c (split_nonconstant_init_1): Drop empty CONSTRUCTOR + when all of its elements are non-constant and have been split out. + +2010-04-06 Taras Glek + Jason Merrill + + * parser.c (cp_parser_class_specifier): Set class location to that + of IDENTIFIER_NODE instead of '{' when possible. + * semantics.c (begin_class_definition): Do not overide locations + with less precise ones. + +2010-04-06 Jason Merrill + + PR c++/43648 + * name-lookup.c (constructor_name_p): Allow X::~X even for typedefs. + + PR c++/43621 + * pt.c (maybe_update_decl_type): Check the return value from + push_scope. + +2010-04-01 Jason Merrill + + * decl.c (next_initializable_field): No longer static. + * cp-tree.h: Declare it. + * call.c (build_aggr_conv): Fail if there are more initializers + than initializable fields. + + * semantics.c (maybe_add_lambda_conv_op): Use null_pointer_node + instead of void_zero_node. + +2010-03-31 Dodji Seketeli + + PR c++/43558 + * cp-tree.h (TEMPLATE_TYPE_PARM_SIBLING_PARMS): New accessor macro. + * pt.c (end_template_parm_list): Store sibling template parms of + each TEMPLATE_TYPE_PARMs into its TEMPLATE_TYPE_PARM_SIBLING_PARMS. + (push_template_decl_real): Don't store the containing template decl + into the DECL_CONTEXT of TEMPLATE_TYPE_PARMs anymore. + * typeck.c (get_template_parms_of_dependent_type): Get sibling parms + of a TEMPLATE_TYPE_PARM from TEMPLATE_TYPE_PARM_SIBLING_PARMS. + Simplify the logic. + +2010-03-30 Jason Merrill + + PR c++/43076 + * pt.c (push_template_decl_real): Deal better with running out of + scopes before running out of template parms. + + PR c++/41185 + PR c++/41786 + * parser.c (cp_parser_direct_declarator): Don't allow VLAs in + function parameter context. Don't print an error if parsing + tentatively. + + PR c++/43559 + * pt.c (more_specialized_fn): Don't control cv-qualifier check + with same_type_p. + +2010-03-26 Jason Merrill + + PR c++/43509 + * parser.c (cp_parser_qualifying_entity): Do accept enum names in + c++0x mode, but not other type-names. + +2010-03-26 Dodji Seketeli + + PR c++/43327 + * pt.c (add_to_template_args): Support NULL ARGS; + (most_specialized_class): call coerce_template_parms on + template arguments passed to get_class_bindings. Use + add_to_template_args. + (unify): Handle VAR_DECLs. + +2010-03-26 Dodji Seketeli + + * cp-tree.h (get_template_parms_at_level): Change unsigned parm + into int. + * pt.c (get_template_parms_at_level): Adjust. + +2010-03-25 Dodji Seketeli + + PR c++/43206 + * cp-tree.h (get_template_parms_at_level): Declare ... + * pt.c (get_template_parms_at_level): ... new function. + * typeck.c (get_template_parms_of_dependent_type): If a template + type parm's DECL_CONTEXT isn't yet set, get its siblings from + current_template_parms. Use get_template_parms_at_level. Remove + useless test. + (incompatible_dependent_types_p): If we get empty parms from just one + of the template type parms we are comparing then the template parms are + incompatible. + +2010-03-24 Jason Merrill + + PR c++/43502 + * parser.c (make_declarator): Initialize id_loc. + (cp_parser_lambda_declarator_opt): And set it. + +2010-03-23 Jason Merrill + + Make lambda conversion op and op() non-static. + * semantics.c (maybe_add_lambda_conv_op): Make non-static. + Also add the thunk function returned by the conversion op. + Mark the conversion deleted if the op() is variadic. + * decl2.c (mark_used): Give helpful message about deleted conversion. + * parser.c (cp_parser_lambda_declarator_opt): Don't make op() static. + * semantics.c (finish_this_expr): Adjust. + * mangle.c (write_closure_type_name): Adjust. + * decl.c (grok_op_properties): Don't allow it. + * call.c (build_user_type_conversion_1): No static conversion ops. + (build_op_call): Or op(). + + * decl2.c (change_return_type): Fix 'this' quals. + +2010-03-22 Jason Merrill + + PR c++/43333 + * tree.c (pod_type_p): Use old meaning in C++98 mode. + + PR c++/43281 + * pt.c (contains_auto_r): New fn. + (do_auto_deduction): Use it. + (tsubst): Don't look at TREE_TYPE of a TEMPLATE_TYPE_PARM. + +2010-03-20 Simon Martin + + PR c++/43081: + * decl2.c (grokfield): Handle invalid initializers for member + functions. + +2010-03-20 Dodji Seketeli + + PR c++/43375 + * method.c (make_alias_for): Avoid crashing when DECL_LANG_SPECIFIC + is NULL. + * decl2.c (vague_linkage_p): Likewise. + +2010-03-18 Paolo Carlini + + PR c++/43418 + * parser.c (cp_parser_for_init_statement): Use NULL_TREE, not + false, in the cp_parser_expression_statement call. + +2010-03-05 Jason Merrill + + * mangle.c (mangle_decl): Give name collision error even without + ASM_OUTPUT_DEF. + +2010-03-04 Marco Poletti + + * pt.c (process_partial_specialization): Use error_n instead of + error. + +2010-03-03 Jason Merrill + + PR c++/12909 + * mangle.c (mangle_decl): Handle VAR_DECL, too. + +2010-03-03 Jason Merrill + + PR c++/12909 + * mangle.c: Include cgraph.h. + (mangle_decl): If the mangled name will change in a later + ABI version, make the later mangled name an alias. + * method.c (make_alias_for): Copy DECL_ARGUMENTS. + * Make-lang.in (mangle.o): Depend on cgraph.h. + * method.c (make_alias_for): Handle VAR_DECL, too. + * decl2.c (vague_linkage_p): Rename from vague_linkage_fn_p. + * tree.c (no_linkage_check): Adjust. + * decl.c (maybe_commonize_var): Adjust. + * cp-tree.h: Adjust. + +2010-03-01 Marco Poletti + + * pt.c (redeclare_class_template): Use error_n and inform_n. + +2010-02-27 Mark Mitchell + + PR c++/42748 + * cp-tree.h (push_tinst_level): Declare. + (pop_tinst_level): Likewise. + * pt.c (push_tinst_level): Give it external linkage. + (pop_tinst_level): Likewise. + * mangle.c (mangle_decl_string): Set the source location to that + of the decl while mangling. + +2010-02-27 Simon Martin + + PR c++/42054 + * pt.c (redeclare_class_template): Return false if there are erroneous + template parameters. + +2010-02-24 Manuel LĂłpez-Ibåñez + + * pt.c (push_tinst_level): Replace -ftemplate-depth- with + -ftemplate-depth=. + +2010-02-24 Jason Merrill + + PR c++/12909 + * mangle.c (write_type): Give -Wabi warning for old vector mangling. + + * class.c (layout_class_type): Don't give -Wabi warning for a bug + in a previous ABI version. + +2010-02-23 Jason Merrill + + PR c++/43143 + * typeck2.c (digest_init_r): Accept value init of array. + +2010-02-22 Manuel LĂłpez-Ibåñez + + PR c++/43126 + * typeck.c (convert_arguments): Update error message. + +2010-02-22 Mike Stump + + PR c++/43125 + * decl.c (duplicate_decls): Merge DECL_PRESERVE_P. + +2010-02-21 Manuel LĂłpez-Ibåñez + + PR c++/23510 + * error.c (print_instantiation_partial_context_line): New. + (print_instantiation_partial_context): Print at most 12 contexts, + skip the rest with a message. + +2010-02-21 Dodji Seketeli + + PR c++/42824 + * pt.c (lookup_template_class): Better support of specialization + of member of class template implicit instantiation. + +2010-02-20 Manuel LĂłpez-Ibåñez + + PR c++/35669 + * call.c (conversion_null_warnings): Replace -Wconversion with + -Wconversion-null. + * cvt.c (build_expr_type_conversion): Likewise. + +2010-02-18 Jason Merrill + + PR c++/42837 + * class.c (create_vtable_ptr): Set DECL_PACKED if type is packed. + + PR c++/43108 + * typeck.c (cp_build_binary_op): Adapt mixed complex/non handling from + C build_binary_op. + * cp-tree.h (WANT_VECTOR_OR_COMPLEX): Rename from WANT_VECTOR. + * cvt.c (build_expr_type_conversion): Allow COMPLEX_TYPE. + + PR c++/43070 + * semantics.c (finish_goto_stmt): Don't call decay_conversion. + + PR c++/26261 + PR c++/43101 + * pt.c (tsubst_qualified_id): Do normal lookup in non-dependent scope. + (maybe_update_decl_type): New fn. + * parser.c (cp_parser_init_declarator): Use it. + + PR c++/43109 + * semantics.c (begin_class_definition): Don't crash on unnamed ns. + +2010-02-17 Jason Merrill + + PR c++/43075 + * call.c (build_over_call): Don't create zero-sized assignments. + * cp-gimplify.c (cp_genericize_r): Don't remove them here. + * cp-objcp-common.c (cp_expr_size): Remove. + * cp-tree.h: Remove prototype. + + PR c++/43069 + * name-lookup.c (set_decl_namespace): Don't copy DECL_CONTEXT if the + decl we looked up doesn't match. + + PR c++/43093 + * cp-gimplify.c (cp_gimplify_expr) [INIT_EXPR]: Return if we don't + have an INIT_EXPR anymore. + + PR c++/43079 + * pt.c (convert_nontype_argument): Change assert to test. + +2010-02-16 Jason Merrill + + * cp-gimplify.c (cp_gimplify_expr): Fix error recovery. + + PR c++/43031 + * cp-gimplify.c (cp_gimplify_expr) [MODIFY_EXPR]: Use + VIEW_CONVERT_EXPR for conversions between structural equality types + that the back end can't tell are the same. + + PR c++/43036 + * tree.c (build_cplus_array_type): Set TYPE_MAIN_VARIANT to strip + cv-quals from element here. + (cp_build_qualified_type_real): Not here. Preserve typedef name. + +2010-02-14 Jason Merrill + + PR c++/41997 + * semantics.c (finish_compound_literal): Use + cp_apply_type_quals_to_decl when creating a static variable. + +2010-02-12 Jason Merrill + + PR c++/43024 + * name-lookup.h (current_binding_level): Check for null + cp_function_chain. + +2010-02-12 Jason Merrill + + PR c++/43054 + * tree.c (cp_tree_equal): Correct CALL_EXPR logic. + +2010-02-12 Jakub Jelinek + + PR c++/43033 + * name-lookup.c (pushdecl_maybe_friend): Check default args of t + instead of x. + +2010-02-10 Jason Merrill + + PR c++/41896 + * semantics.c (outer_lambda_capture_p): Revert. + (add_capture): Only finish_member_declaration if + we're in the lambda class. + (register_capture_members): New. + * cp-tree.h: Declare it. + * parser.c (cp_parser_lambda_expression): Call it. + +2010-02-10 Jason Merrill + + PR c++/41896 + * semantics.c (outer_lambda_capture_p): Use current_function_decl + instead of current_class_type. + +2010-02-10 Jason Merrill + + PR c++/42983, core issue 906 + * method.c (defaultable_fn_check): Check virtualness. + +2010-02-10 Jason Merrill + + PR c++/43016 + * semantics.c (maybe_add_lambda_conv_op): Set DECL_INTERFACE_KNOWN. + +2010-02-10 Shujing Zhao + + * Make-lang.in (cp/cvt.o, cp/parser.o, cp/search.o): Depend on intl.h. + * cvt.c (warn_ref_binding): Wrap the messages into G_() for easy + translation. + * parser.c (cp_parser_postfix_expression, cp_parser_new_type_id) + (cp_parser_cast_expression, cp_parser_condition, cp_parser_decltype) + (cp_parser_parameter_declaration) + (cp_parser_exception_specification_opt) + (cp_parser_exception_declaration): Likewise. + * pt.c (check_default_tmpl_args): Likewise. + * search.c (lookup_field_r): Likewise. + +2010-02-09 Jason Merrill + + PR c++/42399 + * pt.c (tsubst_copy_and_build): Propagate LAMBDA_EXPR_LOCATION. + +2010-02-09 Jason Merrill + + PR c++/42370 + * decl2.c (change_return_type): New fn. + * semantics.c (apply_lambda_return_type): Use it. + * cp-tree.h: Declare it. + +2010-02-05 Richard Guenther + + * Make-lang.in (cp/cp-lang.o): Depend on gt-cp-cp-lang.h. + * cp-lang.c: Include gt-cp-cp-lang.h. + * config-lang.in (gtfiles): Add cp/cp-lang.c. + +2010-02-05 Dodji Seketeli + + PR c++/42915 + * typeck.c (get_template_parms_of_dependent_type): Try getting + the template parameters fromt the type itself first. + +2010-02-03 Jason Merrill + + PR c++/4926 + PR c++/38600 + * mangle.c (write_unqualified_id): Split out from write_expression. + (write_unqualified_name): Call it. + (write_member_name): Likewise. + (write_expression): Support TEMPLATE_ID_EXPR. + Disambiguate operator names. + + PR c++/12909 + * mangle.c (write_type) [VECTOR_TYPE]: Change mangling with + -fabi-version=4. + +2010-02-02 Jason Merrill + + PR c++/41090 + * decl.c (cp_finish_decl): Add local statics to cfun->local_decls. + * optimize.c (clone_body): Remap their initializers when making base + variants. + (maybe_clone_body): Complain if multiple clones aren't safe. + +2010-01-29 Dodji Seketeli + + PR c++/42758 + PR c++/42634 + PR c++/42336 + PR c++/42797 + PR c++/42880 + * cp-tree.h (NON_DEFAULT_TEMPLATE_ARGS_COUNT, + SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT, + GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT): New accessor macros. + * pt.c (coerce_template_parms, type_unification_real, + expand_template_argument_pack, coerce_template_parameter_pack): + Set the non default template args count. + (current_template_args): Always set non defaulted + template args count when compiled with --enable-checking + (tsubst_template_args, type_unification_real): Propagate the non + defaulted template args count. + * error.c (get_non_default_template_args_count): Renamed + count_non_default_template_args into this. Don't calculate the + non default template argument count anymore. Use the new + accessor macros above to get it. + (dump_template_argument_list, dump_type, dump_decl, + dump_template_parms): Adjust. + * parser.c (cp_parser_template_argument_list): Always set defaulted + template args count when compiled with --enable-checking. + +2010-01-29 Shujing Zhao + + * decl.c (redeclaration_error_message): Wrap the return messages into + G_() for easy translation. + +2010-01-28 Jason Merrill + + PR c++/42880 + * semantics.c (begin_class_definition): Don't use type_as_string. + +2010-01-28 Dodji Seketeli + + PR c++/42713 + PR c++/42820 + * typeck.c (get_template_parms_of_dependent_type): Factorized + this out of incompatible_template_type_parms_p + (incompatible_dependent_types_p): Renamed + incompatible_template_type_parms_p into this. Make it detect + two incompatible dependent typedefs too. + (structural_comptypes): Use incompatible_dependent_types_p. + * pt.c (get_template_info): + Handle BOUND_TEMPLATE_TEMPLATE_PARAM. + +2010-01-20 Janis Johnson + Jason Merrill + + * mangle.c (write_type): Mangle transparent record as member type. + * semantics.c (begin_class_definition): Recognize decimal classes + and set TYPE_TRANSPARENT_AGGR. + +2010-01-20 Jason Merrill + + PR c++/42338 + * mangle.c (write_expression): Handle tree codes that have extra + arguments in the middle-end. + +2010-01-20 Paolo Carlini + + PR c++/42038 + * except.c (expand_start_catch_block): Deal correctly with + do_begin_catch returning error_mark_node. + +2010-01-20 Jason Merrill + + PR c++/41788 + * class.c (layout_class_type): Set packed_maybe_necessary for packed + non-PODs. + + PR c++/41920 + * semantics.c (build_lambda_object): Call mark_used on captured + variables. + + PR c++/40750 + * decl.c (grokdeclarator): Clear type_quals for a member function + declared using a typedef. Don't complain about adding cv-quals + to a function typedef in C++0x mode. + +2010-01-20 Jakub Jelinek + + * decl.c (create_array_type_for_decl): Remove set but not used + variable error_msg. Remove break stmts after return stmts. + +2010-01-19 Dodji Seketeli + + * error.c (dump_template_parms, count_non_default_template_args): + Revert fix of PR c++/42634. + +2010-01-18 Dodji Seketeli + + PR c++/42634 + * error.c (dump_template_parms): Use innermost template + arguments before calling count_non_default_template_args. + (count_non_default_template_args): We are being called with + template innermost arguments now. There is no need to ensure + that again. + +2010-01-18 Dodji Seketeli + + PR c++/42766 + * cvt.c (build_expr_type_conversion): Look through OVERLOAD. + +2010-01-17 Dodji Seketeli + + PR c++/42697 + *pt.c (tsubst_decl): Revert commit for PR c++/42697. + +2010-01-17 Dodji Seketeli + + PR c++/42697 + *pt.c (tsubst_decl): Get the arguments of a specialization from + the specialization template, not from the most general template. + +2010-01-16 Jason Merrill + + PR c++/42761 + * semantics.c (finish_decltype_type): Within a template, treat + unresolved CALL_EXPR as dependent. + +2010-01-15 Dodji Seketeli + + * error.c (dump_template_parms,count_non_default_template_args): + Revert changes of PR c++/42634. + +2010-01-14 Jakub Jelinek + + PR middle-end/42674 + * decl.c (finish_function): Don't emit -Wreturn-type warnings in + functions with noreturn attribute. + +2010-01-14 Jason Merrill + + PR c++/42701 + * call.c (build_new_method_call): Don't free the vec here. + + PR c++/42655 + * call.c (convert_like_real): Do full decay_conversion for ck_rvalue. + +2010-01-13 Dodji Seketeli + + PR c++/42634 + * error.c (dump_template_parms): Use innermost template + arguments before calling count_non_default_template_args. + (count_non_default_template_args): We are being called with + template innermost arguments now. There is no need to ensure + that again. + +2010-01-07 Dodji Seketeli + + c++/40155 + * pt.c (unify_pack_expansion): In non-deduced contexts, re-use template + arguments that were previously deduced. + +2010-01-05 Jason Merrill + + * pt.c (unify_pack_expansion): Handle deduction from init-list. + * call.c (build_over_call): Don't complain about it. + +2010-01-04 Jason Merrill + + PR c++/42555 + * pt.c (tsubst_decl): Don't apply type attributes in place. + + PR c++/42567 + * semantics.c (describable_type): Remove decltype comment and + semantics. + + + +Copyright (C) 2010 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + diff --git a/gcc/cp/ChangeLog.ptr b/gcc/cp/ChangeLog.ptr new file mode 100644 index 000000000..81ce2e820 --- /dev/null +++ b/gcc/cp/ChangeLog.ptr @@ -0,0 +1,75 @@ +2007-06-14 Andrew Pinski + + * init.c (build_new_1): Use fold_build1 instead + of build1 for NEGATE_EXPR. + (build_vec_delete_1): Likewise. + * class.c (build_base_path): Likewise. + * except.c (expand_start_catch_block): Likewise. + +2007-05-28 Andrew Pinski + + * typeck.c (build_binary_op): Add a comment on why creating + the tree in pieces while processing templates. + +2007-05-12 Andrew Pinski + + * except.c (expand_start_catch_block): Do a + NEGATIVE and then a POINTER_PLUS_EXPR instead + of a MINUS_EXPR. + +2007-05-06 Andrew Pinski + + * cp-gimplify.c (cxx_omp_clause_apply_fn): Convert + PLUS_EXPR on pointer types over to use + POINTER_PLUS_EXPR and remove the conversion + to the pointer types. + +2007-05-06 Andrew Pinski + + * typeck.c (build_unary_op): Remove code that used to + handle non lvalue increments/decrements as we now error + out all ways. + +2007-05-06 Andrew Pinski + + * typeck.c (get_member_function_from_ptrfunc): + Change over to using POINTER_PLUS_EXPR and convert + the second operand to sizetype. + * typeck2.c (build_m_component_ref): Likewise. + * rtti.c (build_headof): Use sizetype instead of + ptrdiff_type_node. + +2007-05-06 Andrew Pinski + + * method.c (thunk_adjust): Use POINTER_PLUS_EXPR for + adding to a pointer type. Use size_int instead of + ssize_int. Convert the index to sizetype before + adding it to the pointer. + +2006-11-23 Andrew Pinski + + * typeck.c (build_binary_op): For templates build the + expression in pieces to avoid the assert in build2_stat. + * init.c (expand_virtual_init): Create a POINTER_PLUS_EXPR + instead of PLUS_EXPR for pointers. + (build_new_1): Likewise. + (build_vec_delete_1): Likewise. + (build_vec_delete): Likewise. + * class.c (build_base_path): Likewise. + (build_base_path): Likewise. + (convert_to_base_statically): Likewise. + (fixed_type_or_null): Handle POINTER_PLUS_EXPR. + (get_vtbl_decl_for_binfo): Handle POINTER_PLUS_EXPR + instead of PLUS_EXPR. + (dfs_accumulate_vtbl_inits): Create a POINTER_PLUS_EXPR + instead of PLUS_EXPR for pointers. + * call.c (build_special_member_call): Likewise. + * rtti.c (build_headof): Likewise. + (tinfo_base_init): Likewise. + + +Copyright (C) 2006, 2007 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/ChangeLog.tree-ssa b/gcc/cp/ChangeLog.tree-ssa new file mode 100644 index 000000000..00f73b078 --- /dev/null +++ b/gcc/cp/ChangeLog.tree-ssa @@ -0,0 +1,573 @@ +2004-04-19 Richard Henderson + + * except.c (check_handlers_1): Use locus stored in master for warning. + * tree.c (cp_walk_subtrees): Save and restore input_location. + +2004-04-12 Diego Novillo + + * cp-lang.c (LANG_HOOKS_RTL_EXPAND_START): Remove. + (LANG_HOOKS_RTL_EXPAND_STMT): Remove. + * semantics.c (cxx_expand_function_start): Remove. + +2004-04-12 Richard Henderson + + * except.c (check_handlers_1): Use EXPR_LOCUS instead of STMT_LINENO. + * semantics.c (finalize_nrv_r): Likewise. + * tree.c (cp_walk_subtrees): Likewise. + * parser.c (cp_parser_statement): Save and restore entire locus; + set EXPR_LOCUS. + * pt.c (tsubst_expr): Don't special-case LABEL_STMT. + +2004-04-01 Diego Novillo + + * name-lookup.c (innermost_nonclass_level): Check for + error_mark_node. + +2004-03-25 Diego Novillo + + * parser.c (cp_parser_class_specifier): Initialize + variable 'attributes'. + +2004-03-17 Richard Henderson + + * cp-lang.c (cxx_types_compatible_p): Use + same_type_ignoring_top_level_qualifiers_p. + +2004-03-16 Dale Johannesen + + * cp-lang.c (cxx_types_compatible_p): New. + LANG_HOOKS_TYPES_COMPATIBLE_P: New. + +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-01 Jeff Law + + * init.c (build_vec_delete_1): Convert 2nd argument to NE_EXPR to + the proper type. + +2004-02-24 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. + +2004-02-19 Steven Bosscher + + * decl.c (poplevel): Don't output nested inline functions. + +2004-02-16 Richard Henderson + + * call.c (build_call, build_over_call, build_new_method_call): Add + static chain operand to call_expr. + * decl.c (build_offset_ref_call_from_tree): Likewise. + * parser.c (cp_parser_postfix_expression): Likewise. + * semantics.c (finish_call_expr): Likewise. + * cp-lang.c (cp_expand_decl): Don't declare_nonlocal_label. + +2004-02-09 Richard Henderson + + * cp-lang.c (LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P): New. + * cp-tree.h (cp_missing_noreturn_ok_p): Declare. + * decl.c (cp_missing_noreturn_ok_p): Export. + (cxx_init_decl_processing): Don't set lang_missing_noreturn_ok_p. + +2004-02-06 Andrew Pinski + + PR c/13863 + * cp-lang.c (LANG_HOOKS_DECL_UNINIT): Remove. + +2004-02-03 Richard Henderson + + PR middle-end/13325 + * call.c, cvt.c, init.c, typeck.c: Use TREE_NO_WARNING instead + of TREE_NO_UNUSED_WARNING. + * cvt.c (convert_to_void): Also use it for "has no effect" warning. + +2004-01-30 Frank Ch. Eigler + + * cp-mudflap.c (mflang_flush_calls): Mark static ctor as TREE_USED. + +2004-01-12 Jason Merrill + + * cp-lang.c (ok_to_generate_alias_set_for_type): Remove. + (cxx_get_alias_set): Allow all types. + +2004-01-08 Frank Ch. Eigler + + * cp-mudflap.c (mflang_flush_calls): mf_mark synthetic function. + +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-01 Richard Henderson + + * expr.c (cxx_expand_expr): Don't handle THROW_EXPR, or + MUST_NOT_THROW_EXPR. + * semantics.c (genrtl_try_block, genrtl_eh_spec_block, + genrtl_handler, cp_expand_stmt): Remove. + (init_cp_semantics): Don't set lang_expand_stmt. + +2003-12-31 Richard Henderson + + * cp-mudflap.c (mflang_register_call): Remove. + +2003-12-18 Jason Merrill + + PR c++/12453 + * cp-simplify.c (cp_gimplify_init_expr): Look inside STMT_EXPRs + and COMPOUND_EXPRs to find an AGGR_INIT_EXPR. + +2003-12-16 Jason Merrill + + PR middle-end/12920 + * decl.c (grokdeclarator): Immediately layout an + ARRAY_TYPE used in a pointer-to-array declarator. + +2003-12-16 Jan Hubicka + + Revert until initializers are made language independent: + * cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill. + * cp-tree.h (cxx_callgraph_analyze_expr): Kill. + * decl2.c (cxx_callgraph_analyze_expr): Kill. + +2003-12-14 Jan Hubicka + + * cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill. + * cp-tree.h (cxx_callgraph_analyze_expr): Kill. + * decl2.c (cxx_callgraph_analyze_expr): Kill. + +2003-11-24 Richard Henderson + + * Make-lang.in (tree.o, typeck.o): Remove -Wno-error. + +2003-11-20 Richard Henderson + + * call.c (build_java_interface_fn_ref): Use build_address+convert. + * except.c (build_eh_type_type): Likewise. + * class.c (build_base_path): Use convert+build_indirect_ref. + * init.c (expand_virtual_init): Likewise. + * rtti.c (get_tinfo_decl_dynamic): Use convert. + +2003-11-20 Frank Ch. Eigler + + * cp-mudflap.c (mflang_flush_calls): Adapt to direct expansion of + synthetic function, bypassing callgraph code. + * cp-decl2.c (finish_file): Call mudflap after callgraph-based + expansion. + +2003-11-17 Jason Merrill + + * 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. + +2003-11-16 Richard Henderson + + * typeck.c (pointer_diff): Remove unused variable. + +2003-11-16 Jason Merrill + + PR optimization/11269 + * semantics.c (finalize_nrv_r): Rename from nullify_returns_r. + Also replace uses of the nrv with our RESULT_DECL. + (cxx_expand_function_start): Don't mess with the nrv. + (finalize_nrv): New fn. + * cp-tree.h: Declare it. + * decl.c (finish_function): Call it. + * tree.c (cp_copy_res_decl_for_inlining): Don't mess with the nrv. + +2003-11-10 Richard Henderson + + * cp-simplify.c (gimplify_must_not_throw_expr): Replace add_tree + with append_to_statement_list. + +2003-10-30 Richard Henderson + + * decl.c (pop_switch): Call c_do_switch_warnings. + +2003-10-23 Richard Henderson + + * cp-simplify.c (cp_gimplify_expr): Return gimplify_status. + +2003-10-16 Richard Henderson + + * decl.c (finish_function): Don't check flag_disable_gimple. + +2003-10-14 Richard Henderson + + * decl.c (finish_function): Always gimplify; call c_warn_unused_result. + +2003-10-13 Richard Henderson + + * pt.c (push_tinst_level): Use annotate_with_locus. + +2003-10-12 Richard Henderson + + * call.c (call_builtin_trap): Use implicit_built_in_decls. + * class.c (build_base_path): Set TREE_INVARIANT. + (build_vtbl_ref_1, build_vtbl_initializer): Likewise. + * decl.c (build_enumerator): Likewise. + * init.c (build_zero_init): Likewise. + * pt.c (push_inline_template_parms_recursive): Likewise. + (build_template_parm_index, reduce_template_parm_level): Likewise. + (process_template_parm): Likewise. + * rtti.c (tinfo_base_init, generic_initializer): Likewise. + (ptr_initializer, ptm_initializer, class_initializer): Likewise. + * typeck.c (build_ptrmemfunc1): Likewise. + * typeck2.c (process_init_constructor): Likewise. + + * calls.c (dfs_accumulate_vtbl_inits): Rely on build to set + TREE_CONSTANT. + (build_vtbl_initializer): Likewise. + * init.c (build_vtbl_address): Likewise. + * rtti.c (tinfo_base_init): Likewise. + * tree.c (make_ptrmem_cst): Likewise. + * typeck.c (decay_conversion): Likewise. + (get_member_function_from_ptrfunc, build_binary_op): Likewise. + (pointer_diff, build_address, build_nop, build_unary_op): Likewise. + +2003-09-30 Richard Henderson + + * decl.c (finish_function): Set cfun->function_end_locus. + +2003-09-24 Jason Merrill + + * class.c, decl.c, decl2.c, error.c, init.c, lex.c, method.c, + pt.c, semantics.c, tree.c: Revert from TREE_LOCUS to + DECL_SOURCE_LOCATION. + +2003-09-17 Richard Henderson + + * decl.c (cxx_init_decl_processing): Don't using_eh_for_cleanups + if exceptions are disabled. + +2003-09-03 Richard Henderson + + * cp-lang.c (LANG_HOOKS_RTL_EXPAND_STMT): Use expand_stmt_toplev. + +2003-09-03 Richard Henderson + + * decl.c (finish_function): Fix misapplied patch. Don't + free_after_parsing or free_after_compilation. For real this time. + +2003-08-22 Jason Merrill + + * cp-simplify.c (cp_gimplify_init_expr): Update use of predicates. + +2003-08-21 Jason Merrill + + * cp-simplify.c (cp_gimplify_expr): Use simplify_aggr_init_expr. + (cp_gimplify_init_expr): Don't call it here. + (gimplify_aggr_init_expr): Remove. + +2003-08-19 Jason Merrill + + * typeck.c (build_array_ref): Also build ARRAY_REFs from + INDIRECT_REFs of ARRAY_TYPE. + + * semantics.c (finish_id_expression): Unshare aliases. + +2003-08-12 Diego Novillo + + * optimize.c (optimize_function): Do not call dump_function. + +2003-08-08 Jason Merrill + + * optimize.c (optimize_function): Restore support for + !keep_function_tree_in_gimple_form. + +2003-07-27 Andreas Jaeger + + * cp-lang.c: Convert K&R prototypes to ISO C90. + * cp-simplify.c: Likewise. + * cp-mudflap.c: Likewise. + +2003-06-13 Frank Ch. Eigler + + * semantics.c (expand_body): Call mudflap_c_function just before + rtl expansion of function body; don't interfere with inlining. + * optimize.c (optimize_function): Remove mudflap call. + +2003-06-13 Diego Novillo + + * cp-lang.c, cp-simplify.c, cp-tree.h, decl.c, optimize.c, + semantics.c, tree.c: Rename SIMPLE to GIMPLE everywhere. + +2003-06-05 Frank Ch. Eigler + + * cp-mudflap.c (mflang_register_call): Give the synthetic decl + undefined (not zero) size. + +2003-06-05 Frank Ch. Eigler + + * cp-mudflap.c (mx_flag): Remove. Update callers to use mf_mark. + +2003-05-24 Diego Novillo + + * Make-lang.in (optimize.o): Add dependency on tree-simple.h + * decl.c (grokdeclarator): Don't abort when the declarator is + ERROR_MARK_NODE. + * optimize.c (optimize_function): Unshare all trees after + optimizing inline calls. + +2003-05-12 Diego Novillo + + * class.c (dump_array): Call CONSTRUCTOR_ELTS to access + the operand of a CONSTRUCTOR node. + +2003-05-07 Diego Novillo + + * decl.c (grokdeclarator): Fix thinko in handling + ERROR_MARK declarators. + +2003-05-07 Diego Novillo + + * decl.c (grokdeclarator): Handle ERROR_MARK declarators. + +2003-05-07 Jason Merrill + + * semantics.c (expand_body): Call expand_stmt when + -fdisable-simple is given. + +2003-04-21 Jeff Law + + * optimize.c (optimize_function_tree): Do run the tree-ssa + optimizers. + +2003-04-16 Jeff Law + + * optimize.c (optimize_function): No longer check + flag_disable_simple. + +2003-04-15 Jeff Law + + * pt.c (instantiate_decl): If CFUN is null, then we will + need to push to the toplevel. + + * Makefile.in (decl.o): Depends on tree-flow.h. + * decl.c (finish_function): Call set_has_hidden_use when + nullifying returns for named value return optimization. + +2003-04-02 Jason Merrill + + * cp-simplify.c (cp_simplify_expr) : + Change type of constant to RECORD_TYPE. + +2003-03-10 Jeff Law + + * optimize.c (optimize_function): Avoid unnecessary + simplification of the function tree. + +2003-03-02 Diego Novillo + + * decl.c: Replace DECL_SOURCE_LOCATION with TREE_LOCUS + everywhere. + +2003-02-28 Frank Ch. Eigler + + * decl2.c (finish_file): Adjust timing of mudflap_finish_file call + to account for unit-at-a-time compilation. + +2003-02-07 Jason Merrill + + * cp-simplify.c (cp_simplify_expr): Handle BASELINK. + + * parser.c (cp_parser_primary_expression): Unshare a COMPONENT_REF + from an ALIAS_DECL. + +2003-02-05 Jason Merrill + + * cp-simplify.c (genericize_try_block): Do genericize catch blocks. + +2003-02-03 Diego Novillo + + * parser.c (cp_parser_asm_definition): Call finish_asm_stmt with + 'volatile_p' directly. + * typeck.c (build_binary_op): Initialize variable 'type'. + * Make-lang.in (cp/tree.o-warn): Add -Wno-error. + +2003-01-29 Frank Ch. Eigler + + * cp-mudflap.c (mflang_register_call): Adapt to mf-runtime.h API + change. + +2003-01-15 Jeff Law + + * class.c: Use TREE_FILENAME and TREE_LINENO to extract + file/line information from tree nodes. Remove EXPR_WITH_FILE_LOCATION + nodes. Use annotate_with_file_line to attach file/line information + to tree nodes. Use TREE_LOCUS to copy file/line information + from one node to another. + * decl2.c, error.c, init.c, lex.c, method.c: Likewise. + * optimize.c: Likewise. + * cp-tree.def (TINST_LEVEL): New tree node. + * cp-tree.h (TINST_DECL): Update now that we no longer use + EXPR_WITH_FILE_LOCATION to represent the TINST_DECL information. + (TINST_FILE, TINST_LINE): Kill. + * decl.c: Use TREE_FILENAME and TREE_LINENO to extract + file/line information from tree nodes. Use annotate_witH_file_line + to add file/line information to tree nodes. Use TREE_LOCUS + to copy file/line information from one node to another. + (duplicate_decls): Make sure to copy TREE_LOCUS information + from the old decl to the new decl. + (finish_function): Save and restore file/line information + around genericizing the function tree. + * pt.c (lookup_template_class): Use TREE_LOCUS to copy file/line + information from one node to another. + (push_tinst_level): Generate a TINST_LEVEL node rather than + using EXPR_WITH_FILE_LOCATION nodes. Use annotate_with_file_line + to annotate the new node with file/line information. + (pop_tinst_level): Use TREE_LINENO and TREE_FILENAME to extract + file/line information from nodes. + (tsubst_friend_function, instantiate_class_template): Likewise. + (tsubst_decl, instantiate_decl, tsubst_enum): Likewise. + * semantics.c: Use annotate_with_file_line to annotate tree + nodes with file/line information. Use TREE_FILENAME and TREE_LINENO + to extract file/line information from tree nodes. + (expand_body): Restore file/line information slightly earlier. + tree.c (cp_walk_subtrees): Set lineno appropriately. + (cp_copy_res_decl_for_inlining): Use TREE_LOCUS to copy file/line + information from one node to another. + +2003-01-13 Frank Ch. Eigler + + Prototype C++ mudflap support. + * Make-lang.in (CXX_OBJS): Add cp/cp-mudflap.o and dependencies. + * cp-mudflap.c: New file with C++ front-end mflang_* routines. + * decl2.c (finish_file): Divert to mudflap if appropriate. + * optimize.c (optimize_function): Ditto. + +2003-01-02 Jason Merrill + + * Make-lang.in (CXX_C_OBJS): Replace old-tree-inline.o with + tree-inline.o. + + * optimize.c (dump_function): Move to ../tree-dump.c. + + * cp-simplify.c (cp_simplify_expr): Handle PTRMEM_CST, INIT_EXPR, + MODIFY_EXPR and EMPTY_CLASS_EXPR. + (cp_simplify_stmt): Handle USING_STMT. + (cp_simplify_init_expr): New fn. + * cvt.c (build_up_reference): Don't push the decl. + * class.c (build_vtable_entry_ref, build_vtbl_ref_1): Unshare the + vtable address. + * init.c (build_vtbl_address): Likewise. + * cp-lang.c (LANG_HOOKS_UNSAVE_EXPR_NOW): Remove. + * decl.c (lookup_name_real): Unshare the expansion of an ALIAS_DECL. + (finish_function): Don't genericize templates. + * parse.y (parse_asm_stmt): Fix prototype. + * semantics.c (expand_body): Don't expand if we saw errors. + Drop support for expanding non-GENERIC code. + + * cp-simplify.c (cp_simplify_stmt): Handle HANDLER and EH_SPEC_BLOCK. + (genericize_try_block): Always build a TRY_CATCH_EXPR. + (genericize_catch_block): New fn. + (genericize_eh_spec_block): New fn. + (cp_simplify_expr): Handle THROW_EXPR and MUST_NOT_THROW_EXPR. + (simplify_must_not_throw_expr): New fn. + * except.c (wrap_cleanups_r): Make the MUST_NOT_THROW_EXPR void. + (build_throw): Likewise. + +2002-12-14 Jason Merrill + + * optimize.c (dump_function): Use pretty dumpers. + (optimize_function): Don't do .original dump here. + +2002-12-03 Diego Novillo + + * cp-simplify.c: Include coretypes.h and tm.h. + +2002-11-24 Jason Merrill + + Gimplify C++ cleanups. + * decl.c (finish_function): Call c_genericize. + * cp-simplify.c (cp_simplify_stmt): New fn. + (genericize_try_block): New fn. + (cp_simplify_expr): Move INIT_EXPR/TARGET_EXPR code + to ../gimplify.c. Handle AGGR_INIT_EXPR. + (simplify_target_expr): Move to ../gimplify.c. + (maybe_fixup_loop_cond): Remove. + (simplify_aggr_init_expr): Split out from... + * semantics.c (simplify_aggr_init_exprs_r): ...here. + (expand_body): Don't simplify AGGR_INIT_EXPRs here + if we're gimplifying. Handle expanding generic trees. + * tree.c (init_tree): Set lang_simplify_stmt. + * cp-tree.h: Declare the new fns. + + * optimize.c (optimize_function): Do pretty dumps. + +2002-10-04 Jason Merrill + + * Make-lang.in (CXX_C_OBJS): Add gimplify.o. + +2002-09-24 Jason Merrill + + * parse.y (parse_asm_stmt): New fn. + (simple_stmt): Use it. + * semantics.c (finish_asm_stmt): Change cv_qualifier parm to + volatile_p. + * cp-tree.h: Adjust prototype. + * pt.c (tsubst_expr): Adjust call. + +2002-08-23 Diego Novillo + + * Make-lang.in (CXX_C_OBJS): Add tree-dchain.o + +2002-08-11 Jason Merrill + + * cp-simplify.c (maybe_fixup_loop_cond): Move here. + (cp_simplify_expr): Call it. + (simplify_target_expr): Remove pre_p parm. + +2002-08-09 Jason Merrill + + * cp-simplify.c (cp_simplify_expr): New fn. + (simplify_target_expr): New fn. + (cp_simplify_function_tree): Remove. + * cp-lang.c (LANG_HOOKS_SIMPLIFY_FUNCTION_TREE): Don't define. + (LANG_HOOKS_SIMPLIFY_EXPR): Define. + * optimize.c (optimize_function): De-hook simplify_function_tree. + * cp-tree.h: Declare cp_simplify_expr. + +2002-07-17 Daniel Berlin + + * Make-lang.in (CXX_C_OBJS): Add tree-alias-ecr.c, + tree-alias-type.o, tree-alias-steen.o, disjoint-set.o. + +2002-06-21 Andreas Jaeger + + * Make-lang.in (cp-simplify.o): New. + +2002-06-18 Jason Merrill + + * cp-simplify.c: New file. + * Make-lang.in: Add it. + * cp-tree.h: Declare cp_simplify_function_tree. + * cp-lang.c (LANG_HOOKS_SIMPLIFY_FUNCTION_TREE): Define. + * optimize.c (optimize_function): Call tree optimizers (but not yet). + +Local Variables: +mode: change-log +change-log-default-name: "ChangeLog.tree-ssa" +End: + + +Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in new file mode 100644 index 000000000..d0a9e5813 --- /dev/null +++ b/gcc/cp/Make-lang.in @@ -0,0 +1,328 @@ +# Top level -*- makefile -*- fragment for GNU C++. +# Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2007, 2008, 2009, 2010, 2011 +# 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 3, 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 COPYING3. If not see +# . + +# This file provides the language dependent support in the main Makefile. +# Each language makefile fragment must provide the following targets: +# +# foo.all.cross, foo.start.encap, foo.rest.encap, +# foo.install-common, foo.install-man, foo.install-info, foo.install-pdf, +# foo.install-html, foo.info, foo.dvi, foo.pdf, foo.html, foo.uninstall, +# foo.mostlyclean, foo.clean, foo.distclean, +# foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4 +# +# where `foo' is the name of the language. +# +# It should also provide rules for: +# +# - making any compiler driver (eg: g++) +# - the compiler proper (eg: cc1plus) +# - define the names for selecting the language in LANGUAGES. + +# Actual names to use when installing a native compiler. +CXX_INSTALL_NAME := $(shell echo c++|sed '$(program_transform_name)') +GXX_INSTALL_NAME := $(shell echo g++|sed '$(program_transform_name)') +CXX_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo c++|sed '$(program_transform_name)') +GXX_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo g++|sed '$(program_transform_name)') +CP_PLUGIN_HEADERS := cp-tree.h cxx-pretty-print.h name-lookup.h + +# +# Define the names for selecting c++ in LANGUAGES. +# Note that it would be nice to move the dependency on g++ +# into the C++ rule, but that needs a little bit of work +# to do the right thing within all.cross. +c++: cc1plus$(exeext) + +# Tell GNU make to ignore these if they exist. +.PHONY: c++ + +g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) coretypes.h $(TM_H) $(GCC_H) \ + $(CONFIG_H) $(OPTS_H) + (SHLIB_LINK='$(SHLIB_LINK)'; \ + $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \ + $(INCLUDES) $(srcdir)/cp/g++spec.c) + +# Create the compiler driver for g++. +GXX_OBJS = $(GCC_OBJS) g++spec.o intl.o prefix.o version.o +g++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS) + +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ + $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBS) + +# Create a version of the g++ driver which calls the cross-compiler. +g++-cross$(exeext): g++$(exeext) + -rm -f g++-cross$(exeext) + cp g++$(exeext) g++-cross$(exeext) + +# The compiler itself. +# Shared with C front end: +CXX_C_OBJS = attribs.o incpath.o prefix.o \ + $(C_COMMON_OBJS) $(CXX_TARGET_OBJS) + +# Language-specific object files for C++ and Objective C++. +CXX_AND_OBJCXX_OBJS = cp/call.o cp/decl.o cp/expr.o cp/pt.o cp/typeck2.o \ + cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parser.o cp/ptree.o cp/rtti.o \ + cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \ + cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o cp/optimize.o \ + cp/mangle.o cp/cp-objcp-common.o cp/name-lookup.o cp/cxx-pretty-print.o \ + cp/cp-gimplify.o tree-mudflap.o $(CXX_C_OBJS) + +# Language-specific object files for C++. +CXX_OBJS = cp/cp-lang.o c-family/stub-objc.o $(CXX_AND_OBJCXX_OBJS) + +c++_OBJS = $(CXX_OBJS) cc1plus-checksum.o cp/g++spec.o + +# Use strict warnings for this front end. +cp-warn = $(STRICT_WARN) + +# compute checksum over all object files and the options +cc1plus-checksum.c : build/genchecksum$(build_exeext) checksum-options \ + $(CXX_OBJS) $(BACKEND) $(LIBDEPS) + build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(LIBDEPS) \ + checksum-options > cc1plus-checksum.c.tmp && \ + $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c + +cc1plus-checksum.o : cc1plus-checksum.c $(CONFIG_H) $(SYSTEM_H) + +cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBDEPS) + +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ + $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) + +# Special build rules. +$(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf + gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \ + $(srcdir)/cp/cfns.gperf > $(srcdir)/cp/cfns.h + +# +# Build hooks: + +c++.all.cross: g++-cross$(exeext) +c++.start.encap: g++$(exeext) +c++.rest.encap: +c++.info: +c++.install-info: +c++.dvi: +c++.pdf: +c++.install-pdf: +c++.install-html: +c++.html: +c++.srcinfo: +c++.srcextra: + +c++.tags: force + cd $(srcdir)/cp; etags -o TAGS.sub *.c *.h --language=none \ + --regex='/DEFTREECODE [(]\([A-Z_]+\)/\1/' cp-tree.def; \ + etags --include TAGS.sub --include ../TAGS.sub + +c++.man: doc/g++.1 + +c++.srcman: doc/g++.1 + -cp -p $^ $(srcdir)/doc + +# 'make check' in gcc/ looks for check-c++, as do all toplevel C++-related +# check targets. However, our DejaGNU framework requires 'check-g++' as its +# entry point. We feed the former to the latter here. +check-c++ : check-g++ +check-c++-subtargets : check-g++-subtargets +# List of targets that can use the generic check- rule and its // variant. +lang_checks += check-g++ +lang_checks_parallelized += check-g++ +# For description see comment above check_gcc_parallelize in gcc/Makefile.in. +check_g++_parallelize = old-deja.exp dg.exp + +# +# Install hooks: +# cc1plus is installed elsewhere as part of $(COMPILERS). + +# Install the driver program as $(target)-g++ +# and also as either g++ (if native) or $(tooldir)/bin/g++. +c++.install-common: installdirs + -rm -f $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext) + -$(INSTALL_PROGRAM) g++$(exeext) $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext) + -chmod a+x $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext) + -rm -f $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext) + -( cd $(DESTDIR)$(bindir) && \ + $(LN) $(GXX_INSTALL_NAME)$(exeext) $(CXX_INSTALL_NAME)$(exeext) ) + -if [ -f cc1plus$(exeext) ] ; then \ + if [ -f g++-cross$(exeext) ] ; then \ + if [ -d $(DESTDIR)$(gcc_tooldir)/bin/. ] ; then \ + rm -f $(DESTDIR)$(gcc_tooldir)/bin/g++$(exeext); \ + $(INSTALL_PROGRAM) g++-cross$(exeext) $(DESTDIR)$(gcc_tooldir)/bin/g++$(exeext); \ + rm -f $(DESTDIR)$(gcc_tooldir)/bin/c++$(exeext); \ + ( cd $(DESTDIR)$(gcc_tooldir)/bin && \ + $(LN) g++$(exeext) c++$(exeext) ); \ + else true; fi; \ + else \ + rm -f $(DESTDIR)$(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \ + ( cd $(DESTDIR)$(bindir) && \ + $(LN) $(GXX_INSTALL_NAME)$(exeext) $(GXX_TARGET_INSTALL_NAME)$(exeext) ); \ + rm -f $(DESTDIR)$(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \ + ( cd $(DESTDIR)$(bindir) && \ + $(LN) $(CXX_INSTALL_NAME)$(exeext) $(CXX_TARGET_INSTALL_NAME)$(exeext) ); \ + fi ; \ + fi + +# We can't use links because not everyone supports them, and we can't use +# .so because Irix 6.5 doesn't support them. So just copy the manpage. +doc/g++.1: doc/gcc.1 + cp $< doc/g++.1 + +c++.install-man: $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext) + +$(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext): doc/g++.1 installdirs + -rm -f $@ + -$(INSTALL_DATA) $< $@ + -chmod a-x $@ + +c++.install-plugin: installdirs +# We keep the directory structure for files in config and .def files. All +# other files are flattened to a single directory. + headers="$(CP_PLUGIN_HEADERS)"; \ + for file in $$headers; do \ + path=$(srcdir)/cp/$$file; \ + dest=$(plugin_includedir)/cp/$$file; \ + echo $(INSTALL_DATA) $$path $(DESTDIR)$$dest; \ + dir=`dirname $$dest`; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + $(INSTALL_DATA) $$path $(DESTDIR)$$dest; \ + done + +c++.uninstall: + -rm -rf $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext) + -rm -rf $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext) + -rm -rf $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext) +# +# Clean hooks: +# A lot of the ancillary files are deleted by the main makefile. +# We just have to delete files specific to us. + +c++.mostlyclean: + -rm -f doc/g++.1 + -rm -f cp/*$(objext) + -rm -f cp/*$(coverageexts) +c++.clean: +c++.distclean: + -rm -f cp/config.status cp/Makefile +c++.maintainer-clean: +# +# Stage hooks: +# The main makefile has already created stage?/cp. + +c++.stage1: stage1-start + -mv cp/*$(objext) stage1/cp +c++.stage2: stage2-start + -mv cp/*$(objext) stage2/cp +c++.stage3: stage3-start + -mv cp/*$(objext) stage3/cp +c++.stage4: stage4-start + -mv cp/*$(objext) stage4/cp +c++.stageprofile: stageprofile-start + -mv cp/*$(objext) stageprofile/cp +c++.stagefeedback: stagefeedback-start + -mv cp/*$(objext) stagefeedback/cp + +# +# .o: .h dependencies. +CXX_TREE_H = $(TREE_H) cp/name-lookup.h cp/cp-tree.h $(C_COMMON_H) \ + $(FUNCTION_H) \ + $(SYSTEM_H) coretypes.h $(CONFIG_H) $(TARGET_H) $(GGC_H) \ + $(srcdir)/../include/hashtab.h + +CXX_PRETTY_PRINT_H = cp/cxx-pretty-print.h $(C_PRETTY_PRINT_H) + +cp/lex.o: cp/lex.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ + $(C_PRAGMA_H) output.h input.h cp/operators.def $(TM_P_H) \ + c-family/c-objc.h +cp/cp-lang.o: cp/cp-lang.c $(CXX_TREE_H) $(TM_H) debug.h langhooks.h \ + $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-cp.h gt-cp-cp-lang.h \ + cp/cp-objcp-common.h $(EXPR_H) $(TARGET_H) +cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/decl.h \ + output.h toplev.h $(HASHTAB_H) $(RTL_H) \ + cp/operators.def $(TM_P_H) $(TREE_INLINE_H) $(DIAGNOSTIC_H) $(C_PRAGMA_H) \ + debug.h gt-cp-decl.h $(TIMEVAR_H) $(TARGET_H) $(PLUGIN_H) \ + intl.h tree-iterator.h $(SPLAY_TREE_H) \ + c-family/c-objc.h +cp/decl2.o: cp/decl2.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/decl.h \ + output.h toplev.h $(C_COMMON_H) gt-cp-decl2.h $(CGRAPH_H) \ + $(C_PRAGMA_H) $(TREE_DUMP_H) intl.h $(TARGET_H) $(GIMPLE_H) $(POINTER_SET_H) \ + $(SPLAY_TREE_H) c-family/c-ada-spec.h \ + c-family/c-objc.h +cp/cp-objcp-common.o : cp/cp-objcp-common.c $(CONFIG_H) $(SYSTEM_H) \ + coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) $(C_COMMON_H) \ + langhooks.h $(LANGHOOKS_DEF_H) $(DIAGNOSTIC_H) debug.h \ + $(CXX_PRETTY_PRINT_H) cp/cp-objcp-common.h gt-cp-cp-objcp-common.h +cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) output.h \ + $(TM_P_H) $(DIAGNOSTIC_CORE_H) gt-cp-typeck2.h $(REAL_H) intl.h +cp/typeck.o: cp/typeck.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ + toplev.h $(DIAGNOSTIC_H) convert.h $(C_COMMON_H) $(TARGET_H) \ + output.h c-family/c-objc.h +cp/class.o: cp/class.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ + $(TARGET_H) convert.h $(CGRAPH_H) $(TREE_DUMP_H) gt-cp-class.h \ + $(SPLAY_TREE_H) +cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ + $(DIAGNOSTIC_CORE_H) intl.h gt-cp-call.h convert.h $(TARGET_H) langhooks.h \ + c-family/c-objc.h +cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) +cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ + $(EXCEPT_H) $(TARGET_H) +cp/method.o: cp/method.c $(CXX_TREE_H) $(TM_H) toplev.h \ + $(TM_P_H) $(TARGET_H) $(DIAGNOSTIC_H) gt-cp-method.h $(GIMPLE_H) +cp/cvt.o: cp/cvt.c $(CXX_TREE_H) $(TM_H) cp/decl.h $(FLAGS_H) \ + convert.h $(TARGET_H) intl.h +cp/search.o: cp/search.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ + intl.h +cp/tree.o: cp/tree.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ + $(TREE_INLINE_H) $(REAL_H) gt-cp-tree.h \ + $(TARGET_H) debug.h $(CGRAPH_H) $(SPLAY_TREE_H) $(GIMPLE_H) +cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(TM_H) +cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) convert.h \ + $(TARGET_H) $(C_PRAGMA_H) gt-cp-rtti.h intl.h +cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ + cp/cfns.h $(TREE_INLINE_H) $(TARGET_H) +cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) $(TM_P_H) +cp/pt.o: cp/pt.c $(CXX_TREE_H) $(TM_H) cp/decl.h cp/cp-objcp-common.h \ + toplev.h $(TREE_INLINE_H) pointer-set.h gt-cp-pt.h vecprim.h intl.h \ + c-family/c-objc.h +cp/error.o: cp/error.c $(CXX_TREE_H) $(TM_H) $(DIAGNOSTIC_H) \ + $(FLAGS_H) $(REAL_H) $(LANGHOOKS_DEF_H) $(CXX_PRETTY_PRINT_H) \ + tree-diagnostic.h tree-pretty-print.h c-family/c-objc.h +cp/repo.o: cp/repo.c $(CXX_TREE_H) $(TM_H) toplev.h $(DIAGNOSTIC_CORE_H) \ + gt-cp-repo.h +cp/semantics.o: cp/semantics.c $(CXX_TREE_H) $(TM_H) toplev.h \ + $(FLAGS_H) output.h $(RTL_H) $(TIMEVAR_H) \ + $(TREE_INLINE_H) $(CGRAPH_H) $(TARGET_H) $(C_COMMON_H) $(GIMPLE_H) \ + bitmap.h gt-cp-semantics.h c-family/c-objc.h +cp/dump.o: cp/dump.c $(CXX_TREE_H) $(TM_H) $(TREE_DUMP_H) +cp/optimize.o: cp/optimize.c $(CXX_TREE_H) $(TM_H) \ + input.h $(PARAMS_H) debug.h $(TREE_INLINE_H) $(GIMPLE_H) \ + $(TARGET_H) tree-iterator.h $(CGRAPH_H) $(DIAGNOSTIC_CORE_H) +cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $(TM_H) $(REAL_H) \ + gt-cp-mangle.h $(TARGET_H) $(TM_P_H) $(CGRAPH_H) +cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) $(DIAGNOSTIC_CORE_H) \ + gt-cp-parser.h output.h $(TARGET_H) $(PLUGIN_H) intl.h \ + c-family/c-objc.h +cp/cp-gimplify.o: cp/cp-gimplify.c $(CXX_TREE_H) $(C_COMMON_H) \ + $(TM_H) coretypes.h pointer-set.h tree-iterator.h $(SPLAY_TREE_H) + +cp/name-lookup.o: cp/name-lookup.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ + $(TM_H) $(CXX_TREE_H) $(TIMEVAR_H) gt-cp-name-lookup.h \ + $(DIAGNOSTIC_CORE_H) $(FLAGS_H) debug.h + +cp/cxx-pretty-print.o: cp/cxx-pretty-print.c $(CXX_PRETTY_PRINT_H) \ + $(CONFIG_H) $(SYSTEM_H) $(TM_H) coretypes.h $(CXX_TREE_H) tree-pretty-print.h diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS new file mode 100644 index 000000000..79a1a421b --- /dev/null +++ b/gcc/cp/NEWS @@ -0,0 +1,409 @@ +*** Changes in GCC 3.4: + +* Changes in GCC 3.4 are described in 'gcc-3.4/changes.html' + +*** Changes in GCC 3.3: + +* The "new X = 3" extension has been removed; you must now use "new X(3)". + +* G++ no longer allows in-class initializations of static data members + that do not have arithmetic or enumeration type. For example: + + struct S { + static const char* const p = "abc"; + }; + + is no longer accepted. + + Use the standards-conformant form: + + struct S { + static const char* const p; + }; + + const char* const S::p = "abc"; + + instead. + + (ISO C++ is even stricter; it does not allow in-class + initializations of floating-point types.) + +*** Changes in GCC 3.1: + +* -fhonor-std and -fno-honor-std have been removed. -fno-honor-std was + a workaround to allow std compliant code to work with the non-std + compliant libstdc++-v2. libstdc++-v3 is std compliant. + +* The C++ ABI has been fixed so that `void (A::*)() const' is mangled as + "M1AKFvvE", rather than "MK1AFvvE" as before. This change only affects + pointer to cv-qualified member function types. + +* The C++ ABI has been changed to correctly handle this code: + + struct A { + void operator delete[] (void *, size_t); + }; + + struct B : public A { + }; + + new B[10]; + + The amount of storage allocated for the array will be greater than + it was in 3.0, in order to store the number of elements in the + array, so that the correct size can be passed to `operator delete[]' + when the array is deleted. Previously, the value passed to + `operator delete[]' was unpredictable. + + This change will only affect code that declares a two-argument + `operator delete[]' with a second parameter of type `size_t' + in a base class, and does not override that definition in a + derived class. + +* The C++ ABI has been changed so that: + + struct A { + void operator delete[] (void *, size_t); + void operator delete[] (void *); + }; + + does not cause unnecessary storage to be allocated when an array of + `A' objects is allocated. + + This change will only affect code that declares both of these + forms of `operator delete[]', and declared the two-argument form + before the one-argument form. + +* The C++ ABI has been changed so that when a parameter is passed by value, + any cleanup for that parameter is performed in the caller, as specified + by the ia64 C++ ABI, rather than the called function as before. As a + result, classes with a non-trivial destructor but a trivial copy + constructor will be passed and returned by invisible reference, rather + than by bitwise copy as before. + +* G++ now supports the "named return value optimization": for code like + + A f () { + A a; + ... + return a; + } + + G++ will allocate 'a' in the return value slot, so that the return + becomes a no-op. For this to work, all return statements in the function + must return the same variable. + +*** Changes in GCC 3.0: + +* Support for guiding declarations has been removed. + +* G++ now supports importing member functions from base classes with a + using-declaration. + +* G++ now enforces access control for nested types. + +* In some obscure cases, functions with the same type could have the + same mangled name. This bug caused compiler crashes, link-time clashes, + and debugger crashes. Fixing this bug required breaking ABI + compatibility for the functions involved. The functions in questions + are those whose types involve non-type template arguments whose + mangled representations require more than one digit. + +* Support for assignment to `this' has been removed. This idiom + was used in the very early days of C++, before users were allowed + to overload `operator new'; it is no longer allowed by the C++ + standard. + +* Support for signatures, a G++ extension, have been removed. + +* Certain invalid conversions that were previously accepted will now + be rejected. For example, assigning function pointers of one type + to function pointers of another type now requires a cast, whereas + previously g++ would sometimes accept the code even without the + cast. + +* G++ previously allowed `sizeof (X::Y)' where Y was a non-static + member of X, even if the `sizeof' expression occurred outside + of a non-static member function of X (or one of its derived classes, + or a member-initializer for X or one of its derived classes.) This + extension has been removed. + +* G++ no longer allows you to overload the conditional operator (i.e., + the `?:' operator.) + +* The "named return value" extension: + + int f () return r { r = 3; } + + has been deprecated, and will be removed in a future version of G++. + +*** Changes in GCC 2.95: + +* Messages about non-conformant code that we can still handle ("pedwarns") + are now errors by default, rather than warnings. This can be reverted + with -fpermissive, and is overridden by -pedantic or -pedantic-errors. + +* String constants are now of type `const char[n]', rather than `char[n]'. + This can be reverted with -fno-const-strings. + +* References to functions are now supported. + +* Lookup of class members during class definition now works in all cases. + +* In overload resolution, type conversion operators are now properly + treated as always coming from the most derived class. + +* C9x-style restricted pointers are supported, using the `__restrict' + keyword. + +* You can now use -fno-implicit-inline-templates to suppress writing out + implicit instantiations of inline templates. Normally we do write them + out, even with -fno-implicit-templates, so that optimization doesn't + affect which instantiations are needed. + +* -fstrict-prototype now also suppresses implicit declarations. + +* Many obsolete options have been removed: -fall-virtual, -fmemoize-lookups, + -fsave-memoized, +e?, -fenum-int-equivalence, -fno-nonnull-objects. + +* Unused virtual functions can be discarded on some targets by specifying + -ffunction-sections -fvtable-gc to the compiler and --gc-sections to the + linker. Unfortunately, this only works on Linux if you're linking + statically. + +* Lots of bugs stomped. + +*** Changes in EGCS 1.1: + +* Namespaces are fully supported. The library has not yet been converted + to use namespace std, however, and the old std-faking code is still on by + default. To turn it off, you can use -fhonor-std. + +* Massive template improvements: + + member template classes are supported. + + template friends are supported. + + template template parameters are supported. + + local classes in templates are supported. + + lots of bugs fixed. + +* operator new now throws bad_alloc where appropriate. + +* Exception handling is now thread safe, and supports nested exceptions and + placement delete. Exception handling overhead on x86 is much lower with + GNU as 2.9. + +* protected virtual inheritance is now supported. + +* Loops are optimized better; we now move the test to the end in most + cases, like the C frontend does. + +* For class D derived from B which has a member 'int i', &D::i is now of + type 'int B::*' instead of 'int D::*'. + +* An _experimental_ new ABI for g++ can be turned on with -fnew-abi. The + current features of this are more efficient allocation of base classes + (including the empty base optimization), and more compact mangling of C++ + symbol names (which can be turned on separately with -fsquangle). This + ABI is subject to change without notice, so don't use it for anything + that you don't want to rebuild with every release of the compiler. + + As with all ABI-changing flags, this flag is for experts only, as all + code (including the library code in libgcc and libstdc++) must be + compiled with the same ABI. + +*** Changes in EGCS 1.0: + +* A public review copy of the December 1996 Draft of the ISO/ANSI C++ + standard is now available. See + + http://www.cygnus.com/misc/wp/ + + for more information. + +* g++ now uses a new implementation of templates. The basic idea is that + now templates are minimally parsed when seen and then expanded later. + This allows conformant early name binding and instantiation controls, + since instantiations no longer have to go through the parser. + + What you get: + + + Inlining of template functions works without any extra effort or + modifications. + + Instantiations of class templates and methods defined in the class + body are deferred until they are actually needed (unless + -fexternal-templates is specified). + + Nested types in class templates work. + + Static data member templates work. + + Member function templates are now supported. + + Partial specialization of class templates is now supported. + + Explicit specification of template parameters to function templates + is now supported. + + Things you may need to fix in your code: + + + Syntax errors in templates that are never instantiated will now be + diagnosed. + + Types and class templates used in templates must be declared + first, or the compiler will assume they are not types, and fail. + + Similarly, nested types of template type parameters must be tagged + with the 'typename' keyword, except in base lists. In many cases, + but not all, the compiler will tell you where you need to add + 'typename'. For more information, see + + http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res + + + Guiding declarations are no longer supported. Function declarations, + including friend declarations, do not refer to template instantiations. + You can restore the old behavior with -fguiding-decls until you fix + your code. + + Other features: + + + Default function arguments in templates will not be evaluated (or + checked for semantic validity) unless they are needed. Default + arguments in class bodies will not be parsed until the class + definition is complete. + + The -ftemplate-depth-NN flag can be used to increase the maximum + recursive template instantiation depth, which defaults to 17. If you + need to use this flag, the compiler will tell you. + + Explicit instantiation of template constructors and destructors is + now supported. For instance: + + template A::A(const A&); + + Still not supported: + + + Member class templates. + + Template friends. + +* Exception handling support has been significantly improved and is on by + default. The compiler supports two mechanisms for walking back up the + call stack; one relies on static information about how registers are + saved, and causes no runtime overhead for code that does not throw + exceptions. The other mechanism uses setjmp and longjmp equivalents, and + can result in quite a bit of runtime overhead. You can determine which + mechanism is the default for your target by compiling a testcase that + uses exceptions and doing an 'nm' on the object file; if it uses __throw, + it's using the first mechanism. If it uses __sjthrow, it's using the + second. + + You can turn EH support off with -fno-exceptions. + +* RTTI support has been rewritten to work properly and is now on by default. + This means code that uses virtual functions will have a modest space + overhead. You can use the -fno-rtti flag to disable RTTI support. + +* On ELF systems, duplicate copies of symbols with 'initialized common' + linkage (such as template instantiations, vtables, and extern inlines) + will now be discarded by the GNU linker, so you don't need to use -frepo. + This support requires GNU ld from binutils 2.8 or later. + +* The overload resolution code has been rewritten to conform to the latest + C++ Working Paper. Built-in operators are now considered as candidates + in operator overload resolution. Function template overloading chooses + the more specialized template, and handles base classes in type deduction + and guiding declarations properly. In this release the old code can + still be selected with -fno-ansi-overloading, although this is not + supported and will be removed in a future release. + +* Standard usage syntax for the std namespace is supported; std is treated + as an alias for global scope. General namespaces are still not supported. + +* New flags: + + + New warning -Wno-pmf-conversion (don't warn about + converting from a bound member function pointer to function + pointer). + + + A flag -Weffc++ has been added for violations of some of the style + guidelines in Scott Meyers' _Effective C++_ books. + + + -Woverloaded-virtual now warns if a virtual function in a base + class is hidden in a derived class, rather than warning about + virtual functions being overloaded (even if all of the inherited + signatures are overridden) as it did before. + + + -Wall no longer implies -W. The new warning flag, -Wsign-compare, + included in -Wall, warns about dangerous comparisons of signed and + unsigned values. Only the flag is new; it was previously part of + -W. + + + The new flag, -fno-weak, disables the use of weak symbols. + +* Synthesized methods are now emitted in any translation units that need + an out-of-line copy. They are no longer affected by #pragma interface + or #pragma implementation. + +* __FUNCTION__ and __PRETTY_FUNCTION__ are now treated as variables by the + parser; previously they were treated as string constants. So code like + `printf (__FUNCTION__ ": foo")' must be rewritten to + `printf ("%s: foo", __FUNCTION__)'. This is necessary for templates. + +* local static variables in extern inline functions will be shared between + translation units. + +* -fvtable-thunks is supported for all targets, and is the default for + Linux with glibc 2.x (also called libc 6.x). + +* bool is now always the same size as another built-in type. Previously, + a 64-bit RISC target using a 32-bit ABI would have 32-bit pointers and a + 64-bit bool. This should only affect Irix 6, which was not supported in + 2.7.2. + +* new (nothrow) is now supported. + +* Synthesized destructors are no longer made virtual just because the class + already has virtual functions, only if they override a virtual destructor + in a base class. The compiler will warn if this affects your code. + +* The g++ driver now only links against libstdc++, not libg++; it is + functionally identical to the c++ driver. + +* (void *)0 is no longer considered a null pointer constant; NULL in + is now defined as __null, a magic constant of type (void *) + normally, or (size_t) with -ansi. + +* The name of a class is now implicitly declared in its own scope; A::A + refers to A. + +* Local classes are now supported. + +* __attribute__ can now be attached to types as well as declarations. + +* The compiler no longer emits a warning if an ellipsis is used as a + function's argument list. + +* Definition of nested types outside of their containing class is now + supported. For instance: + + struct A { + struct B; + B* bp; + }; + + struct A::B { + int member; + }; + +* On the HPPA, some classes that do not define a copy constructor + will be passed and returned in memory again so that functions + returning those types can be inlined. + +*** The g++ team thanks everyone that contributed to this release, + but especially: + +* Joe Buck , the maintainer of the g++ FAQ. +* Brendan Kehoe , who coordinates testing of g++. +* Jason Merrill , the g++ maintainer. +* Mark Mitchell , who implemented member function + templates and explicit qualification of function templates. +* Mike Stump , the previous g++ maintainer, who did most of + the exception handling work. + + +Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, +2005 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/cp/call.c b/gcc/cp/call.c new file mode 100644 index 000000000..50e5c5aff --- /dev/null +++ b/gcc/cp/call.c @@ -0,0 +1,8458 @@ +/* Functions related to invoking methods and overloaded functions. + Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 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 3, 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 COPYING3. If not see +. */ + + +/* High-level class interface. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "output.h" +#include "flags.h" +#include "toplev.h" +#include "diagnostic-core.h" +#include "intl.h" +#include "target.h" +#include "convert.h" +#include "langhooks.h" +#include "c-family/c-objc.h" + +/* The various kinds of conversion. */ + +typedef enum conversion_kind { + ck_identity, + ck_lvalue, + ck_qual, + ck_std, + ck_ptr, + ck_pmem, + ck_base, + ck_ref_bind, + ck_user, + ck_ambig, + ck_list, + ck_aggr, + ck_rvalue +} conversion_kind; + +/* The rank of the conversion. Order of the enumerals matters; better + conversions should come earlier in the list. */ + +typedef enum conversion_rank { + cr_identity, + cr_exact, + cr_promotion, + cr_std, + cr_pbool, + cr_user, + cr_ellipsis, + cr_bad +} conversion_rank; + +/* An implicit conversion sequence, in the sense of [over.best.ics]. + The first conversion to be performed is at the end of the chain. + That conversion is always a cr_identity conversion. */ + +typedef struct conversion conversion; +struct conversion { + /* The kind of conversion represented by this step. */ + conversion_kind kind; + /* The rank of this conversion. */ + conversion_rank rank; + BOOL_BITFIELD user_conv_p : 1; + BOOL_BITFIELD ellipsis_p : 1; + BOOL_BITFIELD this_p : 1; + /* True if this conversion would be permitted with a bending of + language standards, e.g. disregarding pointer qualifiers or + converting integers to pointers. */ + BOOL_BITFIELD bad_p : 1; + /* If KIND is ck_ref_bind ck_base_conv, true to indicate that a + temporary should be created to hold the result of the + conversion. */ + BOOL_BITFIELD need_temporary_p : 1; + /* If KIND is ck_ptr or ck_pmem, true to indicate that a conversion + from a pointer-to-derived to pointer-to-base is being performed. */ + BOOL_BITFIELD base_p : 1; + /* If KIND is ck_ref_bind, true when either an lvalue reference is + being bound to an lvalue expression or an rvalue reference is + being bound to an rvalue expression. If KIND is ck_rvalue, + true when we should treat an lvalue as an rvalue (12.8p33). If + KIND is ck_base, always false. */ + BOOL_BITFIELD rvaluedness_matches_p: 1; + BOOL_BITFIELD check_narrowing: 1; + /* The type of the expression resulting from the conversion. */ + tree type; + union { + /* The next conversion in the chain. Since the conversions are + arranged from outermost to innermost, the NEXT conversion will + actually be performed before this conversion. This variant is + used only when KIND is neither ck_identity nor ck_ambig. */ + conversion *next; + /* The expression at the beginning of the conversion chain. This + variant is used only if KIND is ck_identity or ck_ambig. */ + tree expr; + /* The array of conversions for an initializer_list. */ + conversion **list; + } u; + /* The function candidate corresponding to this conversion + sequence. This field is only used if KIND is ck_user. */ + struct z_candidate *cand; +}; + +#define CONVERSION_RANK(NODE) \ + ((NODE)->bad_p ? cr_bad \ + : (NODE)->ellipsis_p ? cr_ellipsis \ + : (NODE)->user_conv_p ? cr_user \ + : (NODE)->rank) + +#define BAD_CONVERSION_RANK(NODE) \ + ((NODE)->ellipsis_p ? cr_ellipsis \ + : (NODE)->user_conv_p ? cr_user \ + : (NODE)->rank) + +static struct obstack conversion_obstack; +static bool conversion_obstack_initialized; +struct rejection_reason; + +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 (conversion *, conversion *); +static tree build_over_call (struct z_candidate *, int, tsubst_flags_t); +static tree build_java_interface_fn_ref (tree, tree); +#define convert_like(CONV, EXPR, COMPLAIN) \ + convert_like_real ((CONV), (EXPR), NULL_TREE, 0, 0, \ + /*issue_conversion_warnings=*/true, \ + /*c_cast_p=*/false, (COMPLAIN)) +#define convert_like_with_context(CONV, EXPR, FN, ARGNO, COMPLAIN ) \ + convert_like_real ((CONV), (EXPR), (FN), (ARGNO), 0, \ + /*issue_conversion_warnings=*/true, \ + /*c_cast_p=*/false, (COMPLAIN)) +static tree convert_like_real (conversion *, tree, tree, int, int, bool, + bool, tsubst_flags_t); +static void op_error (enum tree_code, enum tree_code, tree, tree, + tree, bool); +static VEC(tree,gc) *resolve_args (VEC(tree,gc) *); +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 (location_t, 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, const VEC(tree,gc) *, + tree, tree, tree, int, unification_kind_t); +static struct z_candidate *add_template_candidate_real + (struct z_candidate **, tree, tree, tree, tree, const VEC(tree,gc) *, + tree, tree, tree, int, tree, unification_kind_t); +static struct z_candidate *add_template_conv_candidate + (struct z_candidate **, tree, tree, tree, const VEC(tree,gc) *, 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, const VEC(tree,gc) *, tree, + tree); +static struct z_candidate *add_function_candidate + (struct z_candidate **, tree, tree, tree, const VEC(tree,gc) *, tree, + tree, int); +static conversion *implicit_conversion (tree, tree, tree, bool, int); +static conversion *standard_conversion (tree, tree, tree, bool, int); +static conversion *reference_binding (tree, tree, tree, bool, int); +static conversion *build_conv (conversion_kind, tree, conversion *); +static conversion *build_list_conv (tree, tree, int); +static bool is_subseq (conversion *, conversion *); +static conversion *maybe_handle_ref_bind (conversion **); +static void maybe_handle_implicit_object (conversion **); +static struct z_candidate *add_candidate + (struct z_candidate **, tree, tree, const VEC(tree,gc) *, size_t, + conversion **, tree, tree, int, struct rejection_reason *); +static tree source_type (conversion *); +static void add_warning (struct z_candidate *, struct z_candidate *); +static bool reference_compatible_p (tree, tree); +static conversion *convert_class_to_reference (tree, tree, tree, int); +static conversion *direct_reference_binding (tree, conversion *); +static bool promoted_arithmetic_type_p (tree); +static conversion *conditional_conversion (tree, tree); +static char *name_as_c_string (tree, tree, bool *); +static tree prep_operand (tree); +static void add_candidates (tree, tree, const VEC(tree,gc) *, tree, tree, bool, + tree, tree, int, struct z_candidate **); +static conversion *merge_conversion_sequences (conversion *, conversion *); +static bool magic_varargs_p (tree); +static tree build_temp (tree, tree, int, diagnostic_t *, tsubst_flags_t); + +/* Returns nonzero iff the destructor name specified in NAME matches BASETYPE. + NAME can take many forms... */ + +bool +check_dtor_name (tree basetype, tree name) +{ + /* 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); + else if (TYPE_P (name)) + /* OK */; + else if (TREE_CODE (name) == IDENTIFIER_NODE) + { + if ((MAYBE_CLASS_TYPE_P (basetype) + && name == constructor_name (basetype)) + || (TREE_CODE (basetype) == ENUMERAL_TYPE + && name == TYPE_IDENTIFIER (basetype))) + return true; + else + name = get_type_value (name); + } + else + { + /* In the case of: + + template struct S { ~S(); }; + int i; + i.~S(); + + NAME will be a class template. */ + gcc_assert (DECL_CLASS_TEMPLATE_P (name)); + return false; + } + + if (!name || name == error_mark_node) + return false; + return same_type_p (TYPE_MAIN_VARIANT (basetype), TYPE_MAIN_VARIANT (name)); +} + +/* 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); + + /* We have to do these by hand to avoid real pointer to member + 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 a CALL_EXPR, we can handle FUNCTION_TYPEs, METHOD_TYPEs, or + POINTER_TYPE to those. Note, pointer to member function types + (TYPE_PTRMEMFUNC_P) must be handled by our callers. There are + two variants. build_call_a is the primitive taking an array of + arguments, while build_call_n is a wrapper that handles varargs. */ + +tree +build_call_n (tree function, int n, ...) +{ + if (n == 0) + return build_call_a (function, 0, NULL); + else + { + tree *argarray = XALLOCAVEC (tree, n); + va_list ap; + int i; + + va_start (ap, n); + for (i = 0; i < n; i++) + argarray[i] = va_arg (ap, tree); + va_end (ap); + return build_call_a (function, n, argarray); + } +} + +tree +build_call_a (tree function, int n, tree *argarray) +{ + int is_constructor = 0; + int nothrow; + tree decl; + tree result_type; + tree fntype; + int i; + + function = build_addr_func (function); + + gcc_assert (TYPE_PTR_P (TREE_TYPE (function))); + fntype = TREE_TYPE (TREE_TYPE (function)); + gcc_assert (TREE_CODE (fntype) == FUNCTION_TYPE + || TREE_CODE (fntype) == METHOD_TYPE); + result_type = TREE_TYPE (fntype); + /* An rvalue has no cv-qualifiers. */ + if (SCALAR_TYPE_P (result_type) || VOID_TYPE_P (result_type)) + result_type = cv_unqualified (result_type); + + if (TREE_CODE (function) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) + { + decl = TREE_OPERAND (function, 0); + if (!TREE_USED (decl)) + { + /* We invoke build_call directly for several library + functions. These may have been declared normally if + we're building libgcc, so we can't just check + DECL_ARTIFICIAL. */ + gcc_assert (DECL_ARTIFICIAL (decl) + || !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), + "__", 2)); + mark_used (decl); + } + } + else + decl = NULL_TREE; + + /* We check both the decl and the type; a function may be known not to + throw without being declared throw(). */ + nothrow = ((decl && TREE_NOTHROW (decl)) + || TYPE_NOTHROW_P (TREE_TYPE (TREE_TYPE (function)))); + + if (!nothrow && at_function_scope_p () && cfun && cp_function_chain) + cp_function_chain->can_throw = 1; + + if (decl && TREE_THIS_VOLATILE (decl) && cfun && cp_function_chain) + current_function_returns_abnormally = 1; + + if (decl && TREE_DEPRECATED (decl)) + warn_deprecated_use (decl, NULL_TREE); + require_complete_eh_spec_types (fntype, decl); + + if (decl && DECL_CONSTRUCTOR_P (decl)) + is_constructor = 1; + + /* Don't pass empty class objects by value. This is useful + for tags in STL, which are used to control overload resolution. + We don't need to handle other cases of copying empty classes. */ + if (! decl || ! DECL_BUILT_IN (decl)) + for (i = 0; i < n; i++) + if (is_empty_class (TREE_TYPE (argarray[i])) + && ! TREE_ADDRESSABLE (TREE_TYPE (argarray[i]))) + { + tree t = build0 (EMPTY_CLASS_EXPR, TREE_TYPE (argarray[i])); + argarray[i] = build2 (COMPOUND_EXPR, TREE_TYPE (t), + argarray[i], t); + } + + function = build_call_array_loc (input_location, + result_type, function, n, argarray); + TREE_HAS_CONSTRUCTOR (function) = is_constructor; + TREE_NOTHROW (function) = nothrow; + + return function; +} + +/* Build something of the form ptr->method (args) + or object.method (args). This can also build + calls to constructors, and find friends. + + Member functions always take their class variable + as a pointer. + + INSTANCE is a class instance. + + NAME is the name of the method desired, usually an IDENTIFIER_NODE. + + PARMS help to figure out what that NAME really refers to. + + 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. + + If this is all OK, calls build_function_call with the resolved + member function. + + This function must also handle being called to perform + initialization, promotion/coercion of arguments, and + instantiation of default parameters. + + Note that NAME may refer to an instance variable name. If + `operator()()' is defined for the type of that field, then we return + that result. */ + +/* New overloading code. */ + +typedef struct z_candidate z_candidate; + +typedef struct candidate_warning candidate_warning; +struct candidate_warning { + z_candidate *loser; + candidate_warning *next; +}; + +/* Information for providing diagnostics about why overloading failed. */ + +enum rejection_reason_code { + rr_none, + rr_arity, + rr_arg_conversion, + rr_bad_arg_conversion +}; + +struct conversion_info { + /* The index of the argument, 0-based. */ + int n_arg; + /* The type of the actual argument. */ + tree from_type; + /* The type of the formal argument. */ + tree to_type; +}; + +struct rejection_reason { + enum rejection_reason_code code; + union { + /* Information about an arity mismatch. */ + struct { + /* The expected number of arguments. */ + int expected; + /* The actual number of arguments in the call. */ + int actual; + /* Whether the call was a varargs call. */ + bool call_varargs_p; + } arity; + /* Information about an argument conversion mismatch. */ + struct conversion_info conversion; + /* Same, but for bad argument conversions. */ + struct conversion_info bad_conversion; + } u; +}; + +struct z_candidate { + /* The FUNCTION_DECL that will be called if this candidate is + selected by overload resolution. */ + tree fn; + /* If not NULL_TREE, the first argument to use when calling this + function. */ + tree first_arg; + /* The rest of the arguments to use when calling this function. If + there are no further arguments this may be NULL or it may be an + empty vector. */ + const VEC(tree,gc) *args; + /* The implicit conversion sequences for each of the arguments to + FN. */ + conversion **convs; + /* The number of implicit conversion sequences. */ + size_t num_convs; + /* If FN is a user-defined conversion, the standard conversion + sequence from the type returned by FN to the desired destination + type. */ + conversion *second_conv; + int viable; + struct rejection_reason *reason; + /* If FN is a member function, the binfo indicating the path used to + qualify the name of FN at the call site. This path is used to + determine whether or not FN is accessible if it is selected by + overload resolution. The DECL_CONTEXT of FN will always be a + (possibly improper) base of this binfo. */ + tree access_path; + /* If FN is a non-static member function, the binfo indicating the + subobject to which the `this' pointer should be converted if FN + is selected by overload resolution. The type pointed to the by + the `this' pointer must correspond to the most derived class + indicated by the CONVERSION_PATH. */ + tree conversion_path; + tree template_decl; + tree explicit_targs; + candidate_warning *warnings; + z_candidate *next; +}; + +/* Returns true iff T is a null pointer constant in the sense of + [conv.ptr]. */ + +bool +null_ptr_cst_p (tree t) +{ + /* [conv.ptr] + + A null pointer constant is an integral constant expression + (_expr.const_) rvalue of integer type that evaluates to zero or + an rvalue of type std::nullptr_t. */ + if (NULLPTR_TYPE_P (TREE_TYPE (t))) + return true; + if (CP_INTEGRAL_TYPE_P (TREE_TYPE (t))) + { + if (cxx_dialect >= cxx0x) + { + t = fold_non_dependent_expr (t); + t = maybe_constant_value (t); + if (TREE_CONSTANT (t) && integer_zerop (t)) + return true; + } + else + { + t = integral_constant_value (t); + STRIP_NOPS (t); + if (integer_zerop (t) && !TREE_OVERFLOW (t)) + return true; + } + } + return false; +} + +/* Returns nonzero if PARMLIST consists of only default parms and/or + ellipsis. */ + +bool +sufficient_parms_p (const_tree parmlist) +{ + for (; parmlist && parmlist != void_list_node; + parmlist = TREE_CHAIN (parmlist)) + if (!TREE_PURPOSE (parmlist)) + return false; + return true; +} + +/* Allocate N bytes of memory from the conversion obstack. The memory + is zeroed before being returned. */ + +static void * +conversion_obstack_alloc (size_t n) +{ + void *p; + if (!conversion_obstack_initialized) + { + gcc_obstack_init (&conversion_obstack); + conversion_obstack_initialized = true; + } + p = obstack_alloc (&conversion_obstack, n); + memset (p, 0, n); + return p; +} + +/* Allocate rejection reasons. */ + +static struct rejection_reason * +alloc_rejection (enum rejection_reason_code code) +{ + struct rejection_reason *p; + p = (struct rejection_reason *) conversion_obstack_alloc (sizeof *p); + p->code = code; + return p; +} + +static struct rejection_reason * +arity_rejection (tree first_arg, int expected, int actual) +{ + struct rejection_reason *r = alloc_rejection (rr_arity); + int adjust = first_arg != NULL_TREE; + r->u.arity.expected = expected - adjust; + r->u.arity.actual = actual - adjust; + return r; +} + +static struct rejection_reason * +arg_conversion_rejection (tree first_arg, int n_arg, tree from, tree to) +{ + struct rejection_reason *r = alloc_rejection (rr_arg_conversion); + int adjust = first_arg != NULL_TREE; + r->u.conversion.n_arg = n_arg - adjust; + r->u.conversion.from_type = from; + r->u.conversion.to_type = to; + return r; +} + +static struct rejection_reason * +bad_arg_conversion_rejection (tree first_arg, int n_arg, tree from, tree to) +{ + struct rejection_reason *r = alloc_rejection (rr_bad_arg_conversion); + int adjust = first_arg != NULL_TREE; + r->u.bad_conversion.n_arg = n_arg - adjust; + r->u.bad_conversion.from_type = from; + r->u.bad_conversion.to_type = to; + return r; +} + +/* Dynamically allocate a conversion. */ + +static conversion * +alloc_conversion (conversion_kind kind) +{ + conversion *c; + c = (conversion *) conversion_obstack_alloc (sizeof (conversion)); + c->kind = kind; + return c; +} + +#ifdef ENABLE_CHECKING + +/* Make sure that all memory on the conversion obstack has been + freed. */ + +void +validate_conversion_obstack (void) +{ + if (conversion_obstack_initialized) + gcc_assert ((obstack_next_free (&conversion_obstack) + == obstack_base (&conversion_obstack))); +} + +#endif /* ENABLE_CHECKING */ + +/* Dynamically allocate an array of N conversions. */ + +static conversion ** +alloc_conversions (size_t n) +{ + return (conversion **) conversion_obstack_alloc (n * sizeof (conversion *)); +} + +static conversion * +build_conv (conversion_kind code, tree type, conversion *from) +{ + conversion *t; + conversion_rank rank = CONVERSION_RANK (from); + + /* Note that the caller is responsible for filling in t->cand for + user-defined conversions. */ + t = alloc_conversion (code); + t->type = type; + t->u.next = from; + + switch (code) + { + case ck_ptr: + case ck_pmem: + case ck_base: + case ck_std: + if (rank < cr_std) + rank = cr_std; + break; + + case ck_qual: + if (rank < cr_exact) + rank = cr_exact; + break; + + default: + break; + } + t->rank = rank; + t->user_conv_p = (code == ck_user || from->user_conv_p); + t->bad_p = from->bad_p; + t->base_p = false; + return t; +} + +/* Represent a conversion from CTOR, a braced-init-list, to TYPE, a + specialization of std::initializer_list, if such a conversion is + possible. */ + +static conversion * +build_list_conv (tree type, tree ctor, int flags) +{ + tree elttype = TREE_VEC_ELT (CLASSTYPE_TI_ARGS (type), 0); + unsigned len = CONSTRUCTOR_NELTS (ctor); + conversion **subconvs = alloc_conversions (len); + conversion *t; + unsigned i; + tree val; + + /* Within a list-initialization we can have more user-defined + conversions. */ + flags &= ~LOOKUP_NO_CONVERSION; + /* But no narrowing conversions. */ + flags |= LOOKUP_NO_NARROWING; + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val) + { + conversion *sub + = implicit_conversion (elttype, TREE_TYPE (val), val, + false, flags); + if (sub == NULL) + return NULL; + + subconvs[i] = sub; + } + + t = alloc_conversion (ck_list); + t->type = type; + t->u.list = subconvs; + t->rank = cr_exact; + + for (i = 0; i < len; ++i) + { + conversion *sub = subconvs[i]; + if (sub->rank > t->rank) + t->rank = sub->rank; + if (sub->user_conv_p) + t->user_conv_p = true; + if (sub->bad_p) + t->bad_p = true; + } + + return t; +} + +/* Subroutine of build_aggr_conv: check whether CTOR, a braced-init-list, + is a valid aggregate initializer for array type ATYPE. */ + +static bool +can_convert_array (tree atype, tree ctor, int flags) +{ + unsigned i; + tree elttype = TREE_TYPE (atype); + for (i = 0; i < CONSTRUCTOR_NELTS (ctor); ++i) + { + tree val = CONSTRUCTOR_ELT (ctor, i)->value; + bool ok; + if (TREE_CODE (elttype) == ARRAY_TYPE + && TREE_CODE (val) == CONSTRUCTOR) + ok = can_convert_array (elttype, val, flags); + else + ok = can_convert_arg (elttype, TREE_TYPE (val), val, flags); + if (!ok) + return false; + } + return true; +} + +/* Represent a conversion from CTOR, a braced-init-list, to TYPE, an + aggregate class, if such a conversion is possible. */ + +static conversion * +build_aggr_conv (tree type, tree ctor, int flags) +{ + unsigned HOST_WIDE_INT i = 0; + conversion *c; + tree field = next_initializable_field (TYPE_FIELDS (type)); + tree empty_ctor = NULL_TREE; + + for (; field; field = next_initializable_field (DECL_CHAIN (field))) + { + tree ftype = TREE_TYPE (field); + tree val; + bool ok; + + if (i < CONSTRUCTOR_NELTS (ctor)) + val = CONSTRUCTOR_ELT (ctor, i)->value; + else + { + if (empty_ctor == NULL_TREE) + empty_ctor = build_constructor (init_list_type_node, NULL); + val = empty_ctor; + } + ++i; + + if (TREE_CODE (ftype) == ARRAY_TYPE + && TREE_CODE (val) == CONSTRUCTOR) + ok = can_convert_array (ftype, val, flags); + else + ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags); + + if (!ok) + return NULL; + + if (TREE_CODE (type) == UNION_TYPE) + break; + } + + if (i < CONSTRUCTOR_NELTS (ctor)) + return NULL; + + c = alloc_conversion (ck_aggr); + c->type = type; + c->rank = cr_exact; + c->user_conv_p = true; + c->u.next = NULL; + return c; +} + +/* Represent a conversion from CTOR, a braced-init-list, to TYPE, an + array type, if such a conversion is possible. */ + +static conversion * +build_array_conv (tree type, tree ctor, int flags) +{ + conversion *c; + unsigned HOST_WIDE_INT len = CONSTRUCTOR_NELTS (ctor); + tree elttype = TREE_TYPE (type); + unsigned i; + tree val; + bool bad = false; + bool user = false; + enum conversion_rank rank = cr_exact; + + if (TYPE_DOMAIN (type)) + { + unsigned HOST_WIDE_INT alen = tree_low_cst (array_type_nelts_top (type), 1); + if (alen < len) + return NULL; + } + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val) + { + conversion *sub + = implicit_conversion (elttype, TREE_TYPE (val), val, + false, flags); + if (sub == NULL) + return NULL; + + if (sub->rank > rank) + rank = sub->rank; + if (sub->user_conv_p) + user = true; + if (sub->bad_p) + bad = true; + } + + c = alloc_conversion (ck_aggr); + c->type = type; + c->rank = rank; + c->user_conv_p = user; + c->bad_p = bad; + c->u.next = NULL; + return c; +} + +/* Build a representation of the identity conversion from EXPR to + itself. The TYPE should match the type of EXPR, if EXPR is non-NULL. */ + +static conversion * +build_identity_conv (tree type, tree expr) +{ + conversion *c; + + c = alloc_conversion (ck_identity); + c->type = type; + c->u.expr = expr; + + return c; +} + +/* Converting from EXPR to TYPE was ambiguous in the sense that there + were multiple user-defined conversions to accomplish the job. + Build a conversion that indicates that ambiguity. */ + +static conversion * +build_ambiguous_conv (tree type, tree expr) +{ + conversion *c; + + c = alloc_conversion (ck_ambig); + c->type = type; + c->u.expr = expr; + + return c; +} + +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 + TO, if any. For proper handling of null pointer constants, you must + also pass the expression EXPR to convert from. If C_CAST_P is true, + this conversion is coming from a C-style cast. */ + +static conversion * +standard_conversion (tree to, tree from, tree expr, bool c_cast_p, + int flags) +{ + enum tree_code fcode, tcode; + conversion *conv; + bool fromref = false; + tree qualified_to; + + to = non_reference (to); + if (TREE_CODE (from) == REFERENCE_TYPE) + { + fromref = true; + from = TREE_TYPE (from); + } + qualified_to = to; + to = strip_top_quals (to); + from = strip_top_quals (from); + + if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) + && expr && type_unknown_p (expr)) + { + tsubst_flags_t tflags = tf_conv; + if (!(flags & LOOKUP_PROTECT)) + tflags |= tf_no_access_control; + expr = instantiate_type (to, expr, tflags); + if (expr == error_mark_node) + return NULL; + from = TREE_TYPE (expr); + } + + fcode = TREE_CODE (from); + tcode = TREE_CODE (to); + + conv = build_identity_conv (from, expr); + if (fcode == FUNCTION_TYPE || fcode == ARRAY_TYPE) + { + from = type_decays_to (from); + fcode = TREE_CODE (from); + conv = build_conv (ck_lvalue, from, conv); + } + else if (fromref || (expr && lvalue_p (expr))) + { + if (expr) + { + tree bitfield_type; + bitfield_type = is_bitfield_expr_with_lowered_type (expr); + if (bitfield_type) + { + from = strip_top_quals (bitfield_type); + fcode = TREE_CODE (from); + } + } + conv = build_conv (ck_rvalue, from, conv); + if (flags & LOOKUP_PREFER_RVALUE) + conv->rvaluedness_matches_p = true; + } + + /* Allow conversion between `__complex__' data types. */ + if (tcode == COMPLEX_TYPE && fcode == COMPLEX_TYPE) + { + /* The standard conversion sequence to convert FROM to TO is + the standard conversion sequence to perform componentwise + conversion. */ + conversion *part_conv = standard_conversion + (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE, c_cast_p, flags); + + if (part_conv) + { + conv = build_conv (part_conv->kind, to, conv); + conv->rank = part_conv->rank; + } + else + conv = NULL; + + return conv; + } + + if (same_type_p (from, to)) + { + if (CLASS_TYPE_P (to) && conv->kind == ck_rvalue) + conv->type = qualified_to; + return conv; + } + + /* [conv.ptr] + A null pointer constant can be converted to a pointer type; ... A + null pointer constant of integral type can be converted to an + rvalue of type std::nullptr_t. */ + if ((tcode == POINTER_TYPE || TYPE_PTR_TO_MEMBER_P (to) + || NULLPTR_TYPE_P (to)) + && expr && null_ptr_cst_p (expr)) + conv = build_conv (ck_std, to, conv); + else if ((tcode == INTEGER_TYPE && fcode == POINTER_TYPE) + || (tcode == POINTER_TYPE && fcode == INTEGER_TYPE)) + { + /* For backwards brain damage compatibility, allow interconversion of + pointers and integers with a pedwarn. */ + conv = build_conv (ck_std, to, conv); + conv->bad_p = true; + } + else if (UNSCOPED_ENUM_P (to) && fcode == INTEGER_TYPE) + { + /* For backwards brain damage compatibility, allow interconversion of + enums and integers with a pedwarn. */ + conv = build_conv (ck_std, to, conv); + conv->bad_p = true; + } + 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) + { + tree nfrom = TREE_TYPE (from); + from = build_pointer_type + (cp_build_qualified_type (void_type_node, + cp_type_quals (nfrom))); + conv = build_conv (ck_ptr, 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 (ck_pmem, from, conv); + } + else if (!same_type_p (fbase, tbase)) + return NULL; + } + else if (CLASS_TYPE_P (TREE_TYPE (from)) + && CLASS_TYPE_P (TREE_TYPE (to)) + /* [conv.ptr] + + An rvalue of type "pointer to cv D," where D is a + class type, can be converted to an rvalue of type + "pointer to cv B," where B is a base class (clause + _class.derived_) of D. If B is an inaccessible + (clause _class.access_) or ambiguous + (_class.member.lookup_) base class of D, a program + that necessitates this conversion is ill-formed. + Therefore, we use DERIVED_FROM_P, and do not check + access or uniqueness. */ + && DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from))) + { + from = + cp_build_qualified_type (TREE_TYPE (to), + cp_type_quals (TREE_TYPE (from))); + from = build_pointer_type (from); + conv = build_conv (ck_ptr, from, conv); + conv->base_p = true; + } + + 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 (c_cast_p && comp_ptr_ttypes_const (to, from)) + /* In a C-style cast, we ignore CV-qualification because we + are allowed to perform a static_cast followed by a + const_cast. */ + conv = build_conv (ck_qual, to, conv); + else if (!c_cast_p && comp_ptr_ttypes (to_pointee, from_pointee)) + conv = build_conv (ck_qual, to, conv); + else if (expr && string_conv_p (to, expr, 0)) + /* converting from string constant to char *. */ + conv = build_conv (ck_qual, to, conv); + /* Allow conversions among compatible ObjC pointer types (base + conversions have been already handled above). */ + else if (c_dialect_objc () + && objc_compare_types (to, from, -4, NULL_TREE)) + conv = build_conv (ck_ptr, to, conv); + else if (ptr_reasonably_similar (to_pointee, from_pointee)) + { + conv = build_conv (ck_ptr, to, conv); + conv->bad_p = true; + } + else + return NULL; + + from = to; + } + else if (TYPE_PTRMEMFUNC_P (to) && TYPE_PTRMEMFUNC_P (from)) + { + tree fromfn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (from)); + tree tofn = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (to)); + tree fbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fromfn))); + tree tbase = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (tofn))); + + if (!DERIVED_FROM_P (fbase, tbase) + || !same_type_p (TREE_TYPE (fromfn), TREE_TYPE (tofn)) + || !compparms (TREE_CHAIN (TYPE_ARG_TYPES (fromfn)), + TREE_CHAIN (TYPE_ARG_TYPES (tofn))) + || cp_type_quals (fbase) != cp_type_quals (tbase)) + return NULL; + + from = build_memfn_type (fromfn, tbase, cp_type_quals (tbase)); + from = build_ptrmemfunc_type (build_pointer_type (from)); + conv = build_conv (ck_pmem, from, conv); + conv->base_p = true; + } + else if (tcode == BOOLEAN_TYPE) + { + /* [conv.bool] + + An rvalue of arithmetic, unscoped enumeration, pointer, or + pointer to member type can be converted to an rvalue of type + bool. ... An rvalue of type std::nullptr_t can be converted + to an rvalue of type bool; */ + if (ARITHMETIC_TYPE_P (from) + || UNSCOPED_ENUM_P (from) + || fcode == POINTER_TYPE + || TYPE_PTR_TO_MEMBER_P (from) + || NULLPTR_TYPE_P (from)) + { + conv = build_conv (ck_std, to, conv); + if (fcode == POINTER_TYPE + || TYPE_PTRMEM_P (from) + || (TYPE_PTRMEMFUNC_P (from) + && conv->rank < cr_pbool) + || NULLPTR_TYPE_P (from)) + conv->rank = cr_pbool; + return conv; + } + + return NULL; + } + /* We don't check for ENUMERAL_TYPE here because there are no standard + conversions to enum type. */ + /* As an extension, allow conversion to complex type. */ + else if (ARITHMETIC_TYPE_P (to)) + { + if (! (INTEGRAL_CODE_P (fcode) || fcode == REAL_TYPE) + || SCOPED_ENUM_P (from)) + return NULL; + conv = build_conv (ck_std, to, conv); + + /* Give this a better rank if it's a promotion. */ + if (same_type_p (to, type_promotes_to (from)) + && conv->u.next->rank <= cr_promotion) + conv->rank = cr_promotion; + } + else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE + && vector_types_convertible_p (from, to, false)) + return build_conv (ck_std, to, conv); + else if (MAYBE_CLASS_TYPE_P (to) && MAYBE_CLASS_TYPE_P (from) + && is_properly_derived_from (from, to)) + { + if (conv->kind == ck_rvalue) + conv = conv->u.next; + conv = build_conv (ck_base, to, conv); + /* The derived-to-base conversion indicates the initialization + of a parameter with base type from an object of a derived + type. A temporary object is created to hold the result of + the conversion unless we're binding directly to a reference. */ + conv->need_temporary_p = !(flags & LOOKUP_NO_TEMP_BIND); + } + else + return NULL; + + if (flags & LOOKUP_NO_NARROWING) + conv->check_narrowing = true; + + return conv; +} + +/* Returns nonzero if T1 is reference-related to T2. */ + +bool +reference_related_p (tree t1, tree t2) +{ + if (t1 == error_mark_node || t2 == error_mark_node) + return false; + + t1 = TYPE_MAIN_VARIANT (t1); + t2 = TYPE_MAIN_VARIANT (t2); + + /* [dcl.init.ref] + + Given types "cv1 T1" and "cv2 T2," "cv1 T1" is reference-related + to "cv2 T2" if T1 is the same type as T2, or T1 is a base class + of T2. */ + return (same_type_p (t1, t2) + || (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2) + && DERIVED_FROM_P (t1, t2))); +} + +/* Returns nonzero if T1 is reference-compatible with T2. */ + +static bool +reference_compatible_p (tree t1, tree t2) +{ + /* [dcl.init.ref] + + "cv1 T1" is reference compatible with "cv2 T2" if T1 is + reference-related to T2 and cv1 is the same cv-qualification as, + or greater cv-qualification than, cv2. */ + return (reference_related_p (t1, t2) + && at_least_as_qualified_p (t1, t2)); +} + +/* Determine whether or not the EXPR (of class type S) can be + converted to T as in [over.match.ref]. */ + +static conversion * +convert_class_to_reference (tree reference_type, tree s, tree expr, int flags) +{ + tree conversions; + tree first_arg; + conversion *conv; + tree t; + struct z_candidate *candidates; + struct z_candidate *cand; + bool any_viable_p; + + if (!expr) + return NULL; + + conversions = lookup_conversions (s); + if (!conversions) + return NULL; + + /* [over.match.ref] + + Assuming that "cv1 T" is the underlying type of the reference + being initialized, and "cv S" is the type of the initializer + expression, with S a class type, the candidate functions are + selected as follows: + + --The conversion functions of S and its base classes are + considered. Those that are not hidden within S and yield type + "reference to cv2 T2", where "cv1 T" is reference-compatible + (_dcl.init.ref_) with "cv2 T2", are candidate functions. + + The argument list has one argument, which is the initializer + expression. */ + + candidates = 0; + + /* Conceptually, we should take the address of EXPR and put it in + the argument list. Unfortunately, however, that can result in + error messages, which we should not issue now because we are just + trying to find a conversion operator. Therefore, we use NULL, + cast to the appropriate type. */ + first_arg = build_int_cst (build_pointer_type (s), 0); + + t = TREE_TYPE (reference_type); + + /* We're performing a user-defined conversion to a desired type, so set + this for the benefit of add_candidates. */ + flags |= LOOKUP_NO_CONVERSION; + + for (; conversions; conversions = TREE_CHAIN (conversions)) + { + tree fns = TREE_VALUE (conversions); + tree binfo = TREE_PURPOSE (conversions); + struct z_candidate *old_candidates = candidates;; + + add_candidates (fns, first_arg, NULL, reference_type, + NULL_TREE, false, + binfo, TYPE_BINFO (s), + flags, &candidates); + + for (cand = candidates; cand != old_candidates; cand = cand->next) + { + /* Now, see if the conversion function really returns + an lvalue of the appropriate type. From the + point of view of unification, simply returning an + rvalue of the right type is good enough. */ + tree f = cand->fn; + tree t2 = TREE_TYPE (TREE_TYPE (f)); + if (cand->viable == 0) + /* Don't bother looking more closely. */; + else if (TREE_CODE (t2) != REFERENCE_TYPE + || !reference_compatible_p (t, TREE_TYPE (t2))) + { + /* No need to set cand->reason here; this is most likely + an ambiguous match. If it's not, either this candidate + will win, or we will have identified a reason for it + losing already. */ + cand->viable = 0; + } + else + { + conversion *identity_conv; + /* Build a standard conversion sequence indicating the + binding from the reference type returned by the + function to the desired REFERENCE_TYPE. */ + identity_conv + = build_identity_conv (TREE_TYPE (TREE_TYPE + (TREE_TYPE (cand->fn))), + NULL_TREE); + cand->second_conv + = (direct_reference_binding + (reference_type, identity_conv)); + cand->second_conv->rvaluedness_matches_p + = TYPE_REF_IS_RVALUE (TREE_TYPE (TREE_TYPE (cand->fn))) + == TYPE_REF_IS_RVALUE (reference_type); + cand->second_conv->bad_p |= cand->convs[0]->bad_p; + + /* Don't allow binding of lvalues to rvalue references. */ + if (TYPE_REF_IS_RVALUE (reference_type) + && !TYPE_REF_IS_RVALUE (TREE_TYPE (TREE_TYPE (cand->fn)))) + cand->second_conv->bad_p = true; + } + } + } + + 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; + + cand = tourney (candidates); + if (!cand) + return NULL; + + /* Now that we know that this is the function we're going to use fix + the dummy first argument. */ + gcc_assert (cand->first_arg == NULL_TREE + || integer_zerop (cand->first_arg)); + cand->first_arg = build_this (expr); + + /* Build a user-defined conversion sequence representing the + conversion. */ + conv = build_conv (ck_user, + TREE_TYPE (TREE_TYPE (cand->fn)), + build_identity_conv (TREE_TYPE (expr), expr)); + conv->cand = cand; + + if (cand->viable == -1) + conv->bad_p = true; + + /* Merge it with the standard conversion sequence from the + conversion function's return type to the desired type. */ + cand->second_conv = merge_conversion_sequences (conv, cand->second_conv); + + return cand->second_conv; +} + +/* A reference of the indicated TYPE is being bound directly to the + expression represented by the implicit conversion sequence CONV. + Return a conversion sequence for this binding. */ + +static conversion * +direct_reference_binding (tree type, conversion *conv) +{ + tree t; + + gcc_assert (TREE_CODE (type) == REFERENCE_TYPE); + gcc_assert (TREE_CODE (conv->type) != REFERENCE_TYPE); + + t = TREE_TYPE (type); + + /* [over.ics.rank] + + When a parameter of reference type binds directly + (_dcl.init.ref_) to an argument expression, the implicit + conversion sequence is the identity conversion, unless the + argument expression has a type that is a derived class of the + parameter type, in which case the implicit conversion sequence is + a derived-to-base Conversion. + + If the parameter binds directly to the result of applying a + conversion function to the argument expression, the implicit + conversion sequence is a user-defined conversion sequence + (_over.ics.user_), with the second standard conversion sequence + either an identity conversion or, if the conversion function + returns an entity of a type that is a derived class of the + parameter type, a derived-to-base conversion. */ + if (!same_type_ignoring_top_level_qualifiers_p (t, conv->type)) + { + /* Represent the derived-to-base conversion. */ + conv = build_conv (ck_base, t, conv); + /* We will actually be binding to the base-class subobject in + the derived class, so we mark this conversion appropriately. + That way, convert_like knows not to generate a temporary. */ + conv->need_temporary_p = false; + } + return build_conv (ck_ref_bind, type, conv); +} + +/* Returns the conversion path from type FROM to reference type TO for + purposes of reference binding. For lvalue binding, either pass a + reference type to FROM or an lvalue expression to EXPR. If the + reference will be bound to a temporary, NEED_TEMPORARY_P is set for + the conversion returned. If C_CAST_P is true, this + conversion is coming from a C-style cast. */ + +static conversion * +reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags) +{ + conversion *conv = NULL; + tree to = TREE_TYPE (rto); + tree from = rfrom; + tree tfrom; + bool related_p; + bool compatible_p; + cp_lvalue_kind is_lvalue = clk_none; + + if (TREE_CODE (to) == FUNCTION_TYPE && expr && type_unknown_p (expr)) + { + expr = instantiate_type (to, expr, tf_none); + if (expr == error_mark_node) + return NULL; + from = TREE_TYPE (expr); + } + + if (TREE_CODE (from) == REFERENCE_TYPE) + { + /* Anything with reference type is an lvalue. */ + is_lvalue = clk_ordinary; + from = TREE_TYPE (from); + } + + if (expr && BRACE_ENCLOSED_INITIALIZER_P (expr)) + { + maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); + conv = implicit_conversion (to, from, expr, c_cast_p, + flags); + if (!CLASS_TYPE_P (to) + && CONSTRUCTOR_NELTS (expr) == 1) + { + expr = CONSTRUCTOR_ELT (expr, 0)->value; + if (error_operand_p (expr)) + return NULL; + from = TREE_TYPE (expr); + } + } + + if (is_lvalue == clk_none && expr) + is_lvalue = real_lvalue_p (expr); + + tfrom = from; + if ((is_lvalue & clk_bitfield) != 0) + tfrom = unlowered_expr_type (expr); + + /* Figure out whether or not the types are reference-related and + reference compatible. We have do do this after stripping + references from FROM. */ + related_p = reference_related_p (to, tfrom); + /* If this is a C cast, first convert to an appropriately qualified + type, so that we can later do a const_cast to the desired type. */ + if (related_p && c_cast_p + && !at_least_as_qualified_p (to, tfrom)) + to = cp_build_qualified_type (to, cp_type_quals (tfrom)); + compatible_p = reference_compatible_p (to, tfrom); + + /* Directly bind reference when target expression's type is compatible with + the reference and expression is an lvalue. In DR391, the wording in + [8.5.3/5 dcl.init.ref] is changed to also require direct bindings for + const and rvalue references to rvalues of compatible class type. + We should also do direct bindings for non-class "rvalues" derived from + rvalue references. */ + if (compatible_p + && (is_lvalue + || (((CP_TYPE_CONST_NON_VOLATILE_P (to) + && !(flags & LOOKUP_NO_TEMP_BIND)) + || TYPE_REF_IS_RVALUE (rto)) + && (CLASS_TYPE_P (from) + || TREE_CODE (from) == ARRAY_TYPE + || (expr && lvalue_p (expr)))))) + { + /* [dcl.init.ref] + + If the initializer expression + + -- 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. + + [...] + If the initializer expression is an rvalue, with T2 a class type, + and "cv1 T1" is reference-compatible with "cv2 T2", the reference + is bound to the object represented by the rvalue or to a sub-object + within that object. */ + + conv = build_identity_conv (tfrom, expr); + conv = direct_reference_binding (rto, conv); + + if (flags & LOOKUP_PREFER_RVALUE) + /* The top-level caller requested that we pretend that the lvalue + be treated as an rvalue. */ + conv->rvaluedness_matches_p = TYPE_REF_IS_RVALUE (rto); + else + conv->rvaluedness_matches_p + = (TYPE_REF_IS_RVALUE (rto) == !is_lvalue); + + if ((is_lvalue & clk_bitfield) != 0 + || ((is_lvalue & 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.) + + However, when we actually call the function we must create + a temporary to which to bind the reference. If the + reference is volatile, or isn't const, then we cannot make + a temporary, so we just issue an error when the conversion + actually occurs. */ + conv->need_temporary_p = true; + + /* Don't allow binding of lvalues to rvalue references. */ + if (is_lvalue && TYPE_REF_IS_RVALUE (rto) + && !(flags & LOOKUP_PREFER_RVALUE)) + conv->bad_p = true; + + return conv; + } + /* [class.conv.fct] A conversion function is never used to convert a + (possibly cv-qualified) object to the (possibly cv-qualified) same + object type (or a reference to it), to a (possibly cv-qualified) base + class of that type (or a reference to it).... */ + else if (CLASS_TYPE_P (from) && !related_p + && !(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 + "cv1 T1" is reference-compatible with "cv3 T3". (this + conversion is selected by enumerating the applicable + conversion functions (_over.match.ref_) and choosing the + best one through overload resolution. (_over.match_). + + the reference is bound to the lvalue result of the conversion + in the second case. */ + conv = convert_class_to_reference (rto, from, expr, flags); + if (conv) + return conv; + } + + /* From this point on, we conceptually need temporaries, even if we + elide them. Only the cases above are "direct bindings". */ + if (flags & LOOKUP_NO_TEMP_BIND) + return NULL; + + /* [over.ics.rank] + + When a parameter of reference type is not bound directly to an + argument expression, the conversion sequence is the one required + to convert the argument expression to the underlying type of the + reference according to _over.best.ics_. Conceptually, this + conversion sequence corresponds to copy-initializing a temporary + of the underlying type with the argument expression. Any + difference in top-level cv-qualification is subsumed by the + initialization itself and does not constitute a conversion. */ + + /* [dcl.init.ref] + + Otherwise, the reference shall be to a non-volatile const type. + + Under C++0x, [8.5.3/5 dcl.init.ref] it may also be an rvalue reference */ + if (!CP_TYPE_CONST_NON_VOLATILE_P (to) && !TYPE_REF_IS_RVALUE (rto)) + return NULL; + + /* [dcl.init.ref] + + Otherwise, a temporary of type "cv1 T1" is created and + initialized from the initializer expression using the rules for a + non-reference copy initialization. If T1 is reference-related to + T2, cv1 must be the same cv-qualification as, or greater + cv-qualification than, cv2; otherwise, the program is ill-formed. */ + if (related_p && !at_least_as_qualified_p (to, from)) + return NULL; + + /* We're generating a temporary now, but don't bind any more in the + conversion (specifically, don't slice the temporary returned by a + conversion operator). */ + flags |= LOOKUP_NO_TEMP_BIND; + + /* Core issue 899: When [copy-]initializing a temporary to be bound + to the first parameter of a copy constructor (12.8) called with + a single argument in the context of direct-initialization, + explicit conversion functions are also considered. + + So don't set LOOKUP_ONLYCONVERTING in that case. */ + if (!(flags & LOOKUP_COPY_PARM)) + flags |= LOOKUP_ONLYCONVERTING; + + if (!conv) + conv = implicit_conversion (to, from, expr, c_cast_p, + flags); + if (!conv) + return NULL; + + conv = build_conv (ck_ref_bind, rto, conv); + /* This reference binding, unlike those above, requires the + creation of a temporary. */ + conv->need_temporary_p = true; + conv->rvaluedness_matches_p = TYPE_REF_IS_RVALUE (rto); + + return conv; +} + +/* Returns the implicit conversion sequence (see [over.ics]) from type + FROM to type TO. The optional expression EXPR may affect the + conversion. FLAGS are the usual overloading flags. If C_CAST_P is + true, this conversion is coming from a C-style cast. */ + +static conversion * +implicit_conversion (tree to, tree from, tree expr, bool c_cast_p, + int flags) +{ + conversion *conv; + + if (from == error_mark_node || to == error_mark_node + || expr == error_mark_node) + return NULL; + + if (TREE_CODE (to) == REFERENCE_TYPE) + conv = reference_binding (to, from, expr, c_cast_p, flags); + else + conv = standard_conversion (to, from, expr, c_cast_p, flags); + + if (conv) + return conv; + + if (expr && BRACE_ENCLOSED_INITIALIZER_P (expr)) + { + if (is_std_init_list (to)) + return build_list_conv (to, expr, flags); + + /* Allow conversion from an initializer-list with one element to a + scalar type. */ + if (SCALAR_TYPE_P (to)) + { + int nelts = CONSTRUCTOR_NELTS (expr); + tree elt; + + if (nelts == 0) + elt = build_value_init (to, tf_none); + else if (nelts == 1) + elt = CONSTRUCTOR_ELT (expr, 0)->value; + else + elt = error_mark_node; + + conv = implicit_conversion (to, TREE_TYPE (elt), elt, + c_cast_p, flags); + if (conv) + { + conv->check_narrowing = true; + if (BRACE_ENCLOSED_INITIALIZER_P (elt)) + /* Too many levels of braces, i.e. '{{1}}'. */ + conv->bad_p = true; + return conv; + } + } + else if (TREE_CODE (to) == ARRAY_TYPE) + return build_array_conv (to, expr, flags); + } + + if (expr != NULL_TREE + && (MAYBE_CLASS_TYPE_P (from) + || MAYBE_CLASS_TYPE_P (to)) + && (flags & LOOKUP_NO_CONVERSION) == 0) + { + struct z_candidate *cand; + int convflags = (flags & (LOOKUP_NO_TEMP_BIND|LOOKUP_ONLYCONVERTING + |LOOKUP_NO_NARROWING)); + + if (CLASS_TYPE_P (to) + && !CLASSTYPE_NON_AGGREGATE (complete_type (to)) + && BRACE_ENCLOSED_INITIALIZER_P (expr)) + return build_aggr_conv (to, expr, flags); + + cand = build_user_type_conversion_1 (to, expr, convflags); + if (cand) + conv = cand->second_conv; + + /* We used to try to bind a reference to a temporary here, but that + is now handled after the recursive call to this function at the end + of reference_binding. */ + return conv; + } + + return NULL; +} + +/* Add a new entry to the list of candidates. Used by the add_*_candidate + functions. ARGS will not be changed until a single candidate is + selected. */ + +static struct z_candidate * +add_candidate (struct z_candidate **candidates, + tree fn, tree first_arg, const VEC(tree,gc) *args, + size_t num_convs, conversion **convs, + tree access_path, tree conversion_path, + int viable, struct rejection_reason *reason) +{ + struct z_candidate *cand = (struct z_candidate *) + conversion_obstack_alloc (sizeof (struct z_candidate)); + + cand->fn = fn; + cand->first_arg = first_arg; + cand->args = args; + cand->convs = convs; + cand->num_convs = num_convs; + cand->access_path = access_path; + cand->conversion_path = conversion_path; + cand->viable = viable; + cand->reason = reason; + cand->next = *candidates; + *candidates = cand; + + return cand; +} + +/* Return the number of remaining arguments in the parameter list + beginning with ARG. */ + +static int +remaining_arguments (tree arg) +{ + int n; + + for (n = 0; arg != NULL_TREE && arg != void_list_node; + arg = TREE_CHAIN (arg)) + n++; + + return n; +} + +/* Create an overload candidate for the function or method FN called + with the argument list FIRST_ARG/ARGS and add it to CANDIDATES. + FLAGS is passed on to implicit_conversion. + + This does not change ARGS. + + CTYPE, if non-NULL, is the type we want to pretend this function + comes from for purposes of overload resolution. */ + +static struct z_candidate * +add_function_candidate (struct z_candidate **candidates, + tree fn, tree ctype, tree first_arg, + const VEC(tree,gc) *args, tree access_path, + tree conversion_path, int flags) +{ + tree parmlist = TYPE_ARG_TYPES (TREE_TYPE (fn)); + int i, len; + conversion **convs; + tree parmnode; + tree orig_first_arg = first_arg; + int skip; + int viable = 1; + struct rejection_reason *reason = NULL; + + /* At this point we should not see any functions which haven't been + explicitly declared, except for friend functions which will have + been found using argument dependent lookup. */ + gcc_assert (!DECL_ANTICIPATED (fn) || DECL_HIDDEN_FRIEND_P (fn)); + + /* The `this', `in_chrg' and VTT arguments to constructors are not + considered in overload resolution. */ + if (DECL_CONSTRUCTOR_P (fn)) + { + parmlist = skip_artificial_parms_for (fn, parmlist); + skip = num_artificial_parms_for (fn); + if (skip > 0 && first_arg != NULL_TREE) + { + --skip; + first_arg = NULL_TREE; + } + } + else + skip = 0; + + len = VEC_length (tree, args) - skip + (first_arg != NULL_TREE ? 1 : 0); + convs = alloc_conversions (len); + + /* 13.3.2 - Viable functions [over.match.viable] + First, to be a viable function, a candidate function shall have enough + parameters to agree in number with the arguments in the list. + + We need to check this first; otherwise, checking the ICSes might cause + us to produce an ill-formed template instantiation. */ + + parmnode = parmlist; + for (i = 0; i < len; ++i) + { + if (parmnode == NULL_TREE || parmnode == void_list_node) + break; + parmnode = TREE_CHAIN (parmnode); + } + + if ((i < len && parmnode) + || !sufficient_parms_p (parmnode)) + { + int remaining = remaining_arguments (parmnode); + viable = 0; + reason = arity_rejection (first_arg, i + remaining, len); + } + /* When looking for a function from a subobject from an implicit + copy/move constructor/operator=, don't consider anything that takes (a + reference to) an unrelated type. See c++/44909 and core 1092. */ + else if (parmlist && (flags & LOOKUP_DEFAULTED)) + { + if (DECL_CONSTRUCTOR_P (fn)) + i = 1; + else if (DECL_ASSIGNMENT_OPERATOR_P (fn) + && DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR) + i = 2; + else + i = 0; + if (i && len == i) + { + parmnode = chain_index (i-1, parmlist); + if (!reference_related_p (non_reference (TREE_VALUE (parmnode)), + ctype)) + viable = 0; + } + + /* This only applies at the top level. */ + flags &= ~LOOKUP_DEFAULTED; + } + + if (! viable) + goto out; + + /* Second, for F to be a viable function, there shall exist for each + argument an implicit conversion sequence that converts that argument + to the corresponding parameter of F. */ + + parmnode = parmlist; + + for (i = 0; i < len; ++i) + { + tree arg, argtype, to_type; + conversion *t; + int is_this; + + if (parmnode == void_list_node) + break; + + if (i == 0 && first_arg != NULL_TREE) + arg = first_arg; + else + arg = VEC_index (tree, args, + i + skip - (first_arg != NULL_TREE ? 1 : 0)); + argtype = lvalue_type (arg); + + is_this = (i == 0 && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) + && ! DECL_CONSTRUCTOR_P (fn)); + + if (parmnode) + { + tree parmtype = TREE_VALUE (parmnode); + int lflags = flags; + + parmnode = TREE_CHAIN (parmnode); + + /* The type of the implicit object parameter ('this') for + overload resolution is not always the same as for the + function itself; conversion functions are considered to + be members of the class being converted, and functions + introduced by a using-declaration are considered to be + members of the class that uses them. + + Since build_over_call ignores the ICS for the `this' + parameter, we can just change the parm type. */ + if (ctype && is_this) + { + parmtype = cp_build_qualified_type + (ctype, cp_type_quals (TREE_TYPE (parmtype))); + parmtype = build_pointer_type (parmtype); + } + + /* Core issue 899: When [copy-]initializing a temporary to be bound + to the first parameter of a copy constructor (12.8) called with + a single argument in the context of direct-initialization, + explicit conversion functions are also considered. + + So set LOOKUP_COPY_PARM to let reference_binding know that + it's being called in that context. We generalize the above + to handle move constructors and template constructors as well; + the standardese should soon be updated similarly. */ + if (ctype && i == 0 && (len-skip == 1) + && !(flags & LOOKUP_ONLYCONVERTING) + && DECL_CONSTRUCTOR_P (fn) + && parmtype != error_mark_node + && (same_type_ignoring_top_level_qualifiers_p + (non_reference (parmtype), ctype))) + { + lflags |= LOOKUP_COPY_PARM; + /* We allow user-defined conversions within init-lists, but + not for the copy constructor. */ + if (flags & LOOKUP_NO_COPY_CTOR_CONVERSION) + lflags |= LOOKUP_NO_CONVERSION; + } + else + lflags |= LOOKUP_ONLYCONVERTING; + + t = implicit_conversion (parmtype, argtype, arg, + /*c_cast_p=*/false, lflags); + to_type = parmtype; + } + else + { + t = build_identity_conv (argtype, arg); + t->ellipsis_p = true; + to_type = argtype; + } + + if (t && is_this) + t->this_p = true; + + convs[i] = t; + if (! t) + { + viable = 0; + reason = arg_conversion_rejection (first_arg, i, argtype, to_type); + break; + } + + if (t->bad_p) + { + viable = -1; + reason = bad_arg_conversion_rejection (first_arg, i, argtype, to_type); + } + } + + out: + return add_candidate (candidates, fn, orig_first_arg, args, len, convs, + access_path, conversion_path, viable, reason); +} + +/* Create an overload candidate for the conversion function FN which will + be invoked for expression OBJ, producing a pointer-to-function which + will in turn be called with the argument list FIRST_ARG/ARGLIST, + and add it to CANDIDATES. This does not change ARGLIST. FLAGS is + passed on to implicit_conversion. + + Actually, we don't really care about FN; we care about the type it + converts to. There may be multiple conversion functions that will + convert to that type, and we rely on build_user_type_conversion_1 to + choose the best one; so when we create our candidate, we record the type + instead of the function. */ + +static struct z_candidate * +add_conv_candidate (struct z_candidate **candidates, tree fn, tree obj, + tree first_arg, const VEC(tree,gc) *arglist, + tree access_path, tree conversion_path) +{ + tree totype = TREE_TYPE (TREE_TYPE (fn)); + int i, len, viable, flags; + tree parmlist, parmnode; + conversion **convs; + struct rejection_reason *reason; + + for (parmlist = totype; TREE_CODE (parmlist) != FUNCTION_TYPE; ) + parmlist = TREE_TYPE (parmlist); + parmlist = TYPE_ARG_TYPES (parmlist); + + len = VEC_length (tree, arglist) + (first_arg != NULL_TREE ? 1 : 0) + 1; + convs = alloc_conversions (len); + parmnode = parmlist; + viable = 1; + flags = LOOKUP_IMPLICIT; + reason = NULL; + + /* Don't bother looking up the same type twice. */ + if (*candidates && (*candidates)->fn == totype) + return NULL; + + for (i = 0; i < len; ++i) + { + tree arg, argtype, convert_type = NULL_TREE; + conversion *t; + + if (i == 0) + arg = obj; + else if (i == 1 && first_arg != NULL_TREE) + arg = first_arg; + else + arg = VEC_index (tree, arglist, + i - (first_arg != NULL_TREE ? 1 : 0) - 1); + argtype = lvalue_type (arg); + + if (i == 0) + { + t = implicit_conversion (totype, argtype, arg, /*c_cast_p=*/false, + flags); + convert_type = totype; + } + else if (parmnode == void_list_node) + break; + else if (parmnode) + { + t = implicit_conversion (TREE_VALUE (parmnode), argtype, arg, + /*c_cast_p=*/false, flags); + convert_type = TREE_VALUE (parmnode); + } + else + { + t = build_identity_conv (argtype, arg); + t->ellipsis_p = true; + convert_type = argtype; + } + + convs[i] = t; + if (! t) + break; + + if (t->bad_p) + { + viable = -1; + reason = bad_arg_conversion_rejection (NULL_TREE, i, argtype, convert_type); + } + + if (i == 0) + continue; + + if (parmnode) + parmnode = TREE_CHAIN (parmnode); + } + + if (i < len + || ! sufficient_parms_p (parmnode)) + { + int remaining = remaining_arguments (parmnode); + viable = 0; + reason = arity_rejection (NULL_TREE, i + remaining, len); + } + + return add_candidate (candidates, totype, first_arg, arglist, len, convs, + access_path, conversion_path, viable, reason); +} + +static void +build_builtin_candidate (struct z_candidate **candidates, tree fnname, + tree type1, tree type2, tree *args, tree *argtypes, + int flags) +{ + conversion *t; + conversion **convs; + size_t num_convs; + int viable = 1, i; + tree types[2]; + struct rejection_reason *reason = NULL; + + types[0] = type1; + types[1] = type2; + + num_convs = args[2] ? 3 : (args[1] ? 2 : 1); + convs = alloc_conversions (num_convs); + + /* TRUTH_*_EXPR do "contextual conversion to bool", which means explicit + conversion ops are allowed. We handle that here by just checking for + boolean_type_node because other operators don't ask for it. COND_EXPR + also does contextual conversion to bool for the first operand, but we + handle that in build_conditional_expr, and type1 here is operand 2. */ + if (type1 != boolean_type_node) + flags |= LOOKUP_ONLYCONVERTING; + + for (i = 0; i < 2; ++i) + { + if (! args[i]) + break; + + t = implicit_conversion (types[i], argtypes[i], args[i], + /*c_cast_p=*/false, flags); + if (! t) + { + viable = 0; + /* We need something for printing the candidate. */ + t = build_identity_conv (types[i], NULL_TREE); + reason = arg_conversion_rejection (NULL_TREE, i, argtypes[i], types[i]); + } + else if (t->bad_p) + { + viable = 0; + reason = bad_arg_conversion_rejection (NULL_TREE, i, argtypes[i], types[i]); + } + convs[i] = t; + } + + /* For COND_EXPR we rearranged the arguments; undo that now. */ + if (args[2]) + { + convs[2] = convs[1]; + convs[1] = convs[0]; + t = implicit_conversion (boolean_type_node, argtypes[2], args[2], + /*c_cast_p=*/false, flags); + if (t) + convs[0] = t; + else + { + viable = 0; + reason = arg_conversion_rejection (NULL_TREE, 0, argtypes[2], + boolean_type_node); + } + } + + add_candidate (candidates, fnname, /*first_arg=*/NULL_TREE, /*args=*/NULL, + num_convs, convs, + /*access_path=*/NULL_TREE, + /*conversion_path=*/NULL_TREE, + viable, reason); +} + +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] + + In this section, the term promoted integral type is used to refer + to those integral types which are preserved by integral promotion + (including e.g. int and long but excluding e.g. char). + Similarly, the term promoted arithmetic type refers to promoted + integral types plus floating types. */ + return ((CP_INTEGRAL_TYPE_P (type) + && same_type_p (type_promotes_to (type), type)) + || TREE_CODE (type) == REAL_TYPE); +} + +/* Create any builtin operator overload candidates for the operator in + question given the converted operand types TYPE1 and TYPE2. The other + args are passed through from add_builtin_candidates to + build_builtin_candidate. + + TYPE1 and TYPE2 may not be permissible, and we must filter them. + If CODE is requires candidates operands of the same type of the kind + of which TYPE1 and TYPE2 are, we add both candidates + 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) + { + case POSTINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + args[1] = integer_zero_node; + type2 = integer_type_node; + break; + default: + break; + } + + switch (code) + { + +/* 4 For every pair T, VQ), where T is an arithmetic or enumeration type, + and VQ is either volatile or empty, there exist candidate operator + functions of the form + VQ T& operator++(VQ T&); + T operator++(VQ T&, int); + 5 For every pair T, VQ), where T is an enumeration type or an arithmetic + type other than bool, and VQ is either volatile or empty, there exist + candidate operator functions of the form + VQ T& operator--(VQ T&); + T operator--(VQ T&, int); + 6 For every pair T, VQ), where T is a cv-qualified or cv-unqualified + complete object type, and VQ is either volatile or empty, there exist + candidate operator functions of the form + T*VQ& operator++(T*VQ&); + T*VQ& operator--(T*VQ&); + T* operator++(T*VQ&, int); + T* operator--(T*VQ&, int); */ + + case POSTDECREMENT_EXPR: + case PREDECREMENT_EXPR: + if (TREE_CODE (type1) == BOOLEAN_TYPE) + return; + case POSTINCREMENT_EXPR: + case PREINCREMENT_EXPR: + if (ARITHMETIC_TYPE_P (type1) || TYPE_PTROB_P (type1)) + { + type1 = build_reference_type (type1); + break; + } + return; + +/* 7 For every cv-qualified or cv-unqualified object type T, there + exist candidate operator functions of the form + + T& operator*(T*); + + 8 For every function type T, there exist candidate operator functions of + the form + T& operator*(T*); */ + + case INDIRECT_REF: + if (TREE_CODE (type1) == POINTER_TYPE + && !uses_template_parms (TREE_TYPE (type1)) + && (TYPE_PTROB_P (type1) + || TREE_CODE (TREE_TYPE (type1)) == FUNCTION_TYPE)) + break; + return; + +/* 9 For every type T, there exist candidate operator functions of the form + T* operator+(T*); + + 10For every promoted arithmetic type T, there exist candidate operator + functions of the form + T operator+(T); + T operator-(T); */ + + case UNARY_PLUS_EXPR: /* unary + */ + if (TREE_CODE (type1) == POINTER_TYPE) + break; + case NEGATE_EXPR: + if (ARITHMETIC_TYPE_P (type1)) + break; + return; + +/* 11For every promoted integral type T, there exist candidate operator + functions of the form + T operator~(T); */ + + case BIT_NOT_EXPR: + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type1)) + break; + return; + +/* 12For every quintuple C1, C2, T, CV1, CV2), where C2 is a class type, C1 + is the same type as C2 or is a derived class of C2, T is a complete + object type or a function type, and CV1 and CV2 are cv-qualifier-seqs, + there exist candidate operator functions of the form + CV12 T& operator->*(CV1 C1*, CV2 T C2::*); + where CV12 is the union of CV1 and CV2. */ + + 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 (MAYBE_CLASS_TYPE_P (c1) && DERIVED_FROM_P (c2, c1) + && (TYPE_PTRMEMFUNC_P (type2) + || is_complete (TYPE_PTRMEM_POINTED_TO_TYPE (type2)))) + break; + } + return; + +/* 13For every pair of promoted arithmetic types L and R, there exist can- + didate operator functions of the form + LR operator*(L, R); + LR operator/(L, R); + LR operator+(L, R); + LR operator-(L, R); + bool operator<(L, R); + bool operator>(L, R); + bool operator<=(L, R); + bool operator>=(L, R); + bool operator==(L, R); + bool operator!=(L, R); + where LR is the result of the usual arithmetic conversions between + types L and R. + + 14For every pair of types T and I, where T is a cv-qualified or cv- + unqualified complete object type and I is a promoted integral type, + there exist candidate operator functions of the form + T* operator+(T*, I); + T& operator[](T*, I); + T* operator-(T*, I); + T* operator+(I, T*); + T& operator[](I, T*); + + 15For every T, where T is a pointer to complete object type, there exist + candidate operator functions of the form112) + ptrdiff_t operator-(T, T); + + 16For every pointer or enumeration type T, there exist candidate operator + functions of the form + bool operator<(T, T); + bool operator>(T, T); + bool operator<=(T, T); + bool operator>=(T, T); + bool operator==(T, T); + bool operator!=(T, T); + + 17For every pointer to member type T, there exist candidate operator + functions of the form + bool operator==(T, T); + bool operator!=(T, T); */ + + case MINUS_EXPR: + if (TYPE_PTROB_P (type1) && TYPE_PTROB_P (type2)) + break; + if (TYPE_PTROB_P (type1) + && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type2)) + { + type2 = ptrdiff_type_node; + break; + } + case MULT_EXPR: + case TRUNC_DIV_EXPR: + if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) + break; + return; + + case EQ_EXPR: + case NE_EXPR: + 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: + case GE_EXPR: + case MAX_EXPR: + case MIN_EXPR: + if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) + break; + if (TYPE_PTR_P (type1) && TYPE_PTR_P (type2)) + break; + if (TREE_CODE (type1) == ENUMERAL_TYPE + && TREE_CODE (type2) == ENUMERAL_TYPE) + break; + if (TYPE_PTR_P (type1) + && null_ptr_cst_p (args[1]) + && !uses_template_parms (type1)) + { + type2 = type1; + break; + } + if (null_ptr_cst_p (args[0]) + && TYPE_PTR_P (type2) + && !uses_template_parms (type2)) + { + type1 = type2; + break; + } + return; + + case PLUS_EXPR: + if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) + break; + case ARRAY_REF: + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type1) && TYPE_PTROB_P (type2)) + { + type1 = ptrdiff_type_node; + break; + } + if (TYPE_PTROB_P (type1) && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type2)) + { + type2 = ptrdiff_type_node; + break; + } + return; + +/* 18For every pair of promoted integral types L and R, there exist candi- + date operator functions of the form + LR operator%(L, R); + LR operator&(L, R); + LR operator^(L, R); + LR operator|(L, R); + L operator<<(L, R); + L operator>>(L, R); + where LR is the result of the usual arithmetic conversions between + types L and R. */ + + case TRUNC_MOD_EXPR: + case BIT_AND_EXPR: + case BIT_IOR_EXPR: + case BIT_XOR_EXPR: + case LSHIFT_EXPR: + case RSHIFT_EXPR: + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type1) && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type2)) + break; + return; + +/* 19For every triple L, VQ, R), where L is an arithmetic or enumeration + type, VQ is either volatile or empty, and R is a promoted arithmetic + type, there exist candidate operator functions of the form + VQ L& operator=(VQ L&, R); + VQ L& operator*=(VQ L&, R); + VQ L& operator/=(VQ L&, R); + VQ L& operator+=(VQ L&, R); + VQ L& operator-=(VQ L&, R); + + 20For every pair T, VQ), where T is any type and VQ is either volatile + or empty, there exist candidate operator functions of the form + T*VQ& operator=(T*VQ&, T*); + + 21For every pair T, VQ), where T is a pointer to member type and VQ is + either volatile or empty, there exist candidate operator functions of + the form + VQ T& operator=(VQ T&, T); + + 22For every triple T, VQ, I), where T is a cv-qualified or cv- + unqualified complete object type, VQ is either volatile or empty, and + I is a promoted integral type, there exist candidate operator func- + tions of the form + T*VQ& operator+=(T*VQ&, I); + T*VQ& operator-=(T*VQ&, I); + + 23For every triple L, VQ, R), where L is an integral or enumeration + type, VQ is either volatile or empty, and R is a promoted integral + type, there exist candidate operator functions of the form + + VQ L& operator%=(VQ L&, R); + VQ L& operator<<=(VQ L&, R); + VQ L& operator>>=(VQ L&, R); + VQ L& operator&=(VQ L&, R); + VQ L& operator^=(VQ L&, R); + VQ L& operator|=(VQ L&, R); */ + + case MODIFY_EXPR: + switch (code2) + { + case PLUS_EXPR: + case MINUS_EXPR: + if (TYPE_PTROB_P (type1) && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type2)) + { + type2 = ptrdiff_type_node; + break; + } + case MULT_EXPR: + case TRUNC_DIV_EXPR: + if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) + break; + return; + + case TRUNC_MOD_EXPR: + case BIT_AND_EXPR: + case BIT_IOR_EXPR: + case BIT_XOR_EXPR: + case LSHIFT_EXPR: + case RSHIFT_EXPR: + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type1) && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type2)) + break; + return; + + case NOP_EXPR: + if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2)) + break; + if ((TYPE_PTRMEMFUNC_P (type1) && TYPE_PTRMEMFUNC_P (type2)) + || (TYPE_PTR_P (type1) && TYPE_PTR_P (type2)) + || (TYPE_PTRMEM_P (type1) && TYPE_PTRMEM_P (type2)) + || ((TYPE_PTRMEMFUNC_P (type1) + || TREE_CODE (type1) == POINTER_TYPE) + && null_ptr_cst_p (args[1]))) + { + type2 = type1; + break; + } + return; + + default: + gcc_unreachable (); + } + type1 = build_reference_type (type1); + break; + + case COND_EXPR: + /* [over.built] + + For every pair of promoted arithmetic types L and R, there + exist candidate operator functions of the form + + LR operator?(bool, L, R); + + where LR is the result of the usual arithmetic conversions + between types L and R. + + For every type T, where T is a pointer or pointer-to-member + type, there exist candidate operator functions of the form T + operator?(bool, T, T); */ + + if (promoted_arithmetic_type_p (type1) + && promoted_arithmetic_type_p (type2)) + /* That's OK. */ + 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 + below will actually create two candidates; one in which both + parameter types are TYPE1, and one in which both parameter + types are TYPE2. */ + break; + + default: + gcc_unreachable (); + } + + /* If we're dealing with two pointer types or two enumeral types, + we need candidates for both of them. */ + 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) + || MAYBE_CLASS_TYPE_P (type1) + || TREE_CODE (type1) == ENUMERAL_TYPE)) + { + build_builtin_candidate + (candidates, fnname, type1, type1, args, argtypes, flags); + build_builtin_candidate + (candidates, fnname, type2, type2, args, argtypes, flags); + return; + } + + build_builtin_candidate + (candidates, fnname, type1, type2, args, argtypes, flags); +} + +tree +type_decays_to (tree type) +{ + if (TREE_CODE (type) == ARRAY_TYPE) + return build_pointer_type (TREE_TYPE (type)); + if (TREE_CODE (type) == FUNCTION_TYPE) + return build_pointer_type (type); + return type; +} + +/* There are three conditions of builtin candidates: + + 1) bool-taking candidates. These are the same regardless of the input. + 2) pointer-pair taking candidates. These are generated for each type + one of the input types converts to. + 3) arithmetic candidates. According to the standard, we should generate + all of these, but I'm trying not to... + + Here we generate a superset of the possible candidates for this particular + case. That is a subset of the full set the standard defines, plus some + other cases which the standard disallows. add_builtin_candidate will + 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; + tree type, argtypes[3], t; + /* TYPES[i] is the set of possible builtin-operator parameter types + we will consider for the Ith argument. */ + VEC(tree,gc) *types[2]; + unsigned ix; + + for (i = 0; i < 3; ++i) + { + if (args[i]) + argtypes[i] = unlowered_expr_type (args[i]); + else + argtypes[i] = NULL_TREE; + } + + switch (code) + { +/* 4 For every pair T, VQ), where T is an arithmetic or enumeration type, + and VQ is either volatile or empty, there exist candidate operator + functions of the form + VQ T& operator++(VQ T&); */ + + case POSTINCREMENT_EXPR: + case PREINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + case PREDECREMENT_EXPR: + case MODIFY_EXPR: + ref1 = 1; + break; + +/* 24There also exist candidate operator functions of the form + bool operator!(bool); + bool operator&&(bool, bool); + bool operator||(bool, bool); */ + + case TRUTH_NOT_EXPR: + build_builtin_candidate + (candidates, fnname, boolean_type_node, + NULL_TREE, args, argtypes, flags); + return; + + case TRUTH_ORIF_EXPR: + case TRUTH_ANDIF_EXPR: + build_builtin_candidate + (candidates, fnname, boolean_type_node, + boolean_type_node, args, argtypes, flags); + return; + + case ADDR_EXPR: + case COMPOUND_EXPR: + case COMPONENT_REF: + return; + + case COND_EXPR: + case EQ_EXPR: + case NE_EXPR: + case LT_EXPR: + case LE_EXPR: + case GT_EXPR: + case GE_EXPR: + enum_p = 1; + /* Fall through. */ + + default: + ref1 = 0; + } + + types[0] = make_tree_vector (); + types[1] = make_tree_vector (); + + for (i = 0; i < 2; ++i) + { + if (! args[i]) + ; + else if (MAYBE_CLASS_TYPE_P (argtypes[i])) + { + tree convs; + + if (i == 0 && code == MODIFY_EXPR && code2 == NOP_EXPR) + return; + + convs = lookup_conversions (argtypes[i]); + + if (code == COND_EXPR) + { + if (real_lvalue_p (args[i])) + VEC_safe_push (tree, gc, types[i], + build_reference_type (argtypes[i])); + + VEC_safe_push (tree, gc, types[i], + TYPE_MAIN_VARIANT (argtypes[i])); + } + + else if (! convs) + return; + + for (; convs; convs = TREE_CHAIN (convs)) + { + type = TREE_TYPE (convs); + + if (i == 0 && ref1 + && (TREE_CODE (type) != REFERENCE_TYPE + || CP_TYPE_CONST_P (TREE_TYPE (type)))) + continue; + + if (code == COND_EXPR && TREE_CODE (type) == REFERENCE_TYPE) + VEC_safe_push (tree, gc, types[i], type); + + type = non_reference (type); + if (i != 0 || ! ref1) + { + type = TYPE_MAIN_VARIANT (type_decays_to (type)); + if (enum_p && TREE_CODE (type) == ENUMERAL_TYPE) + VEC_safe_push (tree, gc, types[i], type); + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type)) + type = type_promotes_to (type); + } + + if (! vec_member (type, types[i])) + VEC_safe_push (tree, gc, types[i], type); + } + } + else + { + if (code == COND_EXPR && real_lvalue_p (args[i])) + VEC_safe_push (tree, gc, types[i], + build_reference_type (argtypes[i])); + type = non_reference (argtypes[i]); + if (i != 0 || ! ref1) + { + type = TYPE_MAIN_VARIANT (type_decays_to (type)); + if (enum_p && UNSCOPED_ENUM_P (type)) + VEC_safe_push (tree, gc, types[i], type); + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type)) + type = type_promotes_to (type); + } + VEC_safe_push (tree, gc, types[i], type); + } + } + + /* Run through the possible parameter types of both arguments, + creating candidates with those parameter types. */ + FOR_EACH_VEC_ELT_REVERSE (tree, types[0], ix, t) + { + unsigned jx; + tree u; + + if (!VEC_empty (tree, types[1])) + FOR_EACH_VEC_ELT_REVERSE (tree, types[1], jx, u) + add_builtin_candidate + (candidates, code, code2, fnname, t, + u, args, argtypes, flags); + else + add_builtin_candidate + (candidates, code, code2, fnname, t, + NULL_TREE, args, argtypes, flags); + } + + release_tree_vector (types[0]); + release_tree_vector (types[1]); +} + + +/* If TMPL can be successfully instantiated as indicated by + EXPLICIT_TARGS and ARGLIST, adds the instantiation to CANDIDATES. + + TMPL is the template. EXPLICIT_TARGS are any explicit template + arguments. ARGLIST is the arguments provided at the call-site. + This does not change ARGLIST. The RETURN_TYPE is the desired type + for conversion operators. If OBJ is NULL_TREE, FLAGS and CTYPE are + as for add_function_candidate. If an OBJ is supplied, FLAGS and + CTYPE are ignored, and OBJ is as for add_conv_candidate. */ + +static struct z_candidate* +add_template_candidate_real (struct z_candidate **candidates, tree tmpl, + tree ctype, tree explicit_targs, tree first_arg, + const VEC(tree,gc) *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); + unsigned int len = VEC_length (tree, arglist); + unsigned int nargs = (first_arg == NULL_TREE ? 0 : 1) + len; + unsigned int skip_without_in_chrg = 0; + tree first_arg_without_in_chrg = first_arg; + tree *args_without_in_chrg; + unsigned int nargs_without_in_chrg; + unsigned int ia, ix; + tree arg; + struct z_candidate *cand; + int i; + tree fn; + struct rejection_reason *reason = NULL; + + /* We don't do deduction on the in-charge parameter, the VTT + parameter or 'this'. */ + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (tmpl)) + { + if (first_arg_without_in_chrg != NULL_TREE) + first_arg_without_in_chrg = NULL_TREE; + else + ++skip_without_in_chrg; + } + + if ((DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (tmpl) + || DECL_BASE_CONSTRUCTOR_P (tmpl)) + && CLASSTYPE_VBASECLASSES (DECL_CONTEXT (tmpl))) + { + if (first_arg_without_in_chrg != NULL_TREE) + first_arg_without_in_chrg = NULL_TREE; + else + ++skip_without_in_chrg; + } + + if (len < skip_without_in_chrg) + return NULL; + + nargs_without_in_chrg = ((first_arg_without_in_chrg != NULL_TREE ? 1 : 0) + + (len - skip_without_in_chrg)); + args_without_in_chrg = XALLOCAVEC (tree, nargs_without_in_chrg); + ia = 0; + if (first_arg_without_in_chrg != NULL_TREE) + { + args_without_in_chrg[ia] = first_arg_without_in_chrg; + ++ia; + } + for (ix = skip_without_in_chrg; + VEC_iterate (tree, arglist, ix, arg); + ++ix) + { + args_without_in_chrg[ia] = arg; + ++ia; + } + gcc_assert (ia == nargs_without_in_chrg); + + i = fn_type_unification (tmpl, explicit_targs, targs, + args_without_in_chrg, + nargs_without_in_chrg, + return_type, strict, flags); + + if (i != 0) + goto fail; + + fn = instantiate_template (tmpl, targs, tf_none); + if (fn == error_mark_node) + goto fail; + + /* In [class.copy]: + + A member function template is never instantiated to perform the + copy of a class object to an object of its class type. + + It's a little unclear what this means; the standard explicitly + does allow a template to be used to copy a class. For example, + in: + + struct A { + A(A&); + template A(const T&); + }; + const A f (); + void g () { A a (f ()); } + + the member template will be used to make the copy. The section + quoted above appears in the paragraph that forbids constructors + whose only parameter is (a possibly cv-qualified variant of) the + class type, and a logical interpretation is that the intent was + to forbid the instantiation of member templates which would then + have that form. */ + if (DECL_CONSTRUCTOR_P (fn) && nargs == 2) + { + tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (fn); + if (arg_types && same_type_p (TYPE_MAIN_VARIANT (TREE_VALUE (arg_types)), + ctype)) + goto fail; + } + + if (obj != NULL_TREE) + /* Aha, this is a conversion function. */ + cand = add_conv_candidate (candidates, fn, obj, first_arg, arglist, + access_path, conversion_path); + else + cand = add_function_candidate (candidates, fn, ctype, + first_arg, arglist, access_path, + conversion_path, flags); + if (DECL_TI_TEMPLATE (fn) != tmpl) + /* This situation can occur if a member template of a template + class is specialized. Then, instantiate_template might return + an instantiation of the specialization, in which case the + DECL_TI_TEMPLATE field will point at the original + specialization. For example: + + template struct S { template void f(U); + template <> void f(int) {}; }; + S sd; + sd.f(3); + + Here, TMPL will be template S::f(U). + And, instantiate template will give us the specialization + template <> S::f(int). But, the DECL_TI_TEMPLATE field + for this will point at template template <> S::f(int), + so that we can find the definition. For the purposes of + overload resolution, however, we want the original TMPL. */ + cand->template_decl = build_template_info (tmpl, targs); + else + cand->template_decl = DECL_TEMPLATE_INFO (fn); + cand->explicit_targs = explicit_targs; + + return cand; + fail: + return add_candidate (candidates, tmpl, first_arg, arglist, nargs, NULL, + access_path, conversion_path, 0, reason); +} + + +static struct z_candidate * +add_template_candidate (struct z_candidate **candidates, tree tmpl, tree ctype, + tree explicit_targs, tree first_arg, + const VEC(tree,gc) *arglist, tree return_type, + tree access_path, tree conversion_path, int flags, + unification_kind_t strict) +{ + return + add_template_candidate_real (candidates, tmpl, ctype, + explicit_targs, first_arg, arglist, + return_type, access_path, conversion_path, + flags, NULL_TREE, strict); +} + + +static struct z_candidate * +add_template_conv_candidate (struct z_candidate **candidates, tree tmpl, + tree obj, tree first_arg, + const VEC(tree,gc) *arglist, + tree return_type, tree access_path, + tree conversion_path) +{ + return + add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE, + first_arg, arglist, return_type, access_path, + 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, or CANDS + if none are viable. If any 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; +} + +/* OBJ is being used in an expression like "OBJ.f (...)". In other + words, it is about to become the "this" pointer for a member + function call. Take the address of the object. */ + +static tree +build_this (tree obj) +{ + /* In a template, we are only concerned about the type of the + expression, so we can take a shortcut. */ + if (processing_template_decl) + return build_address (obj); + + return cp_build_addr_expr (obj, tf_warning_or_error); +} + +/* Returns true iff functions are equivalent. Equivalent functions are + not '==' only if one is a function-local extern function or if + both are extern "C". */ + +static inline int +equal_functions (tree fn1, tree fn2) +{ + if (TREE_CODE (fn1) != TREE_CODE (fn2)) + return 0; + if (TREE_CODE (fn1) == TEMPLATE_DECL) + return fn1 == fn2; + if (DECL_LOCAL_FUNCTION_P (fn1) || DECL_LOCAL_FUNCTION_P (fn2) + || DECL_EXTERN_C_FUNCTION_P (fn1)) + return decls_match (fn1, fn2); + return fn1 == fn2; +} + +/* Print information about a candidate being rejected due to INFO. */ + +static void +print_conversion_rejection (location_t loc, struct conversion_info *info) +{ + if (info->n_arg == -1) + /* Conversion of implicit `this' argument failed. */ + inform (loc, " no known conversion for implicit " + "% parameter from %qT to %qT", + info->from_type, info->to_type); + else + inform (loc, " no known conversion for argument %d from %qT to %qT", + info->n_arg+1, info->from_type, info->to_type); +} + +/* 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) +{ + const char *msg = (msgstr == NULL + ? "" + : ACONCAT ((msgstr, " ", NULL))); + location_t loc = location_of (candidate->fn); + + if (TREE_CODE (candidate->fn) == IDENTIFIER_NODE) + { + if (candidate->num_convs == 3) + inform (input_location, "%s%D(%T, %T, %T) ", msg, candidate->fn, + candidate->convs[0]->type, + candidate->convs[1]->type, + candidate->convs[2]->type); + else if (candidate->num_convs == 2) + inform (input_location, "%s%D(%T, %T) ", msg, candidate->fn, + candidate->convs[0]->type, + candidate->convs[1]->type); + else + inform (input_location, "%s%D(%T) ", msg, candidate->fn, + candidate->convs[0]->type); + } + else if (TYPE_P (candidate->fn)) + inform (input_location, "%s%T ", msg, candidate->fn); + else if (candidate->viable == -1) + inform (loc, "%s%#D ", msg, candidate->fn); + else if (DECL_DELETED_FN (STRIP_TEMPLATE (candidate->fn))) + inform (loc, "%s%#D ", msg, candidate->fn); + else + inform (loc, "%s%#D", msg, candidate->fn); + /* Give the user some information about why this candidate failed. */ + if (candidate->reason != NULL) + { + struct rejection_reason *r = candidate->reason; + + switch (r->code) + { + case rr_arity: + inform_n (loc, r->u.arity.expected, + " candidate expects %d argument, %d provided", + " candidate expects %d arguments, %d provided", + r->u.arity.expected, r->u.arity.actual); + break; + case rr_arg_conversion: + print_conversion_rejection (loc, &r->u.conversion); + break; + case rr_bad_arg_conversion: + print_conversion_rejection (loc, &r->u.bad_conversion); + break; + case rr_none: + default: + /* This candidate didn't have any issues or we failed to + handle a particular code. Either way... */ + gcc_unreachable (); + } + } +} + +static void +print_z_candidates (location_t loc, struct z_candidate *candidates) +{ + struct z_candidate *cand1; + struct z_candidate **cand2; + int n_candidates; + + if (!candidates) + return; + + /* Remove non-viable deleted candidates. */ + cand1 = candidates; + for (cand2 = &cand1; *cand2; ) + { + if (TREE_CODE ((*cand2)->fn) == FUNCTION_DECL + && !(*cand2)->viable + && DECL_DELETED_FN ((*cand2)->fn)) + *cand2 = (*cand2)->next; + else + cand2 = &(*cand2)->next; + } + /* ...if there are any non-deleted ones. */ + if (cand1) + candidates = cand1; + + /* There may be duplicates in the set of candidates. We put off + checking this condition as long as possible, since we have no way + to eliminate duplicates from a set of functions in less than n^2 + time. Now we are about to emit an error message, so it is more + permissible to go slowly. */ + for (cand1 = candidates; cand1; cand1 = cand1->next) + { + tree fn = cand1->fn; + /* Skip builtin candidates and conversion functions. */ + if (!DECL_P (fn)) + continue; + cand2 = &cand1->next; + while (*cand2) + { + if (DECL_P ((*cand2)->fn) + && equal_functions (fn, (*cand2)->fn)) + *cand2 = (*cand2)->next; + else + cand2 = &(*cand2)->next; + } + } + + for (n_candidates = 0, cand1 = candidates; cand1; cand1 = cand1->next) + n_candidates++; + + inform_n (loc, n_candidates, "candidate is:", "candidates are:"); + for (; candidates; candidates = candidates->next) + print_z_candidate (NULL, candidates); +} + +/* USER_SEQ is a user-defined conversion sequence, beginning with a + USER_CONV. STD_SEQ is the standard conversion sequence applied to + the result of the conversion function to convert it to the final + desired type. Merge the two sequences into a single sequence, + and return the merged sequence. */ + +static conversion * +merge_conversion_sequences (conversion *user_seq, conversion *std_seq) +{ + conversion **t; + + gcc_assert (user_seq->kind == ck_user); + + /* Find the end of the second conversion sequence. */ + t = &(std_seq); + while ((*t)->kind != ck_identity) + t = &((*t)->u.next); + + /* Replace the identity conversion with the user conversion + sequence. */ + *t = user_seq; + + /* The entire sequence is a user-conversion sequence. */ + std_seq->user_conv_p = true; + + return std_seq; +} + +/* Handle overload resolution for initializing an object of class type from + an initializer list. First we look for a suitable constructor that + takes a std::initializer_list; if we don't find one, we then look for a + non-list constructor. + + Parameters are as for add_candidates, except that the arguments are in + the form of a CONSTRUCTOR (the initializer list) rather than a VEC, and + the RETURN_TYPE parameter is replaced by TOTYPE, the desired type. */ + +static void +add_list_candidates (tree fns, tree first_arg, + tree init_list, tree totype, + tree explicit_targs, bool template_only, + tree conversion_path, tree access_path, + int flags, + struct z_candidate **candidates) +{ + VEC(tree,gc) *args; + + gcc_assert (*candidates == NULL); + + /* For list-initialization we consider explicit constructors, but + give an error if one is selected. */ + flags &= ~LOOKUP_ONLYCONVERTING; + /* And we don't allow narrowing conversions. We also use this flag to + avoid the copy constructor call for copy-list-initialization. */ + flags |= LOOKUP_NO_NARROWING; + + /* Always use the default constructor if the list is empty (DR 990). */ + if (CONSTRUCTOR_NELTS (init_list) == 0 + && TYPE_HAS_DEFAULT_CONSTRUCTOR (totype)) + ; + /* If the class has a list ctor, try passing the list as a single + argument first, but only consider list ctors. */ + else if (TYPE_HAS_LIST_CTOR (totype)) + { + flags |= LOOKUP_LIST_ONLY; + args = make_tree_vector_single (init_list); + add_candidates (fns, first_arg, args, NULL_TREE, + explicit_targs, template_only, conversion_path, + access_path, flags, candidates); + if (any_strictly_viable (*candidates)) + return; + } + + args = ctor_to_vec (init_list); + + /* We aren't looking for list-ctors anymore. */ + flags &= ~LOOKUP_LIST_ONLY; + /* We allow more user-defined conversions within an init-list. */ + flags &= ~LOOKUP_NO_CONVERSION; + /* But not for the copy ctor. */ + flags |= LOOKUP_NO_COPY_CTOR_CONVERSION; + + add_candidates (fns, first_arg, args, NULL_TREE, + explicit_targs, template_only, conversion_path, + access_path, flags, candidates); +} + +/* Returns the best overload candidate to perform the requested + conversion. This function is used for three the overloading situations + described in [over.match.copy], [over.match.conv], and [over.match.ref]. + If TOTYPE is a REFERENCE_TYPE, we're trying to find an lvalue binding as + 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; + tree conv_fns = NULL_TREE; + conversion *conv = NULL; + tree first_arg = NULL_TREE; + VEC(tree,gc) *args = NULL; + bool any_viable_p; + int convflags; + + /* We represent conversion within a hierarchy using RVALUE_CONV and + BASE_CONV, as specified by [over.best.ics]; these become plain + constructor calls, as specified in [dcl.init]. */ + gcc_assert (!MAYBE_CLASS_TYPE_P (fromtype) || !MAYBE_CLASS_TYPE_P (totype) + || !DERIVED_FROM_P (totype, fromtype)); + + if (MAYBE_CLASS_TYPE_P (totype)) + ctors = lookup_fnfields (totype, complete_ctor_identifier, 0); + + if (MAYBE_CLASS_TYPE_P (fromtype)) + { + tree to_nonref = non_reference (totype); + if (same_type_ignoring_top_level_qualifiers_p (to_nonref, fromtype) || + (CLASS_TYPE_P (to_nonref) && CLASS_TYPE_P (fromtype) + && DERIVED_FROM_P (to_nonref, fromtype))) + { + /* [class.conv.fct] A conversion function is never used to + convert a (possibly cv-qualified) object to the (possibly + cv-qualified) same object type (or a reference to it), to a + (possibly cv-qualified) base class of that type (or a + reference to it)... */ + } + else + conv_fns = lookup_conversions (fromtype); + } + + candidates = 0; + flags |= LOOKUP_NO_CONVERSION; + if (BRACE_ENCLOSED_INITIALIZER_P (expr)) + flags |= LOOKUP_NO_NARROWING; + + /* It's OK to bind a temporary for converting constructor arguments, but + not in converting the return value of a conversion operator. */ + convflags = ((flags & LOOKUP_NO_TEMP_BIND) | LOOKUP_NO_CONVERSION); + flags &= ~LOOKUP_NO_TEMP_BIND; + + if (ctors) + { + int ctorflags = flags; + ctors = BASELINK_FUNCTIONS (ctors); + + first_arg = build_int_cst (build_pointer_type (totype), 0); + + /* We should never try to call the abstract or base constructor + from here. */ + gcc_assert (!DECL_HAS_IN_CHARGE_PARM_P (OVL_CURRENT (ctors)) + && !DECL_HAS_VTT_PARM_P (OVL_CURRENT (ctors))); + + if (BRACE_ENCLOSED_INITIALIZER_P (expr)) + { + /* List-initialization. */ + add_list_candidates (ctors, first_arg, expr, totype, NULL_TREE, + false, TYPE_BINFO (totype), TYPE_BINFO (totype), + ctorflags, &candidates); + } + else + { + args = make_tree_vector_single (expr); + add_candidates (ctors, first_arg, args, NULL_TREE, NULL_TREE, false, + TYPE_BINFO (totype), TYPE_BINFO (totype), + ctorflags, &candidates); + } + + for (cand = candidates; cand; cand = cand->next) + { + cand->second_conv = build_identity_conv (totype, NULL_TREE); + + /* If totype isn't a reference, and LOOKUP_NO_TEMP_BIND isn't + set, then this is copy-initialization. In that case, "The + result of the call is then used to direct-initialize the + object that is the destination of the copy-initialization." + [dcl.init] + + We represent this in the conversion sequence with an + rvalue conversion, which means a constructor call. */ + if (TREE_CODE (totype) != REFERENCE_TYPE + && !(convflags & LOOKUP_NO_TEMP_BIND)) + cand->second_conv + = build_conv (ck_rvalue, totype, cand->second_conv); + } + } + + if (conv_fns) + first_arg = build_this (expr); + + for (; conv_fns; conv_fns = TREE_CHAIN (conv_fns)) + { + tree conversion_path = TREE_PURPOSE (conv_fns); + struct z_candidate *old_candidates; + + /* If we are called to convert to a reference type, we are trying to + find an lvalue binding, so don't even consider temporaries. If + we don't find an lvalue binding, the caller will try again to + look for a temporary binding. */ + if (TREE_CODE (totype) == REFERENCE_TYPE) + convflags |= LOOKUP_NO_TEMP_BIND; + + old_candidates = candidates; + add_candidates (TREE_VALUE (conv_fns), first_arg, NULL, totype, + NULL_TREE, false, + conversion_path, TYPE_BINFO (fromtype), + flags, &candidates); + + for (cand = candidates; cand != old_candidates; cand = cand->next) + { + conversion *ics + = implicit_conversion (totype, + TREE_TYPE (TREE_TYPE (cand->fn)), + 0, + /*c_cast_p=*/false, convflags); + + /* If LOOKUP_NO_TEMP_BIND isn't set, then this is + copy-initialization. In that case, "The result of the + call is then used to direct-initialize the object that is + the destination of the copy-initialization." [dcl.init] + + We represent this in the conversion sequence with an + rvalue conversion, which means a constructor call. But + don't add a second rvalue conversion if there's already + one there. Which there really shouldn't be, but it's + harmless since we'd add it here anyway. */ + if (ics && MAYBE_CLASS_TYPE_P (totype) && ics->kind != ck_rvalue + && !(convflags & LOOKUP_NO_TEMP_BIND)) + ics = build_conv (ck_rvalue, totype, ics); + + cand->second_conv = ics; + + if (!ics) + { + tree rettype = TREE_TYPE (TREE_TYPE (cand->fn)); + cand->viable = 0; + cand->reason = arg_conversion_rejection (NULL_TREE, -1, + rettype, totype); + } + else if (cand->viable == 1 && ics->bad_p) + { + tree rettype = TREE_TYPE (TREE_TYPE (cand->fn)); + cand->viable = -1; + cand->reason + = bad_arg_conversion_rejection (NULL_TREE, -1, + rettype, totype); + } + } + } + + candidates = splice_viable (candidates, pedantic, &any_viable_p); + if (!any_viable_p) + return NULL; + + cand = tourney (candidates); + if (cand == 0) + { + if (flags & LOOKUP_COMPLAIN) + { + error ("conversion from %qT to %qT is ambiguous", + fromtype, totype); + print_z_candidates (location_of (expr), candidates); + } + + cand = candidates; /* any one will do */ + cand->second_conv = build_ambiguous_conv (totype, expr); + cand->second_conv->user_conv_p = true; + if (!any_strictly_viable (candidates)) + cand->second_conv->bad_p = true; + /* If there are viable candidates, don't set ICS_BAD_FLAG; an + ambiguous conversion is no worse than another user-defined + conversion. */ + + return cand; + } + + /* Build the user conversion sequence. */ + conv = build_conv + (ck_user, + (DECL_CONSTRUCTOR_P (cand->fn) + ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))), + build_identity_conv (TREE_TYPE (expr), expr)); + conv->cand = cand; + + /* Remember that this was a list-initialization. */ + if (flags & LOOKUP_NO_NARROWING) + conv->check_narrowing = true; + + /* Combine it with the second conversion sequence. */ + cand->second_conv = merge_conversion_sequences (conv, + cand->second_conv); + + if (cand->viable == -1) + cand->second_conv->bad_p = true; + + return cand; +} + +tree +build_user_type_conversion (tree totype, tree expr, int flags) +{ + struct z_candidate *cand + = build_user_type_conversion_1 (totype, expr, flags); + + if (cand) + { + if (cand->second_conv->kind == ck_ambig) + return error_mark_node; + expr = convert_like (cand->second_conv, expr, tf_warning_or_error); + return convert_from_reference (expr); + } + return NULL_TREE; +} + +/* Subroutine of convert_nontype_argument. + + EXPR is an argument for a template non-type parameter of integral or + enumeration type. Do any necessary conversions (that are permitted for + non-type arguments) to convert it to the parameter type. + + If conversion is successful, returns the converted expression; + otherwise, returns error_mark_node. */ + +tree +build_integral_nontype_arg_conv (tree type, tree expr, tsubst_flags_t complain) +{ + conversion *conv; + void *p; + tree t; + + if (error_operand_p (expr)) + return error_mark_node; + + gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type)); + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + conv = implicit_conversion (type, TREE_TYPE (expr), expr, + /*c_cast_p=*/false, + LOOKUP_IMPLICIT); + + /* for a non-type template-parameter of integral or + enumeration type, integral promotions (4.5) and integral + conversions (4.7) are applied. */ + /* It should be sufficient to check the outermost conversion step, since + there are no qualification conversions to integer type. */ + if (conv) + switch (conv->kind) + { + /* A conversion function is OK. If it isn't constexpr, we'll + complain later that the argument isn't constant. */ + case ck_user: + /* The lvalue-to-rvalue conversion is OK. */ + case ck_rvalue: + case ck_identity: + break; + + case ck_std: + t = conv->u.next->type; + if (INTEGRAL_OR_ENUMERATION_TYPE_P (t)) + break; + + if (complain & tf_error) + error ("conversion from %qT to %qT not considered for " + "non-type template argument", t, type); + /* and fall through. */ + + default: + conv = NULL; + break; + } + + if (conv) + expr = convert_like (conv, expr, complain); + else + expr = error_mark_node; + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return expr; +} + +/* Do any initial processing on the arguments to a function call. */ + +static VEC(tree,gc) * +resolve_args (VEC(tree,gc) *args) +{ + unsigned int ix; + tree arg; + + FOR_EACH_VEC_ELT (tree, args, ix, arg) + { + if (error_operand_p (arg)) + return NULL; + else if (VOID_TYPE_P (TREE_TYPE (arg))) + { + error ("invalid use of void expression"); + return NULL; + } + else if (invalid_nonstatic_memfn_p (arg, tf_warning_or_error)) + return NULL; + } + 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, + const VEC(tree,gc) *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. */ + gcc_assert (TREE_CODE (fn) == FUNCTION_DECL + || TREE_CODE (fn) == TEMPLATE_DECL + || TREE_CODE (fn) == OVERLOAD + || TREE_CODE (fn) == TEMPLATE_ID_EXPR); + + if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) + { + explicit_targs = TREE_OPERAND (fn, 1); + fn = TREE_OPERAND (fn, 0); + template_only = 1; + } + + /* Add the various candidate functions. */ + add_candidates (fn, NULL_TREE, args, NULL_TREE, + 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; +} + +/* Print an error message about being unable to build a call to FN with + ARGS. ANY_VIABLE_P indicates whether any candidate functions could + be located; CANDIDATES is a possibly empty list of such + functions. */ + +static void +print_error_for_call_failure (tree fn, VEC(tree,gc) *args, bool any_viable_p, + struct z_candidate *candidates) +{ + tree name = DECL_NAME (OVL_CURRENT (fn)); + location_t loc = location_of (name); + + if (!any_viable_p) + error_at (loc, "no matching function for call to %<%D(%A)%>", + name, build_tree_list_vec (args)); + else + error_at (loc, "call of overloaded %<%D(%A)%> is ambiguous", + name, build_tree_list_vec (args)); + if (candidates) + print_z_candidates (loc, candidates); +} + +/* Return an expression for a call to FN (a namespace-scope function, + or a static member function) with the ARGS. This may change + ARGS. */ + +tree +build_new_function_call (tree fn, VEC(tree,gc) **args, bool koenig_p, + tsubst_flags_t complain) +{ + struct z_candidate *candidates, *cand; + bool any_viable_p; + void *p; + tree result; + + if (args != NULL && *args != NULL) + { + *args = resolve_args (*args); + if (*args == NULL) + return error_mark_node; + } + + /* If this function was found without using argument dependent + lookup, then we want to ignore any undeclared friend + functions. */ + if (!koenig_p) + { + tree orig_fn = fn; + + fn = remove_hidden_names (fn); + if (!fn) + { + if (complain & tf_error) + print_error_for_call_failure (orig_fn, *args, false, NULL); + return error_mark_node; + } + } + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + cand = perform_overload_resolution (fn, *args, &candidates, &any_viable_p); + + if (!cand) + { + if (complain & tf_error) + { + if (!any_viable_p && candidates && ! candidates->next + && (TREE_CODE (candidates->fn) == FUNCTION_DECL)) + return cp_build_function_call_vec (candidates->fn, args, complain); + if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) + fn = TREE_OPERAND (fn, 0); + print_error_for_call_failure (fn, *args, any_viable_p, candidates); + } + result = error_mark_node; + } + else + result = build_over_call (cand, LOOKUP_NORMAL, complain); + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return result; +} + +/* 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. This may change ARGS. *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. If FN is + non-NULL, it will be set, upon return, to the allocation function + called. */ + +tree +build_operator_new_call (tree fnname, VEC(tree,gc) **args, + tree *size, tree *cookie_size, + tree *fn) +{ + tree fns; + struct z_candidate *candidates; + struct z_candidate *cand; + bool any_viable_p; + + if (fn) + *fn = NULL_TREE; + VEC_safe_insert (tree, gc, *args, 0, *size); + *args = resolve_args (*args); + if (*args == NULL) + return error_mark_node; + + /* Based on: + + [expr.new] + + If this lookup fails to find the name, or if the allocated type + is not a class type, the allocation function's name is looked + up in the global scope. + + we disregard block-scope declarations of "operator new". */ + fns = lookup_function_nonclass (fnname, *args, /*block_p=*/false); + + /* 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) + { + print_error_for_call_failure (fns, *args, any_viable_p, 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)) + { + /* In G++ 3.2, the check was implemented incorrectly; it + looked at the placement expression, rather than the + type of the function. */ + if (VEC_length (tree, *args) == 2 + && same_type_p (TREE_TYPE (VEC_index (tree, *args, 1)), + 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. */ + VEC_replace (tree, *args, 0, *size); + } + else + *cookie_size = NULL_TREE; + } + + /* Tell our caller which function we decided to call. */ + if (fn) + *fn = cand->fn; + + /* Build the CALL_EXPR. */ + return build_over_call (cand, LOOKUP_NORMAL, tf_warning_or_error); +} + +/* Build a new call to operator(). This may change ARGS. */ + +tree +build_op_call (tree obj, VEC(tree,gc) **args, tsubst_flags_t complain) +{ + struct z_candidate *candidates = 0, *cand; + tree fns, convs, first_mem_arg = NULL_TREE; + tree type = TREE_TYPE (obj); + bool any_viable_p; + tree result = NULL_TREE; + void *p; + + if (error_operand_p (obj)) + return error_mark_node; + + obj = prep_operand (obj); + + if (TYPE_PTRMEMFUNC_P (type)) + { + if (complain & tf_error) + /* It's no good looking for an overloaded operator() on a + pointer-to-member-function. */ + error ("pointer-to-member function %E cannot be called without an object; consider using .* or ->*", obj); + return error_mark_node; + } + + if (TYPE_BINFO (type)) + { + fns = lookup_fnfields (TYPE_BINFO (type), ansi_opname (CALL_EXPR), 1); + if (fns == error_mark_node) + return error_mark_node; + } + else + fns = NULL_TREE; + + if (args != NULL && *args != NULL) + { + *args = resolve_args (*args); + if (*args == NULL) + return error_mark_node; + } + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + if (fns) + { + first_mem_arg = build_this (obj); + + add_candidates (BASELINK_FUNCTIONS (fns), + first_mem_arg, *args, NULL_TREE, + NULL_TREE, false, + BASELINK_BINFO (fns), BASELINK_ACCESS_BINFO (fns), + LOOKUP_NORMAL, &candidates); + } + + convs = lookup_conversions (type); + + for (; convs; convs = TREE_CHAIN (convs)) + { + tree fns = TREE_VALUE (convs); + tree totype = TREE_TYPE (convs); + + if ((TREE_CODE (totype) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (totype)) == FUNCTION_TYPE) + || (TREE_CODE (totype) == REFERENCE_TYPE + && TREE_CODE (TREE_TYPE (totype)) == FUNCTION_TYPE) + || (TREE_CODE (totype) == REFERENCE_TYPE + && TREE_CODE (TREE_TYPE (totype)) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (totype))) == FUNCTION_TYPE)) + for (; fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + + if (DECL_NONCONVERTING_P (fn)) + continue; + + if (TREE_CODE (fn) == TEMPLATE_DECL) + add_template_conv_candidate + (&candidates, fn, obj, NULL_TREE, *args, totype, + /*access_path=*/NULL_TREE, + /*conversion_path=*/NULL_TREE); + else + add_conv_candidate (&candidates, fn, obj, NULL_TREE, + *args, /*conversion_path=*/NULL_TREE, + /*access_path=*/NULL_TREE); + } + } + + candidates = splice_viable (candidates, pedantic, &any_viable_p); + if (!any_viable_p) + { + if (complain & tf_error) + { + error ("no match for call to %<(%T) (%A)%>", TREE_TYPE (obj), + build_tree_list_vec (*args)); + print_z_candidates (location_of (TREE_TYPE (obj)), candidates); + } + result = error_mark_node; + } + else + { + cand = tourney (candidates); + if (cand == 0) + { + if (complain & tf_error) + { + error ("call of %<(%T) (%A)%> is ambiguous", + TREE_TYPE (obj), build_tree_list_vec (*args)); + print_z_candidates (location_of (TREE_TYPE (obj)), candidates); + } + result = error_mark_node; + } + /* Since cand->fn will be a type, not a function, for a conversion + function, we must be careful not to unconditionally look at + DECL_NAME here. */ + else if (TREE_CODE (cand->fn) == FUNCTION_DECL + && DECL_OVERLOADED_OPERATOR_P (cand->fn) == CALL_EXPR) + result = build_over_call (cand, LOOKUP_NORMAL, complain); + else + { + obj = convert_like_with_context (cand->convs[0], obj, cand->fn, -1, + complain); + obj = convert_from_reference (obj); + result = cp_build_function_call_vec (obj, args, complain); + } + } + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return result; +} + +static void +op_error (enum tree_code code, enum tree_code code2, + tree arg1, tree arg2, tree arg3, bool match) +{ + const char *opname; + + if (code == MODIFY_EXPR) + opname = assignment_operator_name_info[code2].name; + else + opname = operator_name_info[code].name; + + switch (code) + { + case COND_EXPR: + if (match) + error ("ambiguous overload for ternary % " + "in %<%E ? %E : %E%>", arg1, arg2, arg3); + else + error ("no match for ternary % " + "in %<%E ? %E : %E%>", arg1, arg2, arg3); + break; + + case POSTINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + if (match) + error ("ambiguous overload for % in %<%E%s%>", + opname, arg1, opname); + else + error ("no match for % in %<%E%s%>", + opname, arg1, opname); + break; + + case ARRAY_REF: + if (match) + error ("ambiguous overload for % in %<%E[%E]%>", + arg1, arg2); + else + error ("no match for % in %<%E[%E]%>", + arg1, arg2); + break; + + case REALPART_EXPR: + case IMAGPART_EXPR: + if (match) + error ("ambiguous overload for %qs in %<%s %E%>", + opname, opname, arg1); + else + error ("no match for %qs in %<%s %E%>", + opname, opname, arg1); + break; + + default: + if (arg2) + if (match) + error ("ambiguous overload for % in %<%E %s %E%>", + opname, arg1, opname, arg2); + else + error ("no match for % in %<%E %s %E%>", + opname, arg1, opname, arg2); + else + if (match) + error ("ambiguous overload for % in %<%s%E%>", + opname, opname, arg1); + else + error ("no match for % in %<%s%E%>", + opname, opname, arg1); + break; + } +} + +/* Return the implicit conversion sequence that could be used to + convert E1 to E2 in [expr.cond]. */ + +static conversion * +conditional_conversion (tree e1, tree e2) +{ + tree t1 = non_reference (TREE_TYPE (e1)); + tree t2 = non_reference (TREE_TYPE (e2)); + conversion *conv; + bool good_base; + + /* [expr.cond] + + If E2 is an lvalue: E1 can be converted to match E2 if E1 can be + implicitly converted (clause _conv_) to the type "reference to + T2", subject to the constraint that in the conversion the + reference must bind directly (_dcl.init.ref_) to E1. */ + if (real_lvalue_p (e2)) + { + conv = implicit_conversion (build_reference_type (t2), + t1, + e1, + /*c_cast_p=*/false, + LOOKUP_NO_TEMP_BIND|LOOKUP_ONLYCONVERTING); + if (conv) + return conv; + } + + /* [expr.cond] + + If E1 and E2 have class type, and the underlying class types are + the same or one is a base class of the other: E1 can be converted + to match E2 if the class of T2 is the same type as, or a base + class of, the class of T1, and the cv-qualification of T2 is the + same cv-qualification as, or a greater cv-qualification than, the + cv-qualification of T1. If the conversion is applied, E1 is + changed to an rvalue of type T2 that still refers to the original + source class object (or the appropriate subobject thereof). */ + if (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2) + && ((good_base = DERIVED_FROM_P (t2, t1)) || DERIVED_FROM_P (t1, t2))) + { + if (good_base && at_least_as_qualified_p (t2, t1)) + { + conv = build_identity_conv (t1, e1); + if (!same_type_p (TYPE_MAIN_VARIANT (t1), + TYPE_MAIN_VARIANT (t2))) + conv = build_conv (ck_base, t2, conv); + else + conv = build_conv (ck_rvalue, t2, conv); + return conv; + } + else + return NULL; + } + else + /* [expr.cond] + + Otherwise: E1 can be converted to match E2 if E1 can be implicitly + converted to the type that expression E2 would have if E2 were + converted to an rvalue (or the type it has, if E2 is an rvalue). */ + return implicit_conversion (t2, t1, e1, /*c_cast_p=*/false, + LOOKUP_IMPLICIT); +} + +/* Implement [expr.cond]. ARG1, ARG2, and ARG3 are the three + arguments to the conditional expression. */ + +tree +build_conditional_expr (tree arg1, tree arg2, tree arg3, + tsubst_flags_t complain) +{ + tree arg2_type; + tree arg3_type; + tree result = NULL_TREE; + tree result_type = NULL_TREE; + bool lvalue_p = true; + struct z_candidate *candidates = 0; + struct z_candidate *cand; + void *p; + + /* As a G++ extension, the second argument to the conditional can be + omitted. (So that `a ? : c' is roughly equivalent to `a ? a : + c'.) If the second operand is omitted, make sure it is + calculated only once. */ + if (!arg2) + { + if (complain & tf_error) + pedwarn (input_location, OPT_pedantic, + "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 expression is implicitly converted to bool (clause + _conv_). */ + arg1 = perform_implicit_conversion_flags (boolean_type_node, arg1, complain, + LOOKUP_NORMAL); + + /* 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] + + If either the second or the third operand has type (possibly + cv-qualified) void, then the lvalue-to-rvalue (_conv.lval_), + array-to-pointer (_conv.array_), and function-to-pointer + (_conv.func_) standard conversions are performed on the second + and third operands. */ + arg2_type = unlowered_expr_type (arg2); + arg3_type = unlowered_expr_type (arg3); + if (VOID_TYPE_P (arg2_type) || VOID_TYPE_P (arg3_type)) + { + /* Do the conversions. We don't these for `void' type arguments + since it can't have any effect and since decay_conversion + does not handle that case gracefully. */ + if (!VOID_TYPE_P (arg2_type)) + arg2 = decay_conversion (arg2); + if (!VOID_TYPE_P (arg3_type)) + arg3 = decay_conversion (arg3); + arg2_type = TREE_TYPE (arg2); + arg3_type = TREE_TYPE (arg3); + + /* [expr.cond] + + One of the following shall hold: + + --The second or the third operand (but not both) is a + throw-expression (_except.throw_); the result is of the + 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 + { + if (complain & tf_error) + { + if (VOID_TYPE_P (arg2_type)) + error ("second operand to the conditional operator " + "is of type %, " + "but the third operand is neither a throw-expression " + "nor of type %"); + else + error ("third operand to the conditional operator " + "is of type %, " + "but the second operand is neither a throw-expression " + "nor of type %"); + } + return error_mark_node; + } + + lvalue_p = false; + goto valid_operands; + } + /* [expr.cond] + + Otherwise, if the second and third operand have different types, + and either has (possibly cv-qualified) class type, an attempt is + made to convert each of those operands to the type of the other. */ + else if (!same_type_p (arg2_type, arg3_type) + && (CLASS_TYPE_P (arg2_type) || CLASS_TYPE_P (arg3_type))) + { + conversion *conv2; + conversion *conv3; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + conv2 = conditional_conversion (arg2, arg3); + conv3 = conditional_conversion (arg3, arg2); + + /* [expr.cond] + + If both can be converted, or one can be converted but the + conversion is ambiguous, the program is ill-formed. If + neither can be converted, the operands are left unchanged and + further checking is performed as described below. If exactly + one conversion is possible, that conversion is applied to the + chosen operand and the converted operand is used in place of + the original operand for the remainder of this section. */ + if ((conv2 && !conv2->bad_p + && conv3 && !conv3->bad_p) + || (conv2 && conv2->kind == ck_ambig) + || (conv3 && conv3->kind == ck_ambig)) + { + error ("operands to ?: have different types %qT and %qT", + arg2_type, arg3_type); + result = error_mark_node; + } + else if (conv2 && (!conv2->bad_p || !conv3)) + { + arg2 = convert_like (conv2, arg2, complain); + arg2 = convert_from_reference (arg2); + arg2_type = TREE_TYPE (arg2); + /* Even if CONV2 is a valid conversion, the result of the + conversion may be invalid. For example, if ARG3 has type + "volatile X", and X does not have a copy constructor + accepting a "volatile X&", then even if ARG2 can be + converted to X, the conversion will fail. */ + if (error_operand_p (arg2)) + result = error_mark_node; + } + else if (conv3 && (!conv3->bad_p || !conv2)) + { + arg3 = convert_like (conv3, arg3, complain); + arg3 = convert_from_reference (arg3); + arg3_type = TREE_TYPE (arg3); + if (error_operand_p (arg3)) + result = error_mark_node; + } + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + if (result) + return result; + + /* 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 actually 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) + && cp_type_quals (arg2_type) != cp_type_quals (arg3_type)) + arg2_type = arg3_type = + cp_build_qualified_type (arg2_type, + cp_type_quals (arg2_type) + | cp_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; + arg2 = mark_lvalue_use (arg2); + arg3 = mark_lvalue_use (arg3); + goto valid_operands; + } + + /* [expr.cond] + + Otherwise, the result is an rvalue. If the second and third + operand do not have the same type, and either has (possibly + 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]; + conversion *conv; + bool any_viable_p; + + /* Rearrange the arguments so that add_builtin_candidate only has + to know about two args. In build_builtin_candidate, the + arguments are unscrambled. */ + args[0] = arg2; + args[1] = arg3; + args[2] = arg1; + add_builtin_candidates (&candidates, + COND_EXPR, + NOP_EXPR, + ansi_opname (COND_EXPR), + args, + LOOKUP_NORMAL); + + /* [expr.cond] + + If the overload resolution fails, the program is + ill-formed. */ + candidates = splice_viable (candidates, pedantic, &any_viable_p); + if (!any_viable_p) + { + if (complain & tf_error) + { + op_error (COND_EXPR, NOP_EXPR, arg1, arg2, arg3, FALSE); + print_z_candidates (location_of (arg1), candidates); + } + return error_mark_node; + } + cand = tourney (candidates); + if (!cand) + { + if (complain & tf_error) + { + op_error (COND_EXPR, NOP_EXPR, arg1, arg2, arg3, FALSE); + print_z_candidates (location_of (arg1), candidates); + } + return error_mark_node; + } + + /* [expr.cond] + + Otherwise, the conversions thus determined are applied, and + the converted operands are used in place of the original + operands for the remainder of this section. */ + conv = cand->convs[0]; + arg1 = convert_like (conv, arg1, complain); + conv = cand->convs[1]; + arg2 = convert_like (conv, arg2, complain); + arg2_type = TREE_TYPE (arg2); + conv = cand->convs[2]; + arg3 = convert_like (conv, arg3, complain); + arg3_type = TREE_TYPE (arg3); + } + + /* [expr.cond] + + Lvalue-to-rvalue (_conv.lval_), array-to-pointer (_conv.array_), + and function-to-pointer (_conv.func_) standard conversions are + performed on the second and third operands. + + 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 (arg3_type)) + arg3_type = TREE_TYPE (arg3); + + if (arg2 == error_mark_node || arg3 == error_mark_node) + return error_mark_node; + + /* [expr.cond] + + After those conversions, one of the following shall hold: + + --The second and third operands have the same type; the result is of + that type. */ + if (same_type_p (arg2_type, arg3_type)) + result_type = arg2_type; + /* [expr.cond] + + --The second and third operands have arithmetic or enumeration + type; the usual arithmetic conversions are performed to bring + them to a common type, and the result is of that type. */ + else if ((ARITHMETIC_TYPE_P (arg2_type) + || UNSCOPED_ENUM_P (arg2_type)) + && (ARITHMETIC_TYPE_P (arg3_type) + || UNSCOPED_ENUM_P (arg3_type))) + { + /* In this case, there is always a common type. */ + result_type = type_after_usual_arithmetic_conversions (arg2_type, + arg3_type); + do_warn_double_promotion (result_type, arg2_type, arg3_type, + "implicit conversion from %qT to %qT to " + "match other result of conditional", + input_location); + + if (TREE_CODE (arg2_type) == ENUMERAL_TYPE + && TREE_CODE (arg3_type) == ENUMERAL_TYPE) + { + if (complain & tf_warning) + warning (0, + "enumeral mismatch in conditional expression: %qT vs %qT", + arg2_type, arg3_type); + } + else if (extra_warnings + && ((TREE_CODE (arg2_type) == ENUMERAL_TYPE + && !same_type_p (arg3_type, type_promotes_to (arg2_type))) + || (TREE_CODE (arg3_type) == ENUMERAL_TYPE + && !same_type_p (arg2_type, type_promotes_to (arg3_type))))) + { + if (complain & tf_warning) + warning (0, + "enumeral and non-enumeral type in conditional expression"); + } + + arg2 = perform_implicit_conversion (result_type, arg2, complain); + arg3 = perform_implicit_conversion (result_type, arg3, complain); + } + /* [expr.cond] + + --The second and third operands have pointer type, or one has + pointer type and the other is a null pointer constant; pointer + conversions (_conv.ptr_) and qualification conversions + (_conv.qual_) are performed to bring them to their composite + pointer type (_expr.rel_). The result is of the composite + pointer type. + + --The second and third operands have pointer to member type, or + one has pointer to member type and the other is a null pointer + constant; pointer to member conversions (_conv.mem_) and + qualification conversions (_conv.qual_) are performed to bring + them to a common type, whose cv-qualification shall match the + 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, CPO_CONDITIONAL_EXPR, + complain); + if (result_type == error_mark_node) + return error_mark_node; + arg2 = perform_implicit_conversion (result_type, arg2, complain); + arg3 = perform_implicit_conversion (result_type, arg3, complain); + } + + if (!result_type) + { + if (complain & tf_error) + error ("operands to ?: have different types %qT and %qT", + arg2_type, arg3_type); + return error_mark_node; + } + + valid_operands: + result = build3 (COND_EXPR, result_type, arg1, arg2, arg3); + if (!cp_unevaluated_operand) + /* Avoid folding within decltype (c++/42013) and noexcept. */ + result = fold_if_not_in_template (result); + + /* We can't use result_type below, as fold might have returned a + throw_expr. */ + + if (!lvalue_p) + { + /* 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 (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. */ + result = rvalue (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) + { + 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; + if FIRST_ARG is non-null it is the implicit object argument, + otherwise the first element of ARGS is used if needed. 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 first_arg, const VEC(tree,gc) *args, + tree return_type, + tree explicit_targs, bool template_only, + tree conversion_path, tree access_path, + int flags, + struct z_candidate **candidates) +{ + tree ctype; + const VEC(tree,gc) *non_static_args; + bool check_list_ctor; + bool check_converting; + unification_kind_t strict; + tree fn; + + if (!fns) + return; + + /* Precalculate special handling of constructors and conversion ops. */ + fn = OVL_CURRENT (fns); + if (DECL_CONV_FN_P (fn)) + { + check_list_ctor = false; + check_converting = !!(flags & LOOKUP_ONLYCONVERTING); + if (flags & LOOKUP_NO_CONVERSION) + /* We're doing return_type(x). */ + strict = DEDUCE_CONV; + else + /* We're doing x.operator return_type(). */ + strict = DEDUCE_EXACT; + /* [over.match.funcs] For conversion functions, the function + is considered to be a member of the class of the implicit + object argument for the purpose of defining the type of + the implicit object parameter. */ + ctype = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (first_arg))); + } + else + { + if (DECL_CONSTRUCTOR_P (fn)) + { + check_list_ctor = !!(flags & LOOKUP_LIST_ONLY); + check_converting = !!(flags & LOOKUP_ONLYCONVERTING); + } + else + { + check_list_ctor = false; + check_converting = false; + } + strict = DEDUCE_CALL; + ctype = conversion_path ? BINFO_TYPE (conversion_path) : NULL_TREE; + } + + if (first_arg) + non_static_args = args; + else + /* Delay creating the implicit this parameter until it is needed. */ + non_static_args = NULL; + + for (; fns; fns = OVL_NEXT (fns)) + { + tree fn_first_arg; + const VEC(tree,gc) *fn_args; + + fn = OVL_CURRENT (fns); + + if (check_converting && DECL_NONCONVERTING_P (fn)) + continue; + if (check_list_ctor && !is_list_ctor (fn)) + continue; + + /* Figure out which set of arguments to use. */ + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)) + { + /* If this function is a non-static member and we didn't get an + implicit object argument, move it out of args. */ + if (first_arg == NULL_TREE) + { + unsigned int ix; + tree arg; + VEC(tree,gc) *tempvec + = VEC_alloc (tree, gc, VEC_length (tree, args) - 1); + for (ix = 1; VEC_iterate (tree, args, ix, arg); ++ix) + VEC_quick_push (tree, tempvec, arg); + non_static_args = tempvec; + first_arg = build_this (VEC_index (tree, args, 0)); + } + + fn_first_arg = first_arg; + fn_args = non_static_args; + } + else + { + /* Otherwise, just use the list of arguments provided. */ + fn_first_arg = NULL_TREE; + fn_args = args; + } + + if (TREE_CODE (fn) == TEMPLATE_DECL) + add_template_candidate (candidates, + fn, + ctype, + explicit_targs, + fn_first_arg, + fn_args, + return_type, + access_path, + conversion_path, + flags, + strict); + else if (!template_only) + add_function_candidate (candidates, + fn, + ctype, + fn_first_arg, + fn_args, + access_path, + conversion_path, + flags); + } +} + +/* Even unsigned enum types promote to signed int. We don't want to + issue -Wsign-compare warnings for this case. Here ORIG_ARG is the + original argument and ARG is the argument after any conversions + have been applied. We set TREE_NO_WARNING if we have added a cast + from an unsigned enum type to a signed integer type. */ + +static void +avoid_sign_compare_warnings (tree orig_arg, tree arg) +{ + if (orig_arg != NULL_TREE + && arg != NULL_TREE + && orig_arg != arg + && TREE_CODE (TREE_TYPE (orig_arg)) == ENUMERAL_TYPE + && TYPE_UNSIGNED (TREE_TYPE (orig_arg)) + && INTEGRAL_TYPE_P (TREE_TYPE (arg)) + && !TYPE_UNSIGNED (TREE_TYPE (arg))) + TREE_NO_WARNING (arg) = 1; +} + +tree +build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, + bool *overloaded_p, tsubst_flags_t complain) +{ + tree orig_arg1 = arg1; + tree orig_arg2 = arg2; + tree orig_arg3 = arg3; + struct z_candidate *candidates = 0, *cand; + VEC(tree,gc) *arglist; + tree fnname; + tree args[3]; + tree result = NULL_TREE; + bool result_valid_p = false; + enum tree_code code2 = NOP_EXPR; + enum tree_code code_orig_arg1 = ERROR_MARK; + enum tree_code code_orig_arg2 = ERROR_MARK; + conversion *conv; + void *p; + 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); + arg3 = NULL_TREE; + fnname = ansi_assopname (code2); + } + else + fnname = ansi_opname (code); + + arg1 = prep_operand (arg1); + + switch (code) + { + case NEW_EXPR: + case VEC_NEW_EXPR: + case VEC_DELETE_EXPR: + case DELETE_EXPR: + /* Use build_op_new_call and build_op_delete_call instead. */ + gcc_unreachable (); + + case CALL_EXPR: + /* Use build_op_call instead. */ + gcc_unreachable (); + + case TRUTH_ORIF_EXPR: + case TRUTH_ANDIF_EXPR: + case TRUTH_AND_EXPR: + case TRUTH_OR_EXPR: + /* These are saved for the sake of warn_logical_operator. */ + code_orig_arg1 = TREE_CODE (arg1); + code_orig_arg2 = TREE_CODE (arg2); + + default: + break; + } + + arg2 = prep_operand (arg2); + arg3 = prep_operand (arg3); + + if (code == COND_EXPR) + /* Use build_conditional_expr instead. */ + gcc_unreachable (); + else if (! IS_OVERLOAD_TYPE (TREE_TYPE (arg1)) + && (! arg2 || ! IS_OVERLOAD_TYPE (TREE_TYPE (arg2)))) + goto builtin; + + if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) + arg2 = integer_zero_node; + + arglist = VEC_alloc (tree, gc, 3); + VEC_quick_push (tree, arglist, arg1); + if (arg2 != NULL_TREE) + VEC_quick_push (tree, arglist, arg2); + if (arg3 != NULL_TREE) + VEC_quick_push (tree, arglist, arg3); + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + /* Add namespace-scope operators to the list of functions to + consider. */ + add_candidates (lookup_function_nonclass (fnname, arglist, /*block_p=*/true), + NULL_TREE, arglist, NULL_TREE, + 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 (TREE_TYPE (arg1), fnname, 1); + if (fns == error_mark_node) + { + result = error_mark_node; + goto user_defined_result_ready; + } + if (fns) + add_candidates (BASELINK_FUNCTIONS (fns), + NULL_TREE, arglist, NULL_TREE, + NULL_TREE, false, + BASELINK_BINFO (fns), + BASELINK_ACCESS_BINFO (fns), + flags, &candidates); + } + + args[0] = arg1; + args[1] = arg2; + args[2] = NULL_TREE; + + add_builtin_candidates (&candidates, code, code2, fnname, args, flags); + + switch (code) + { + case COMPOUND_EXPR: + case ADDR_EXPR: + /* For these, the built-in candidates set is empty + [over.match.oper]/3. We don't want non-strict matches + because exact matches are always possible with built-in + 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) + { + case POSTINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + /* Don't try anything fancy if we're not allowed to produce + errors. */ + if (!(complain & tf_error)) + return error_mark_node; + + /* Look for an `operator++ (int)'. Pre-1985 C++ didn't + distinguish between prefix and postfix ++ and + operator++() was used for both, so we allow this with + -fpermissive. */ + if (flags & LOOKUP_COMPLAIN) + { + const char *msg = (flag_permissive) + ? G_("no %<%D(int)%> declared for postfix %qs," + " trying prefix operator instead") + : G_("no %<%D(int)%> declared for postfix %qs"); + permerror (input_location, msg, fnname, + operator_name_info[code].name); + } + + if (!flag_permissive) + return error_mark_node; + + if (code == POSTINCREMENT_EXPR) + code = PREINCREMENT_EXPR; + else + code = PREDECREMENT_EXPR; + result = build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE, + overloaded_p, complain); + break; + + /* The caller will deal with these. */ + case ADDR_EXPR: + case COMPOUND_EXPR: + case COMPONENT_REF: + result = NULL_TREE; + result_valid_p = true; + break; + + default: + if ((flags & LOOKUP_COMPLAIN) && (complain & tf_error)) + { + /* If one of the arguments of the operator represents + an invalid use of member function pointer, try to report + a meaningful error ... */ + if (invalid_nonstatic_memfn_p (arg1, tf_error) + || invalid_nonstatic_memfn_p (arg2, tf_error) + || invalid_nonstatic_memfn_p (arg3, tf_error)) + /* We displayed the error message. */; + else + { + /* ... Otherwise, report the more generic + "no matching operator found" error */ + op_error (code, code2, arg1, arg2, arg3, FALSE); + print_z_candidates (input_location, candidates); + } + } + result = error_mark_node; + break; + } + } + else + { + cand = tourney (candidates); + if (cand == 0) + { + if ((flags & LOOKUP_COMPLAIN) && (complain & tf_error)) + { + op_error (code, code2, arg1, arg2, arg3, TRUE); + print_z_candidates (input_location, candidates); + } + result = error_mark_node; + } + else if (TREE_CODE (cand->fn) == FUNCTION_DECL) + { + if (overloaded_p) + *overloaded_p = true; + + if (resolve_args (arglist) == NULL) + result = error_mark_node; + else + result = build_over_call (cand, LOOKUP_NORMAL, complain); + } + else + { + /* Give any warnings we noticed during overload resolution. */ + if (cand->warnings && (complain & tf_warning)) + { + struct candidate_warning *w; + for (w = cand->warnings; w; w = w->next) + joust (cand, w->loser, 1); + } + + /* Check for comparison of different enum types. */ + switch (code) + { + case GT_EXPR: + case LT_EXPR: + case GE_EXPR: + case LE_EXPR: + case EQ_EXPR: + case NE_EXPR: + if (TREE_CODE (TREE_TYPE (arg1)) == ENUMERAL_TYPE + && TREE_CODE (TREE_TYPE (arg2)) == ENUMERAL_TYPE + && (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) + != TYPE_MAIN_VARIANT (TREE_TYPE (arg2))) + && (complain & tf_warning)) + { + warning (OPT_Wenum_compare, + "comparison between %q#T and %q#T", + TREE_TYPE (arg1), TREE_TYPE (arg2)); + } + break; + default: + break; + } + + /* We need to strip any leading REF_BIND so that bitfields + don't cause errors. This should not remove any important + conversions, because builtins don't apply to class + objects directly. */ + conv = cand->convs[0]; + if (conv->kind == ck_ref_bind) + conv = conv->u.next; + arg1 = convert_like (conv, arg1, complain); + + if (arg2) + { + /* We need to call warn_logical_operator before + converting arg2 to a boolean_type. */ + if (complain & tf_warning) + warn_logical_operator (input_location, code, boolean_type_node, + code_orig_arg1, arg1, + code_orig_arg2, arg2); + + conv = cand->convs[1]; + if (conv->kind == ck_ref_bind) + conv = conv->u.next; + arg2 = convert_like (conv, arg2, complain); + } + if (arg3) + { + conv = cand->convs[2]; + if (conv->kind == ck_ref_bind) + conv = conv->u.next; + arg3 = convert_like (conv, arg3, complain); + } + + } + } + + user_defined_result_ready: + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + if (result || result_valid_p) + return result; + + builtin: + avoid_sign_compare_warnings (orig_arg1, arg1); + avoid_sign_compare_warnings (orig_arg2, arg2); + avoid_sign_compare_warnings (orig_arg3, arg3); + + switch (code) + { + case MODIFY_EXPR: + return cp_build_modify_expr (arg1, code2, arg2, complain); + + case INDIRECT_REF: + return cp_build_indirect_ref (arg1, RO_UNARY_STAR, complain); + + case TRUTH_ANDIF_EXPR: + case TRUTH_ORIF_EXPR: + case TRUTH_AND_EXPR: + case TRUTH_OR_EXPR: + warn_logical_operator (input_location, code, boolean_type_node, + code_orig_arg1, arg1, code_orig_arg2, arg2); + /* Fall through. */ + case PLUS_EXPR: + case MINUS_EXPR: + case MULT_EXPR: + case TRUNC_DIV_EXPR: + case GT_EXPR: + case LT_EXPR: + case GE_EXPR: + case LE_EXPR: + case EQ_EXPR: + case NE_EXPR: + case MAX_EXPR: + case MIN_EXPR: + case LSHIFT_EXPR: + case RSHIFT_EXPR: + case TRUNC_MOD_EXPR: + case BIT_AND_EXPR: + case BIT_IOR_EXPR: + case BIT_XOR_EXPR: + return cp_build_binary_op (input_location, code, arg1, arg2, complain); + + case UNARY_PLUS_EXPR: + case NEGATE_EXPR: + case BIT_NOT_EXPR: + case TRUTH_NOT_EXPR: + case PREINCREMENT_EXPR: + case POSTINCREMENT_EXPR: + case PREDECREMENT_EXPR: + case POSTDECREMENT_EXPR: + case REALPART_EXPR: + case IMAGPART_EXPR: + case ABS_EXPR: + return cp_build_unary_op (code, arg1, candidates != 0, complain); + + case ARRAY_REF: + return cp_build_array_ref (input_location, arg1, arg2, complain); + + case MEMBER_REF: + return build_m_component_ref (cp_build_indirect_ref (arg1, RO_NULL, + complain), + arg2); + + /* The caller will deal with these. */ + case ADDR_EXPR: + case COMPONENT_REF: + case COMPOUND_EXPR: + return NULL_TREE; + + default: + gcc_unreachable (); + } + return NULL_TREE; +} + +/* Returns true iff T, an element of an OVERLOAD chain, is a usual + deallocation function (3.7.4.2 [basic.stc.dynamic.deallocation]). */ + +static bool +non_placement_deallocation_fn_p (tree t) +{ + /* A template instance is never a usual deallocation function, + regardless of its signature. */ + if (TREE_CODE (t) == TEMPLATE_DECL + || primary_template_instantiation_p (t)) + return false; + + /* If a class T has a member deallocation function named operator delete + with exactly one parameter, then that function is a usual + (non-placement) deallocation function. If class T does not declare + such an operator delete but does declare a member deallocation + function named operator delete with exactly two parameters, the second + of which has type std::size_t (18.2), then this function is a usual + deallocation function. */ + t = FUNCTION_ARG_CHAIN (t); + if (t == void_list_node + || (t && same_type_p (TREE_VALUE (t), size_type_node) + && TREE_CHAIN (t) == void_list_node)) + return true; + return false; +} + +/* Build a call to operator delete. This has to be handled very specially, + because the restrictions on what signatures match are different from all + other call instances. For a normal delete, only a delete taking (void *) + or (void *, size_t) is accepted. For a placement delete, only an exact + match with the placement new is accepted. + + CODE is either DELETE_EXPR or VEC_DELETE_EXPR. + ADDR is the pointer to be deleted. + SIZE is the size of the memory block to be deleted. + GLOBAL_P is true if the delete-expression should not consider + class-specific delete operators. + PLACEMENT is the corresponding placement new call, or NULL_TREE. + + If this call to "operator delete" is being generated as part to + deallocate memory allocated via a new-expression (as per [expr.new] + which requires that if the initialization throws an exception then + we call a deallocation function), then ALLOC_FN is the allocation + function. */ + +tree +build_op_delete_call (enum tree_code code, tree addr, tree size, + bool global_p, tree placement, + tree alloc_fn) +{ + tree fn = NULL_TREE; + tree fns, fnname, type, t; + + if (addr == error_mark_node) + return error_mark_node; + + type = strip_array_types (TREE_TYPE (TREE_TYPE (addr))); + + fnname = ansi_opname (code); + + if (CLASS_TYPE_P (type) + && COMPLETE_TYPE_P (complete_type (type)) + && !global_p) + /* In [class.free] + + If the result of the lookup is ambiguous or inaccessible, or if + 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) + return error_mark_node; + } + else + fns = NULL_TREE; + + if (fns == NULL_TREE) + fns = lookup_name_nonclass (fnname); + + /* Strip const and volatile from addr. */ + addr = cp_convert (ptr_type_node, addr); + + if (placement) + { + /* "A declaration of a placement deallocation function matches the + declaration of a placement allocation function if it has the same + number of parameters and, after parameter transformations (8.3.5), + all parameter types except the first are identical." + + So we build up the function type we want and ask instantiate_type + to get it for us. */ + t = FUNCTION_ARG_CHAIN (alloc_fn); + t = tree_cons (NULL_TREE, ptr_type_node, t); + t = build_function_type (void_type_node, t); + + fn = instantiate_type (t, fns, tf_none); + if (fn == error_mark_node) + return NULL_TREE; + + if (BASELINK_P (fn)) + fn = BASELINK_FUNCTIONS (fn); + + /* "If the lookup finds the two-parameter form of a usual deallocation + function (3.7.4.2) and that function, considered as a placement + deallocation function, would have been selected as a match for the + allocation function, the program is ill-formed." */ + if (non_placement_deallocation_fn_p (fn)) + { + /* But if the class has an operator delete (void *), then that is + the usual deallocation function, so we shouldn't complain + about using the operator delete (void *, size_t). */ + for (t = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns; + t; t = OVL_NEXT (t)) + { + tree elt = OVL_CURRENT (t); + if (non_placement_deallocation_fn_p (elt) + && FUNCTION_ARG_CHAIN (elt) == void_list_node) + goto ok; + } + permerror (0, "non-placement deallocation function %q+D", fn); + permerror (input_location, "selected for placement delete"); + ok:; + } + } + else + /* "Any non-placement deallocation function matches a non-placement + allocation function. If the lookup finds a single matching + deallocation function, that function will be called; otherwise, no + deallocation function will be called." */ + for (t = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns; + t; t = OVL_NEXT (t)) + { + tree elt = OVL_CURRENT (t); + if (non_placement_deallocation_fn_p (elt)) + { + fn = elt; + /* "If a class T has a member deallocation function named + operator delete with exactly one parameter, then that + function is a usual (non-placement) deallocation + function. If class T does not declare such an operator + delete but does declare a member deallocation function named + operator delete with exactly two parameters, the second of + which has type std::size_t (18.2), then this function is a + usual deallocation function." + + So (void*) beats (void*, size_t). */ + if (FUNCTION_ARG_CHAIN (fn) == void_list_node) + break; + } + } + + /* If we have a matching function, call it. */ + if (fn) + { + gcc_assert (TREE_CODE (fn) == FUNCTION_DECL); + + /* If the FN is a member function, make sure that it is + accessible. */ + if (BASELINK_P (fns)) + perform_or_defer_access_check (BASELINK_BINFO (fns), fn, fn); + + /* Core issue 901: It's ok to new a type with deleted delete. */ + if (DECL_DELETED_FN (fn) && alloc_fn) + return NULL_TREE; + + if (placement) + { + /* The placement args might not be suitable for overload + resolution at this point, so build the call directly. */ + int nargs = call_expr_nargs (placement); + tree *argarray = XALLOCAVEC (tree, nargs); + int i; + argarray[0] = addr; + for (i = 1; i < nargs; i++) + argarray[i] = CALL_EXPR_ARG (placement, i); + mark_used (fn); + return build_cxx_call (fn, nargs, argarray); + } + else + { + tree ret; + VEC(tree,gc) *args = VEC_alloc (tree, gc, 2); + VEC_quick_push (tree, args, addr); + if (FUNCTION_ARG_CHAIN (fn) != void_list_node) + VEC_quick_push (tree, args, size); + ret = cp_build_function_call_vec (fn, &args, tf_warning_or_error); + VEC_free (tree, gc, args); + return ret; + } + } + + /* [expr.new] + + If no unambiguous matching deallocation function can be found, + propagating the exception does not cause the object's memory to + be freed. */ + if (alloc_fn) + { + if (!placement) + warning (0, "no corresponding deallocation function for %qD", + alloc_fn); + return NULL_TREE; + } + + error ("no suitable % for %qT", + operator_name_info[(int)code].name, type); + return error_mark_node; +} + +/* If the current scope isn't allowed to access DECL along + BASETYPE_PATH, give an error. The most derived class in + BASETYPE_PATH is the one used to qualify DECL. DIAG_DECL is + the declaration to use in the error diagnostic. */ + +bool +enforce_access (tree basetype_path, tree decl, tree diag_decl) +{ + gcc_assert (TREE_CODE (basetype_path) == TREE_BINFO); + + if (!accessible_p (basetype_path, decl, true)) + { + if (TREE_PRIVATE (decl)) + error ("%q+#D is private", diag_decl); + else if (TREE_PROTECTED (decl)) + error ("%q+#D is protected", diag_decl); + else + error ("%q+#D is inaccessible", diag_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, + diagnostic_t *diagnostic_kind, tsubst_flags_t complain) +{ + int savew, savee; + VEC(tree,gc) *args; + + savew = warningcount, savee = errorcount; + args = make_tree_vector_single (expr); + expr = build_special_member_call (NULL_TREE, complete_ctor_identifier, + &args, type, flags, complain); + release_tree_vector (args); + if (warningcount > savew) + *diagnostic_kind = DK_WARNING; + else if (errorcount > savee) + *diagnostic_kind = DK_ERROR; + else + *diagnostic_kind = DK_UNSPECIFIED; + return expr; +} + +/* Perform warnings about peculiar, but valid, conversions from/to NULL. + EXPR is implicitly converted to type TOTYPE. + FN and ARGNUM are used for diagnostics. */ + +static void +conversion_null_warnings (tree totype, tree expr, tree fn, int argnum) +{ + tree t = non_reference (totype); + + /* Issue warnings about peculiar, but valid, uses of NULL. */ + if (expr == null_node && TREE_CODE (t) != BOOLEAN_TYPE && ARITHMETIC_TYPE_P (t)) + { + if (fn) + warning_at (input_location, OPT_Wconversion_null, + "passing NULL to non-pointer argument %P of %qD", + argnum, fn); + else + warning_at (input_location, OPT_Wconversion_null, + "converting to non-pointer type %qT from NULL", t); + } + + /* Issue warnings if "false" is converted to a NULL pointer */ + else if (expr == boolean_false_node && fn && POINTER_TYPE_P (t)) + warning_at (input_location, OPT_Wconversion_null, + "converting % to pointer type for argument %P of %qD", + argnum, fn); +} + +/* 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 + being called to continue a conversion chain. It is negative when a + reference binding will be applied, positive otherwise. If + ISSUE_CONVERSION_WARNINGS is true, warnings about suspicious + conversions will be emitted if appropriate. If C_CAST_P is true, + this conversion is coming from a C-style cast; in that case, + conversions to inaccessible bases are permitted. */ + +static tree +convert_like_real (conversion *convs, tree expr, tree fn, int argnum, + int inner, bool issue_conversion_warnings, + bool c_cast_p, tsubst_flags_t complain) +{ + tree totype = convs->type; + diagnostic_t diag_kind; + int flags; + + if (convs->bad_p && !(complain & tf_error)) + return error_mark_node; + + if (convs->bad_p + && convs->kind != ck_user + && convs->kind != ck_list + && convs->kind != ck_ambig + && convs->kind != ck_ref_bind + && convs->kind != ck_rvalue + && convs->kind != ck_base) + { + conversion *t = convs; + + /* Give a helpful error if this is bad because of excess braces. */ + if (BRACE_ENCLOSED_INITIALIZER_P (expr) + && SCALAR_TYPE_P (totype) + && CONSTRUCTOR_NELTS (expr) > 0 + && BRACE_ENCLOSED_INITIALIZER_P (CONSTRUCTOR_ELT (expr, 0)->value)) + permerror (input_location, "too many braces around initializer for %qT", totype); + + for (; t; t = convs->u.next) + { + if (t->kind == ck_user || !t->bad_p) + { + expr = convert_like_real (t, expr, fn, argnum, 1, + /*issue_conversion_warnings=*/false, + /*c_cast_p=*/false, + complain); + break; + } + else if (t->kind == ck_ambig) + return convert_like_real (t, expr, fn, argnum, 1, + /*issue_conversion_warnings=*/false, + /*c_cast_p=*/false, + complain); + else if (t->kind == ck_identity) + break; + } + + permerror (input_location, "invalid conversion from %qT to %qT", + TREE_TYPE (expr), totype); + if (fn) + permerror (DECL_SOURCE_LOCATION (fn), + " initializing argument %P of %qD", argnum, fn); + + return cp_convert (totype, expr); + } + + if (issue_conversion_warnings && (complain & tf_warning)) + conversion_null_warnings (totype, expr, fn, argnum); + + switch (convs->kind) + { + case ck_user: + { + struct z_candidate *cand = convs->cand; + tree convfn = cand->fn; + unsigned i; + + expr = mark_rvalue_use (expr); + + /* When converting from an init list we consider explicit + constructors, but actually trying to call one is an error. */ + if (DECL_NONCONVERTING_P (convfn) && DECL_CONSTRUCTOR_P (convfn) + /* Unless we're calling it for value-initialization from an + empty list, since that is handled separately in 8.5.4. */ + && cand->num_convs > 0) + { + if (complain & tf_error) + error ("converting to %qT from initializer list would use " + "explicit constructor %qD", totype, convfn); + else + return error_mark_node; + } + + /* Set user_conv_p on the argument conversions, so rvalue/base + handling knows not to allow any more UDCs. */ + for (i = 0; i < cand->num_convs; ++i) + cand->convs[i]->user_conv_p = true; + + expr = build_over_call (cand, LOOKUP_NORMAL, complain); + + /* If this is a constructor or a function returning an aggr type, + we need to build up a TARGET_EXPR. */ + if (DECL_CONSTRUCTOR_P (convfn)) + { + expr = build_cplus_new (totype, expr); + + /* Remember that this was list-initialization. */ + if (convs->check_narrowing) + TARGET_EXPR_LIST_INIT_P (expr) = true; + } + + return expr; + } + case ck_identity: + expr = mark_rvalue_use (expr); + if (BRACE_ENCLOSED_INITIALIZER_P (expr)) + { + int nelts = CONSTRUCTOR_NELTS (expr); + if (nelts == 0) + expr = build_value_init (totype, tf_warning_or_error); + else if (nelts == 1) + expr = CONSTRUCTOR_ELT (expr, 0)->value; + else + gcc_unreachable (); + } + + if (type_unknown_p (expr)) + expr = instantiate_type (totype, expr, complain); + /* Convert a constant 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) + { + expr = decl_constant_value (expr); + if (expr == null_node && INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (totype)) + /* If __null has been converted to an integer type, we do not + want to warn about uses of EXPR as an integer, rather than + as a pointer. */ + expr = build_int_cst (totype, 0); + } + return expr; + case ck_ambig: + if (complain & tf_error) + { + /* Call build_user_type_conversion again for the error. */ + build_user_type_conversion (totype, convs->u.expr, LOOKUP_NORMAL); + if (fn) + error (" initializing argument %P of %q+D", argnum, fn); + } + return error_mark_node; + + case ck_list: + { + /* Conversion to std::initializer_list. */ + tree elttype = TREE_VEC_ELT (CLASSTYPE_TI_ARGS (totype), 0); + tree new_ctor = build_constructor (init_list_type_node, NULL); + unsigned len = CONSTRUCTOR_NELTS (expr); + tree array, val; + VEC(tree,gc) *parms; + unsigned ix; + + /* Convert all the elements. */ + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (expr), ix, val) + { + tree sub = convert_like_real (convs->u.list[ix], val, fn, argnum, + 1, false, false, complain); + if (sub == error_mark_node) + return sub; + if (!BRACE_ENCLOSED_INITIALIZER_P (val)) + check_narrowing (TREE_TYPE (sub), val); + CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (new_ctor), NULL_TREE, sub); + if (!TREE_CONSTANT (sub)) + TREE_CONSTANT (new_ctor) = false; + } + /* Build up the array. */ + elttype = cp_build_qualified_type + (elttype, cp_type_quals (elttype) | TYPE_QUAL_CONST); + array = build_array_of_n_type (elttype, len); + array = finish_compound_literal (array, new_ctor); + + parms = make_tree_vector (); + VEC_safe_push (tree, gc, parms, decay_conversion (array)); + VEC_safe_push (tree, gc, parms, size_int (len)); + /* Call the private constructor. */ + push_deferring_access_checks (dk_no_check); + new_ctor = build_special_member_call + (NULL_TREE, complete_ctor_identifier, &parms, totype, 0, complain); + release_tree_vector (parms); + pop_deferring_access_checks (); + return build_cplus_new (totype, new_ctor); + } + + case ck_aggr: + return get_target_expr (digest_init (totype, expr)); + + default: + break; + }; + + expr = convert_like_real (convs->u.next, expr, fn, argnum, + convs->kind == ck_ref_bind ? -1 : 1, + convs->kind == ck_ref_bind ? issue_conversion_warnings : false, + c_cast_p, + complain); + if (expr == error_mark_node) + return error_mark_node; + + switch (convs->kind) + { + case ck_rvalue: + expr = decay_conversion (expr); + if (! MAYBE_CLASS_TYPE_P (totype)) + return expr; + /* Else fall through. */ + case ck_base: + if (convs->kind == ck_base && !convs->need_temporary_p) + { + /* We are going to bind a reference directly to a base-class + subobject of EXPR. */ + /* Build an expression for `*((base*) &expr)'. */ + expr = cp_build_addr_expr (expr, complain); + expr = convert_to_base (expr, build_pointer_type (totype), + !c_cast_p, /*nonnull=*/true, complain); + expr = cp_build_indirect_ref (expr, RO_IMPLICIT_CONVERSION, complain); + return expr; + } + + /* 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] */ + flags = LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING; + if (convs->user_conv_p) + /* This conversion is being done in the context of a user-defined + conversion (i.e. the second step of copy-initialization), so + don't allow any more. */ + flags |= LOOKUP_NO_CONVERSION; + if (convs->rvaluedness_matches_p) + flags |= LOOKUP_PREFER_RVALUE; + if (TREE_CODE (expr) == TARGET_EXPR + && TARGET_EXPR_LIST_INIT_P (expr)) + /* Copy-list-initialization doesn't actually involve a copy. */ + return expr; + expr = build_temp (expr, totype, flags, &diag_kind, complain); + if (diag_kind && fn) + { + if ((complain & tf_error)) + emit_diagnostic (diag_kind, DECL_SOURCE_LOCATION (fn), 0, + " initializing argument %P of %qD", argnum, fn); + else if (diag_kind == DK_ERROR) + return error_mark_node; + } + return build_cplus_new (totype, expr); + + case ck_ref_bind: + { + tree ref_type = totype; + + if (convs->bad_p && TYPE_REF_IS_RVALUE (ref_type) + && real_lvalue_p (expr)) + { + if (complain & tf_error) + { + error ("cannot bind %qT lvalue to %qT", + TREE_TYPE (expr), totype); + if (fn) + error (" initializing argument %P of %q+D", argnum, fn); + } + return error_mark_node; + } + + /* If necessary, create a temporary. + + VA_ARG_EXPR and CONSTRUCTOR expressions are special cases + that need temporaries, even when their types are reference + compatible with the type of reference being bound, so the + upcoming call to cp_build_addr_expr doesn't fail. */ + if (convs->need_temporary_p + || TREE_CODE (expr) == CONSTRUCTOR + || TREE_CODE (expr) == VA_ARG_EXPR) + { + /* Otherwise, a temporary of type "cv1 T1" is created and + initialized from the initializer expression using the rules + for a non-reference copy-initialization (8.5). */ + + tree type = TREE_TYPE (ref_type); + cp_lvalue_kind lvalue = real_lvalue_p (expr); + + gcc_assert (same_type_ignoring_top_level_qualifiers_p + (type, convs->u.next->type)); + if (!CP_TYPE_CONST_NON_VOLATILE_P (type) + && !TYPE_REF_IS_RVALUE (ref_type)) + { + if (complain & tf_error) + { + /* If the reference is volatile or non-const, we + cannot create a temporary. */ + if (lvalue & clk_bitfield) + error ("cannot bind bitfield %qE to %qT", + expr, ref_type); + else if (lvalue & clk_packed) + error ("cannot bind packed field %qE to %qT", + expr, ref_type); + else + error ("cannot bind rvalue %qE to %qT", expr, ref_type); + } + return error_mark_node; + } + /* If the source is a packed field, and we must use a copy + constructor, then building the target expr will require + binding the field to the reference parameter to the + copy constructor, and we'll end up with an infinite + loop. If we can use a bitwise copy, then we'll be + OK. */ + if ((lvalue & clk_packed) + && CLASS_TYPE_P (type) + && type_has_nontrivial_copy_init (type)) + { + if (complain & tf_error) + error ("cannot bind packed field %qE to %qT", + expr, ref_type); + return error_mark_node; + } + if (lvalue & clk_bitfield) + { + expr = convert_bitfield_to_declared_type (expr); + expr = fold_convert (type, expr); + } + expr = build_target_expr_with_type (expr, type); + } + + /* Take the address of the thing to which we will bind the + reference. */ + expr = cp_build_addr_expr (expr, complain); + if (expr == error_mark_node) + return error_mark_node; + + /* Convert it to a pointer to the type referred to by the + reference. This will adjust the pointer if a derived to + base conversion is being performed. */ + expr = cp_convert (build_pointer_type (TREE_TYPE (ref_type)), + expr); + /* Convert the pointer to the desired reference type. */ + return build_nop (ref_type, expr); + } + + case ck_lvalue: + return decay_conversion (expr); + + case ck_qual: + /* Warn about deprecated conversion if appropriate. */ + string_conv_p (totype, expr, 1); + break; + + case ck_ptr: + if (convs->base_p) + expr = convert_to_base (expr, totype, !c_cast_p, + /*nonnull=*/false, complain); + return build_nop (totype, expr); + + case ck_pmem: + return convert_ptrmem (totype, expr, /*allow_inverse_p=*/false, + c_cast_p, complain); + + default: + break; + } + + if (convs->check_narrowing) + check_narrowing (totype, expr); + + if (issue_conversion_warnings && (complain & tf_warning)) + expr = convert_and_check (totype, expr); + else + expr = convert (totype, expr); + + return expr; +} + +/* ARG is being passed to a varargs function. Perform any conversions + required. Return the converted value. */ + +tree +convert_arg_to_ellipsis (tree arg) +{ + tree arg_type; + + /* [expr.call] + + The lvalue-to-rvalue, array-to-pointer, and function-to-pointer + standard conversions are performed. */ + arg = decay_conversion (arg); + arg_type = TREE_TYPE (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 (arg_type) == REAL_TYPE + && (TYPE_PRECISION (arg_type) + < TYPE_PRECISION (double_type_node)) + && !DECIMAL_FLOAT_MODE_P (TYPE_MODE (arg_type))) + { + if (warn_double_promotion && !c_inhibit_evaluation_warnings) + warning (OPT_Wdouble_promotion, + "implicit conversion from %qT to %qT when passing " + "argument to function", + arg_type, double_type_node); + arg = convert_to_real (double_type_node, arg); + } + else if (NULLPTR_TYPE_P (arg_type)) + arg = null_pointer_node; + else if (INTEGRAL_OR_ENUMERATION_TYPE_P (arg_type)) + { + if (SCOPED_ENUM_P (arg_type) && !abi_version_at_least (6)) + { + warning (OPT_Wabi, "scoped enum %qT will not promote to an " + "integral type in a future version of GCC", arg_type); + arg = cp_convert (ENUM_UNDERLYING_TYPE (arg_type), arg); + } + arg = perform_integral_promotions (arg); + } + + arg = require_complete_type (arg); + arg_type = TREE_TYPE (arg); + + if (arg != error_mark_node + /* In a template (or ill-formed code), we can have an incomplete type + even after require_complete_type, in which case we don't know + whether it has trivial copy or not. */ + && COMPLETE_TYPE_P (arg_type) + && (type_has_nontrivial_copy_init (arg_type) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (arg_type))) + { + /* [expr.call] 5.2.2/7: + Passing a potentially-evaluated argument of class type (Clause 9) + with a non-trivial copy constructor or a non-trivial destructor + with no corresponding parameter is conditionally-supported, with + implementation-defined semantics. + + 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, + it is not potentially-evaluated. */ + if (cp_unevaluated_operand == 0) + error ("cannot pass objects of non-trivially-copyable " + "type %q#T through %<...%>", arg_type); + } + + return arg; +} + +/* 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); + + type = complete_type_or_else (type, NULL_TREE); + + if (expr == error_mark_node || !type) + return error_mark_node; + + expr = mark_lvalue_use (expr); + + if (type_has_nontrivial_copy_init (type) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) + || TREE_CODE (type) == REFERENCE_TYPE) + { + /* Remove reference types so we don't ICE later on. */ + tree type1 = non_reference (type); + /* conditionally-supported behavior [expr.call] 5.2.2/7. */ + error ("cannot receive objects of non-trivially-copyable type %q#T " + "through %<...%>; ", type); + expr = convert (build_pointer_type (type1), null_node); + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); + return expr; + } + + return build_va_arg (input_location, expr, type); +} + +/* TYPE has been given to va_arg. Apply the default conversions which + would have happened when passed via ellipsis. Return the promoted + 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)) + promote = type; + + return promote; +} + +/* ARG is a default argument expression being passed to a parameter of + the indicated TYPE, which is a parameter to FN. Do any required + conversions. Return the converted value. */ + +static GTY(()) VEC(tree,gc) *default_arg_context; + +tree +convert_default_arg (tree type, tree arg, tree fn, int parmnum) +{ + int i; + tree t; + + /* 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 %qD has " + "not yet been parsed", + parmnum, fn); + return error_mark_node; + } + + /* Detect recursion. */ + FOR_EACH_VEC_ELT (tree, default_arg_context, i, t) + if (t == fn) + { + error ("recursive evaluation of default argument for %q#D", fn); + return error_mark_node; + } + VEC_safe_push (tree, gc, default_arg_context, fn); + + if (fn && DECL_TEMPLATE_INFO (fn)) + arg = tsubst_default_argument (fn, type, arg); + + /* Due to: + + [dcl.fct.default] + + The names in the expression are bound, and the semantic + constraints are checked, at the point where the default + expressions appears. + + we must not perform access checks here. */ + push_deferring_access_checks (dk_no_check); + arg = break_out_target_exprs (arg); + if (TREE_CODE (arg) == CONSTRUCTOR) + { + arg = digest_init (type, arg); + arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL, + ICR_DEFAULT_ARGUMENT, fn, parmnum, + tf_warning_or_error); + } + else + { + /* We must make a copy of ARG, in case subsequent processing + alters any part of it. For example, during gimplification a + cast of the form (T) &X::f (where "f" is a member function) + will lead to replacing the PTRMEM_CST for &X::f with a + VAR_DECL. We can avoid the copy for constants, since they + are never modified in place. */ + if (!CONSTANT_CLASS_P (arg)) + arg = unshare_expr (arg); + arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL, + ICR_DEFAULT_ARGUMENT, fn, parmnum, + tf_warning_or_error); + arg = convert_for_arg_passing (type, arg); + } + pop_deferring_access_checks(); + + VEC_pop (tree, default_arg_context); + + return arg; +} + +/* Returns the type which will really be used for passing an argument of + 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); + /* There are no other pointers to this temporary. */ + type = cp_build_qualified_type (type, TYPE_QUAL_RESTRICT); + } + else if (targetm.calls.promote_prototypes (type) + && 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; +} + +/* Actually perform the appropriate conversion. */ + +tree +convert_for_arg_passing (tree type, tree val) +{ + tree bitfield_type; + + /* If VAL is a bitfield, then -- since it has already been converted + to TYPE -- it cannot have a precision greater than TYPE. + + If it has a smaller precision, we must widen it here. For + example, passing "int f:3;" to a function expecting an "int" will + not result in any conversion before this point. + + If the precision is the same we must not risk widening. For + example, the COMPONENT_REF for a 32-bit "long long" bitfield will + often have type "int", even though the C++ type for the field is + "long long". If the value is being passed to a function + expecting an "int", then no conversions will be required. But, + if we call convert_bitfield_to_declared_type, the bitfield will + be converted to "long long". */ + bitfield_type = is_bitfield_expr_with_lowered_type (val); + if (bitfield_type + && TYPE_PRECISION (TREE_TYPE (val)) < TYPE_PRECISION (type)) + val = convert_to_integer (TYPE_MAIN_VARIANT (bitfield_type), val); + + if (val == error_mark_node) + ; + /* Pass classes with copy ctors by invisible reference. */ + else if (TREE_ADDRESSABLE (type)) + val = build1 (ADDR_EXPR, build_reference_type (type), val); + else if (targetm.calls.promote_prototypes (type) + && 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); + if (warn_missing_format_attribute) + { + tree rhstype = TREE_TYPE (val); + const enum tree_code coder = TREE_CODE (rhstype); + const enum tree_code codel = TREE_CODE (type); + if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE) + && coder == codel + && check_missing_format_attribute (type, rhstype)) + warning (OPT_Wmissing_format_attribute, + "argument of function call might be a candidate for a format attribute"); + } + 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_VA_START: + return true; + + default:; + return lookup_attribute ("type generic", + TYPE_ATTRIBUTES (TREE_TYPE (fn))) != 0; + } + + 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, tsubst_flags_t complain) +{ + tree fn = cand->fn; + const VEC(tree,gc) *args = cand->args; + tree first_arg = cand->first_arg; + conversion **convs = cand->convs; + conversion *conv; + tree parm = TYPE_ARG_TYPES (TREE_TYPE (fn)); + int parmlen; + tree val; + int i = 0; + int j = 0; + unsigned int arg_index = 0; + int is_method = 0; + int nargs; + tree *argarray; + bool already_used = false; + + /* 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; + const tree *argarray; + unsigned int nargs; + + return_type = TREE_TYPE (TREE_TYPE (fn)); + nargs = VEC_length (tree, args); + if (first_arg == NULL_TREE) + argarray = VEC_address (tree, CONST_CAST (VEC(tree,gc) *, args)); + else + { + tree *alcarray; + unsigned int ix; + tree arg; + + ++nargs; + alcarray = XALLOCAVEC (tree, nargs); + alcarray[0] = first_arg; + FOR_EACH_VEC_ELT (tree, args, ix, arg) + alcarray[ix + 1] = arg; + argarray = alcarray; + } + expr = build_call_array_loc (input_location, + return_type, build_addr_func (fn), nargs, + argarray); + if (TREE_THIS_VOLATILE (fn) && cfun) + current_function_returns_abnormally = 1; + if (!VOID_TYPE_P (return_type)) + require_complete_type_sfinae (return_type, complain); + return convert_from_reference (expr); + } + + /* Give any warnings we noticed during overload resolution. */ + if (cand->warnings && (complain & tf_warning)) + { + struct candidate_warning *w; + for (w = cand->warnings; w; w = w->next) + joust (cand, w->loser, 1); + } + + /* Make =delete work with SFINAE. */ + if (DECL_DELETED_FN (fn) && !(complain & tf_error)) + return error_mark_node; + + if (DECL_FUNCTION_MEMBER_P (fn)) + { + tree access_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) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (fn))) + access_fn = DECL_TI_TEMPLATE (fn); + else + access_fn = fn; + if (flags & LOOKUP_SPECULATIVE) + { + if (!speculative_access_check (cand->access_path, access_fn, fn, + !!(flags & LOOKUP_COMPLAIN))) + return error_mark_node; + } + else + perform_or_defer_access_check (cand->access_path, access_fn, fn); + } + + /* If we're checking for implicit delete, don't bother with argument + conversions. */ + if (flags & LOOKUP_SPECULATIVE) + { + if (DECL_DELETED_FN (fn)) + { + if (flags & LOOKUP_COMPLAIN) + mark_used (fn); + return error_mark_node; + } + if (cand->viable == 1) + return fn; + else if (!(flags & LOOKUP_COMPLAIN)) + /* Reject bad conversions now. */ + return error_mark_node; + /* else continue to get conversion error. */ + } + + /* Find maximum size of vector to hold converted arguments. */ + parmlen = list_length (parm); + nargs = VEC_length (tree, args) + (first_arg != NULL_TREE ? 1 : 0); + if (parmlen > nargs) + nargs = parmlen; + argarray = XALLOCAVEC (tree, nargs); + + /* The implicit parameters to a constructor are not considered by overload + resolution, and must be of the proper type. */ + if (DECL_CONSTRUCTOR_P (fn)) + { + if (first_arg != NULL_TREE) + { + argarray[j++] = first_arg; + first_arg = NULL_TREE; + } + else + { + argarray[j++] = VEC_index (tree, args, arg_index); + ++arg_index; + } + parm = TREE_CHAIN (parm); + /* We should never try to call the abstract constructor. */ + gcc_assert (!DECL_HAS_IN_CHARGE_PARM_P (fn)); + + if (DECL_HAS_VTT_PARM_P (fn)) + { + argarray[j++] = VEC_index (tree, args, arg_index); + ++arg_index; + parm = TREE_CHAIN (parm); + } + } + /* Bypass access control for 'this' parameter. */ + else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) + { + tree parmtype = TREE_VALUE (parm); + tree arg = (first_arg != NULL_TREE + ? first_arg + : VEC_index (tree, args, arg_index)); + tree argtype = TREE_TYPE (arg); + tree converted_arg; + tree base_binfo; + + if (convs[i]->bad_p) + { + if (complain & tf_error) + permerror (input_location, "passing %qT as % argument of %q#D discards qualifiers", + TREE_TYPE (argtype), fn); + else + return error_mark_node; + } + + /* [class.mfct.nonstatic]: If a nonstatic member function of a class + X is called for an object that is not of type X, or of a type + derived from X, the behavior is undefined. + + So we can assume that anything passed as 'this' is non-null, and + optimize accordingly. */ + gcc_assert (TREE_CODE (parmtype) == POINTER_TYPE); + /* Convert to the base in which the function was declared. */ + gcc_assert (cand->conversion_path != NULL_TREE); + converted_arg = build_base_path (PLUS_EXPR, + arg, + cand->conversion_path, + 1); + /* Check that the base class is accessible. */ + if (!accessible_base_p (TREE_TYPE (argtype), + BINFO_TYPE (cand->conversion_path), true)) + error ("%qT is not an accessible base of %qT", + BINFO_TYPE (cand->conversion_path), + TREE_TYPE (argtype)); + /* If fn was found by a using declaration, the conversion path + will be to the derived class, not the base declaring fn. We + must convert from derived to base. */ + base_binfo = lookup_base (TREE_TYPE (TREE_TYPE (converted_arg)), + TREE_TYPE (parmtype), ba_unique, NULL); + converted_arg = build_base_path (PLUS_EXPR, converted_arg, + base_binfo, 1); + + argarray[j++] = converted_arg; + parm = TREE_CHAIN (parm); + if (first_arg != NULL_TREE) + first_arg = NULL_TREE; + else + ++arg_index; + ++i; + is_method = 1; + } + + gcc_assert (first_arg == NULL_TREE); + for (; arg_index < VEC_length (tree, args) && parm; + parm = TREE_CHAIN (parm), ++arg_index, ++i) + { + tree type = TREE_VALUE (parm); + tree arg = VEC_index (tree, args, arg_index); + + conv = convs[i]; + + /* Don't make a copy here if build_call is going to. */ + if (conv->kind == ck_rvalue + && COMPLETE_TYPE_P (complete_type (type)) + && !TREE_ADDRESSABLE (type)) + conv = conv->u.next; + + /* Warn about initializer_list deduction that isn't currently in the + working draft. */ + if (cxx_dialect > cxx98 + && flag_deduce_init_list + && cand->template_decl + && is_std_init_list (non_reference (type)) + && BRACE_ENCLOSED_INITIALIZER_P (arg)) + { + tree tmpl = TI_TEMPLATE (cand->template_decl); + tree realparm = chain_index (j, DECL_ARGUMENTS (cand->fn)); + tree patparm = get_pattern_parm (realparm, tmpl); + tree pattype = TREE_TYPE (patparm); + if (PACK_EXPANSION_P (pattype)) + pattype = PACK_EXPANSION_PATTERN (pattype); + pattype = non_reference (pattype); + + if (TREE_CODE (pattype) == TEMPLATE_TYPE_PARM + && (cand->explicit_targs == NULL_TREE + || (TREE_VEC_LENGTH (cand->explicit_targs) + <= TEMPLATE_TYPE_IDX (pattype)))) + { + pedwarn (input_location, 0, "deducing %qT as %qT", + non_reference (TREE_TYPE (patparm)), + non_reference (type)); + pedwarn (input_location, 0, " in call to %q+D", cand->fn); + pedwarn (input_location, 0, + " (you can disable this with -fno-deduce-init-list)"); + } + } + + val = convert_like_with_context (conv, arg, fn, i-is_method, complain); + + val = convert_for_arg_passing (type, val); + if (val == error_mark_node) + return error_mark_node; + else + argarray[j++] = val; + } + + /* Default arguments */ + for (; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++) + argarray[j++] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), + fn, i - is_method); + /* Ellipsis */ + for (; arg_index < VEC_length (tree, args); ++arg_index) + { + tree a = VEC_index (tree, args, arg_index); + if (magic_varargs_p (fn)) + /* Do no conversions for magic varargs. */ + a = mark_type_use (a); + else + a = convert_arg_to_ellipsis (a); + argarray[j++] = a; + } + + gcc_assert (j <= nargs); + nargs = j; + + check_function_arguments (TYPE_ATTRIBUTES (TREE_TYPE (fn)), + nargs, argarray, TYPE_ARG_TYPES (TREE_TYPE (fn))); + + /* Avoid actually calling copy constructors and copy assignment operators, + if possible. */ + + if (! flag_elide_constructors) + /* Do things the hard way. */; + else if (cand->num_convs == 1 + && (DECL_COPY_CONSTRUCTOR_P (fn) + || DECL_MOVE_CONSTRUCTOR_P (fn))) + { + tree targ; + tree arg = argarray[num_artificial_parms_for (fn)]; + tree fa; + bool trivial = trivial_fn_p (fn); + + /* Pull out the real argument, disregarding const-correctness. */ + targ = arg; + while (CONVERT_EXPR_P (targ) + || TREE_CODE (targ) == NON_LVALUE_EXPR) + targ = TREE_OPERAND (targ, 0); + if (TREE_CODE (targ) == ADDR_EXPR) + { + targ = TREE_OPERAND (targ, 0); + if (!same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (TREE_TYPE (arg)), TREE_TYPE (targ))) + targ = NULL_TREE; + } + else + targ = NULL_TREE; + + if (targ) + arg = targ; + else + arg = cp_build_indirect_ref (arg, RO_NULL, complain); + + /* [class.copy]: the copy constructor is implicitly defined even if + the implementation elided its use. */ + if (!trivial || DECL_DELETED_FN (fn)) + { + mark_used (fn); + already_used = true; + } + + /* If we're creating a temp and we already have one, don't create a + new one. If we're not creating a temp but we get one, use + INIT_EXPR to collapse the temp into our target. Otherwise, if the + ctor is trivial, do a bitwise copy with a simple TARGET_EXPR for a + temp or an INIT_EXPR otherwise. */ + fa = argarray[0]; + if (integer_zerop (fa)) + { + if (TREE_CODE (arg) == TARGET_EXPR) + return arg; + else if (trivial) + return force_target_expr (DECL_CONTEXT (fn), arg); + } + else if (TREE_CODE (arg) == TARGET_EXPR || trivial) + { + tree to = stabilize_reference (cp_build_indirect_ref (fa, RO_NULL, + complain)); + + val = build2 (INIT_EXPR, DECL_CONTEXT (fn), to, arg); + return val; + } + } + else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR + && trivial_fn_p (fn) + && !DECL_DELETED_FN (fn)) + { + tree to = stabilize_reference + (cp_build_indirect_ref (argarray[0], RO_NULL, complain)); + tree type = TREE_TYPE (to); + tree as_base = CLASSTYPE_AS_BASE (type); + tree arg = argarray[1]; + + if (is_really_empty_class (type)) + { + /* Avoid copying empty classes. */ + val = build2 (COMPOUND_EXPR, void_type_node, to, arg); + TREE_NO_WARNING (val) = 1; + val = build2 (COMPOUND_EXPR, type, val, to); + TREE_NO_WARNING (val) = 1; + } + else if (tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (as_base))) + { + arg = cp_build_indirect_ref (arg, RO_NULL, complain); + val = build2 (MODIFY_EXPR, TREE_TYPE (to), to, arg); + } + else + { + /* We must only copy the non-tail padding parts. + Use __builtin_memcpy for the bitwise copy. + FIXME fix 22488 so we can go back to using MODIFY_EXPR + instead of an explicit call to memcpy. */ + + tree arg0, arg1, arg2, t; + tree test = NULL_TREE; + + arg2 = TYPE_SIZE_UNIT (as_base); + arg1 = arg; + arg0 = cp_build_addr_expr (to, complain); + + if (!can_trust_pointer_alignment ()) + { + /* If we can't be sure about pointer alignment, a call + to __builtin_memcpy is expanded as a call to memcpy, which + is invalid with identical args. Otherwise it is + expanded as a block move, which should be safe. */ + arg0 = save_expr (arg0); + arg1 = save_expr (arg1); + test = build2 (EQ_EXPR, boolean_type_node, arg0, arg1); + } + t = implicit_built_in_decls[BUILT_IN_MEMCPY]; + t = build_call_n (t, 3, arg0, arg1, arg2); + + t = convert (TREE_TYPE (arg0), t); + if (test) + t = build3 (COND_EXPR, TREE_TYPE (t), test, arg0, t); + val = cp_build_indirect_ref (t, RO_NULL, complain); + TREE_NO_WARNING (val) = 1; + } + + return val; + } + /* FIXME handle trivial default constructor and destructor, too. */ + + if (!already_used) + mark_used (fn); + + if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0) + { + tree t; + tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (argarray[0])), + DECL_CONTEXT (fn), + ba_any, NULL); + gcc_assert (binfo && binfo != error_mark_node); + + /* Warn about deprecated virtual functions now, since we're about + to throw away the decl. */ + if (TREE_DEPRECATED (fn)) + warn_deprecated_use (fn, NULL_TREE); + + argarray[0] = build_base_path (PLUS_EXPR, argarray[0], binfo, 1); + if (TREE_SIDE_EFFECTS (argarray[0])) + argarray[0] = save_expr (argarray[0]); + t = build_pointer_type (TREE_TYPE (fn)); + if (DECL_CONTEXT (fn) && TYPE_JAVA_INTERFACE (DECL_CONTEXT (fn))) + fn = build_java_interface_fn_ref (fn, argarray[0]); + else + fn = build_vfn_ref (argarray[0], DECL_VINDEX (fn)); + TREE_TYPE (fn) = t; + } + else + fn = build_addr_func (fn); + + return build_cxx_call (fn, nargs, argarray); +} + +/* Build and return a call to FN, using NARGS arguments in ARGARRAY. + This function performs no overload resolution, conversion, or other + high-level operations. */ + +tree +build_cxx_call (tree fn, int nargs, tree *argarray) +{ + tree fndecl; + + fn = build_call_a (fn, nargs, argarray); + + /* If this call might throw an exception, note that fact. */ + fndecl = get_callee_fndecl (fn); + + /* Check that arguments to builtin functions match the expectations. */ + if (fndecl + && DECL_BUILT_IN (fndecl) + && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL + && !check_builtin_function_arguments (fndecl, nargs, argarray)) + return error_mark_node; + + /* Some built-in function calls will be evaluated at compile-time in + fold (). */ + fn = fold_if_not_in_template (fn); + + if (VOID_TYPE_P (TREE_TYPE (fn))) + return fn; + + fn = require_complete_type (fn); + if (fn == error_mark_node) + return error_mark_node; + + if (MAYBE_CLASS_TYPE_P (TREE_TYPE (fn))) + fn = build_cplus_new (TREE_TYPE (fn), fn); + return convert_from_reference (fn); +} + +static GTY(()) tree java_iface_lookup_fn; + +/* Make an expression which yields the address of the Java interface + method FN. This is achieved by generating a call to libjava's + _Jv_LookupInterfaceMethodIdx(). */ + +static tree +build_java_interface_fn_ref (tree fn, tree instance) +{ + tree lookup_fn, method, idx; + tree klass_ref, iface, iface_ref; + int i; + + if (!java_iface_lookup_fn) + { + tree ftype = build_function_type_list (ptr_type_node, + ptr_type_node, ptr_type_node, + java_int_type_node, NULL_TREE); + java_iface_lookup_fn + = add_builtin_function ("_Jv_LookupInterfaceMethodIdx", ftype, + 0, NOT_BUILT_IN, NULL, NULL_TREE); + } + + /* Look up the pointer to the runtime java.lang.Class object for `instance'. + This is the first entry in the vtable. */ + klass_ref = build_vtbl_ref (cp_build_indirect_ref (instance, RO_NULL, + tf_warning_or_error), + integer_zero_node); + + /* 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) + { + error ("could not find class$ field in java interface type %qT", + iface); + return error_mark_node; + } + iface_ref = build_address (iface_ref); + iface_ref = convert (build_pointer_type (iface), iface_ref); + + /* Determine the itable index of FN. */ + i = 1; + for (method = TYPE_METHODS (iface); method; method = DECL_CHAIN (method)) + { + if (!DECL_VIRTUAL_P (method)) + continue; + if (fn == method) + break; + i++; + } + idx = build_int_cst (NULL_TREE, i); + + lookup_fn = build1 (ADDR_EXPR, + build_pointer_type (TREE_TYPE (java_iface_lookup_fn)), + java_iface_lookup_fn); + return build_call_nary (ptr_type_node, lookup_fn, + 3, klass_ref, iface_ref, idx); +} + +/* Returns the value to use for the in-charge parameter when making a + call to a function with the indicated NAME. + + FIXME:Can't we find a neater way to do this mapping? */ + +tree +in_charge_arg_for_name (tree name) +{ + if (name == base_ctor_identifier + || name == base_dtor_identifier) + return integer_zero_node; + else if (name == complete_ctor_identifier) + return integer_one_node; + else if (name == complete_dtor_identifier) + return integer_two_node; + else if (name == deleting_dtor_identifier) + return integer_three_node; + + /* This function should only be called with one of the names listed + above. */ + gcc_unreachable (); + return NULL_TREE; +} + +/* Build a call to a constructor, destructor, or an assignment + operator for INSTANCE, an expression with class type. NAME + indicates the special member function to call; *ARGS are the + arguments. ARGS may be NULL. This may change ARGS. BINFO + indicates the base of INSTANCE that is to be passed as the `this' + parameter to the member function called. + + FLAGS are the LOOKUP_* flags to use when processing the call. + + If NAME indicates a complete object constructor, INSTANCE may be + NULL_TREE. In this case, the caller will call build_cplus_new to + store the newly constructed object into a VAR_DECL. */ + +tree +build_special_member_call (tree instance, tree name, VEC(tree,gc) **args, + tree binfo, int flags, tsubst_flags_t complain) +{ + tree fns; + /* The type of the subobject to be constructed or destroyed. */ + tree class_type; + VEC(tree,gc) *allocated = NULL; + tree ret; + + gcc_assert (name == complete_ctor_identifier + || name == base_ctor_identifier + || name == complete_dtor_identifier + || name == base_dtor_identifier + || name == deleting_dtor_identifier + || name == ansi_assopname (NOP_EXPR)); + if (TYPE_P (binfo)) + { + /* Resolve the name. */ + if (!complete_type_or_maybe_complain (binfo, NULL_TREE, complain)) + return error_mark_node; + + binfo = TYPE_BINFO (binfo); + } + + gcc_assert (binfo != NULL_TREE); + + class_type = BINFO_TYPE (binfo); + + /* Handle the special case where INSTANCE is NULL_TREE. */ + if (name == complete_ctor_identifier && !instance) + { + instance = build_int_cst (build_pointer_type (class_type), 0); + instance = build1 (INDIRECT_REF, class_type, instance); + } + else + { + if (name == complete_dtor_identifier + || name == base_dtor_identifier + || name == deleting_dtor_identifier) + gcc_assert (args == NULL || VEC_empty (tree, *args)); + + /* Convert to the base class, if necessary. */ + if (!same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (instance), BINFO_TYPE (binfo))) + { + if (name != ansi_assopname (NOP_EXPR)) + /* For constructors and destructors, either the base is + non-virtual, or it is virtual but we are doing the + conversion from a constructor or destructor for the + complete object. In either case, we can convert + statically. */ + instance = convert_to_base_statically (instance, binfo); + else + /* However, for assignment operators, we must convert + dynamically if the base is virtual. */ + instance = build_base_path (PLUS_EXPR, instance, + binfo, /*nonnull=*/1); + } + } + + gcc_assert (instance != NULL_TREE); + + fns = lookup_fnfields (binfo, name, 1); + + /* When making a call to a constructor or destructor for a subobject + that uses virtual base classes, pass down a pointer to a VTT for + the subobject. */ + if ((name == base_ctor_identifier + || name == base_dtor_identifier) + && CLASSTYPE_VBASECLASSES (class_type)) + { + tree vtt; + tree sub_vtt; + + /* If the current function is a complete object constructor + or destructor, then we fetch the VTT directly. + Otherwise, we look it up using the VTT we were given. */ + vtt = DECL_CHAIN (CLASSTYPE_VTABLES (current_class_type)); + vtt = decay_conversion (vtt); + vtt = build3 (COND_EXPR, TREE_TYPE (vtt), + build2 (EQ_EXPR, boolean_type_node, + current_in_charge_parm, integer_zero_node), + current_vtt_parm, + vtt); + gcc_assert (BINFO_SUBVTT_INDEX (binfo)); + sub_vtt = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtt), vtt, + BINFO_SUBVTT_INDEX (binfo)); + + if (args == NULL) + { + allocated = make_tree_vector (); + args = &allocated; + } + + VEC_safe_insert (tree, gc, *args, 0, sub_vtt); + } + + ret = build_new_method_call (instance, fns, args, + TYPE_BINFO (BINFO_TYPE (binfo)), + flags, /*fn=*/NULL, + complain); + + if (allocated != NULL) + release_tree_vector (allocated); + + return ret; +} + +/* 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 + = CONST_CAST (char *, identifier_to_locale (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_translate (TREE_TYPE (name), + TFF_PLAIN_IDENTIFIER), + NULL); + /* Remember that we need to free the memory allocated. */ + *free_p = true; + } + else + pretty_name = CONST_CAST (char *, identifier_to_locale (IDENTIFIER_POINTER (name))); + + return pretty_name; +} + +/* Build a call to "INSTANCE.FN (ARGS)". If FN_P is non-NULL, it will + be set, upon return, to the function called. ARGS may be NULL. + This may change ARGS. */ + +tree +build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args, + tree conversion_path, int flags, + tree *fn_p, tsubst_flags_t complain) +{ + struct z_candidate *candidates = 0, *cand; + tree explicit_targs = NULL_TREE; + tree basetype = NULL_TREE; + tree access_binfo; + tree optype; + tree first_mem_arg = NULL_TREE; + tree instance_ptr; + tree name; + bool skip_first_for_error; + VEC(tree,gc) *user_args; + tree call; + tree fn; + int template_only = 0; + bool any_viable_p; + tree orig_instance; + tree orig_fns; + VEC(tree,gc) *orig_args = NULL; + void *p; + + gcc_assert (instance != NULL_TREE); + + /* We don't know what function we're going to call, yet. */ + if (fn_p) + *fn_p = NULL_TREE; + + if (error_operand_p (instance) + || !fns || error_operand_p (fns)) + return error_mark_node; + + if (!BASELINK_P (fns)) + { + if (complain & tf_error) + error ("call to non-function %qD", fns); + return error_mark_node; + } + + orig_instance = instance; + orig_fns = fns; + + /* Dismantle the baselink to collect all the information we need. */ + if (!conversion_path) + conversion_path = BASELINK_BINFO (fns); + access_binfo = BASELINK_ACCESS_BINFO (fns); + optype = BASELINK_OPTYPE (fns); + fns = BASELINK_FUNCTIONS (fns); + if (TREE_CODE (fns) == TEMPLATE_ID_EXPR) + { + explicit_targs = TREE_OPERAND (fns, 1); + fns = TREE_OPERAND (fns, 0); + template_only = 1; + } + gcc_assert (TREE_CODE (fns) == FUNCTION_DECL + || TREE_CODE (fns) == TEMPLATE_DECL + || TREE_CODE (fns) == OVERLOAD); + fn = get_first_fn (fns); + name = DECL_NAME (fn); + + basetype = TYPE_MAIN_VARIANT (TREE_TYPE (instance)); + gcc_assert (CLASS_TYPE_P (basetype)); + + if (processing_template_decl) + { + orig_args = args == NULL ? NULL : make_tree_vector_copy (*args); + instance = build_non_dependent_expr (instance); + if (args != NULL) + make_args_non_dependent (*args); + } + + user_args = args == NULL ? NULL : *args; + /* Under DR 147 A::A() is an invalid constructor call, + not a functional cast. */ + if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)) + { + if (! (complain & tf_error)) + return error_mark_node; + + permerror (input_location, + "cannot call constructor %<%T::%D%> directly", + basetype, name); + permerror (input_location, " for a function-style cast, remove the " + "redundant %<::%D%>", name); + call = build_functional_cast (basetype, build_tree_list_vec (user_args), + complain); + return call; + } + + /* Figure out whether to skip the first argument for the error + message we will display to users if an error occurs. We don't + want to display any compiler-generated arguments. The "this" + pointer hasn't been added yet. However, we must remove the VTT + pointer if this is a call to a base-class constructor or + destructor. */ + skip_first_for_error = false; + if (IDENTIFIER_CTOR_OR_DTOR_P (name)) + { + /* Callers should explicitly indicate whether they want to construct + the complete object or just the part without virtual bases. */ + gcc_assert (name != ctor_identifier); + /* Similarly for destructors. */ + gcc_assert (name != dtor_identifier); + /* Remove the VTT pointer, if present. */ + if ((name == base_ctor_identifier || name == base_dtor_identifier) + && CLASSTYPE_VBASECLASSES (basetype)) + skip_first_for_error = true; + } + + /* Process the argument list. */ + if (args != NULL && *args != NULL) + { + *args = resolve_args (*args); + if (*args == NULL) + return error_mark_node; + } + + instance_ptr = build_this (instance); + + /* It's OK to call destructors and constructors on cv-qualified objects. + Therefore, convert the INSTANCE_PTR to the unqualified type, if + necessary. */ + if (DECL_DESTRUCTOR_P (fn) + || DECL_CONSTRUCTOR_P (fn)) + { + tree type = build_pointer_type (basetype); + if (!same_type_p (type, TREE_TYPE (instance_ptr))) + instance_ptr = build_nop (type, instance_ptr); + } + if (DECL_DESTRUCTOR_P (fn)) + name = complete_dtor_identifier; + + first_mem_arg = instance_ptr; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + /* If CONSTRUCTOR_IS_DIRECT_INIT is set, this was a T{ } form + initializer, not T({ }). */ + if (DECL_CONSTRUCTOR_P (fn) && args != NULL && !VEC_empty (tree, *args) + && BRACE_ENCLOSED_INITIALIZER_P (VEC_index (tree, *args, 0)) + && CONSTRUCTOR_IS_DIRECT_INIT (VEC_index (tree, *args, 0))) + { + gcc_assert (VEC_length (tree, *args) == 1 + && !(flags & LOOKUP_ONLYCONVERTING)); + + add_list_candidates (fns, first_mem_arg, VEC_index (tree, *args, 0), + basetype, explicit_targs, template_only, + conversion_path, access_binfo, flags, &candidates); + } + else + { + add_candidates (fns, first_mem_arg, user_args, optype, + explicit_targs, template_only, conversion_path, + access_binfo, flags, &candidates); + } + any_viable_p = false; + candidates = splice_viable (candidates, pedantic, &any_viable_p); + + if (!any_viable_p) + { + if (complain & tf_error) + { + if (!COMPLETE_OR_OPEN_TYPE_P (basetype)) + cxx_incomplete_type_error (instance_ptr, basetype); + else if (optype) + error ("no matching function for call to %<%T::operator %T(%A)%#V%>", + basetype, optype, build_tree_list_vec (user_args), + TREE_TYPE (TREE_TYPE (instance_ptr))); + else + { + char *pretty_name; + bool free_p; + tree arglist; + + pretty_name = name_as_c_string (name, basetype, &free_p); + arglist = build_tree_list_vec (user_args); + if (skip_first_for_error) + arglist = TREE_CHAIN (arglist); + error ("no matching function for call to %<%T::%s(%A)%#V%>", + basetype, pretty_name, arglist, + TREE_TYPE (TREE_TYPE (instance_ptr))); + if (free_p) + free (pretty_name); + } + print_z_candidates (location_of (name), candidates); + } + call = error_mark_node; + } + else + { + cand = tourney (candidates); + if (cand == 0) + { + char *pretty_name; + bool free_p; + tree arglist; + + if (complain & tf_error) + { + pretty_name = name_as_c_string (name, basetype, &free_p); + arglist = build_tree_list_vec (user_args); + if (skip_first_for_error) + arglist = TREE_CHAIN (arglist); + error ("call of overloaded %<%s(%A)%> is ambiguous", pretty_name, + arglist); + print_z_candidates (location_of (name), candidates); + if (free_p) + free (pretty_name); + } + call = error_mark_node; + } + else + { + fn = cand->fn; + + if (!(flags & LOOKUP_NONVIRTUAL) + && DECL_PURE_VIRTUAL_P (fn) + && instance == current_class_ref + && (DECL_CONSTRUCTOR_P (current_function_decl) + || DECL_DESTRUCTOR_P (current_function_decl)) + && (complain & tf_warning)) + /* This is not an error, it is runtime undefined + behavior. */ + warning (0, (DECL_CONSTRUCTOR_P (current_function_decl) ? + "pure virtual %q#D called from constructor" + : "pure virtual %q#D called from destructor"), + fn); + + if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE + && is_dummy_object (instance_ptr)) + { + if (complain & tf_error) + error ("cannot call member function %qD without object", + fn); + call = error_mark_node; + } + else + { + if (DECL_VINDEX (fn) && ! (flags & LOOKUP_NONVIRTUAL) + && resolves_to_fixed_type_p (instance, 0)) + flags |= LOOKUP_NONVIRTUAL; + /* Now we know what function is being called. */ + if (fn_p) + *fn_p = fn; + /* Build the actual CALL_EXPR. */ + call = build_over_call (cand, flags, complain); + /* 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 (TREE_CODE (TREE_TYPE (fn)) != METHOD_TYPE + && !is_dummy_object (instance_ptr) + && TREE_SIDE_EFFECTS (instance_ptr)) + call = build2 (COMPOUND_EXPR, TREE_TYPE (call), + instance_ptr, call); + else if (call != error_mark_node + && DECL_DESTRUCTOR_P (cand->fn) + && !VOID_TYPE_P (TREE_TYPE (call))) + /* An explicit call of the form "x->~X()" has type + "void". However, on platforms where destructors + return "this" (i.e., those where + targetm.cxx.cdtor_returns_this is true), such calls + will appear to have a return value of pointer type + to the low-level call machinery. We do not want to + change the low-level machinery, since we want to be + able to optimize "delete f()" on such platforms as + "operator delete(~X(f()))" (rather than generating + "t = f(), ~X(t), operator delete (t)"). */ + call = build_nop (void_type_node, call); + } + } + } + + if (processing_template_decl && call != error_mark_node) + { + bool cast_to_void = false; + + if (TREE_CODE (call) == COMPOUND_EXPR) + call = TREE_OPERAND (call, 1); + else if (TREE_CODE (call) == NOP_EXPR) + { + cast_to_void = true; + call = TREE_OPERAND (call, 0); + } + if (TREE_CODE (call) == INDIRECT_REF) + call = TREE_OPERAND (call, 0); + call = (build_min_non_dep_call_vec + (call, + build_min (COMPONENT_REF, TREE_TYPE (CALL_EXPR_FN (call)), + orig_instance, orig_fns, NULL_TREE), + orig_args)); + call = convert_from_reference (call); + if (cast_to_void) + call = build_nop (void_type_node, call); + } + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + if (orig_args != NULL) + release_tree_vector (orig_args); + + return call; +} + +/* Returns true iff standard conversion sequence ICS1 is a proper + subsequence of ICS2. */ + +static bool +is_subseq (conversion *ics1, conversion *ics2) +{ + /* We can assume that a conversion of the same code + between the same types indicates a subsequence since we only get + here if the types we are converting from are the same. */ + + while (ics1->kind == ck_rvalue + || ics1->kind == ck_lvalue) + ics1 = ics1->u.next; + + while (1) + { + while (ics2->kind == ck_rvalue + || ics2->kind == ck_lvalue) + ics2 = ics2->u.next; + + if (ics2->kind == ck_user + || ics2->kind == ck_ambig + || ics2->kind == ck_aggr + || ics2->kind == ck_list + || ics2->kind == ck_identity) + /* At this point, ICS1 cannot be a proper subsequence of + ICS2. We can get a USER_CONV when we are comparing the + second standard conversion sequence of two user conversion + sequences. */ + return false; + + ics2 = ics2->u.next; + + if (ics2->kind == ics1->kind + && same_type_p (ics2->type, ics1->type) + && same_type_p (ics2->u.next->type, + ics1->u.next->type)) + 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 (!CLASS_TYPE_P (derived) || !CLASS_TYPE_P (base)) + return false; + + /* We only allow proper derivation here. The DERIVED_FROM_P macro + considers every class derived from itself. */ + return (!same_type_ignoring_top_level_qualifiers_p (derived, base) + && DERIVED_FROM_P (base, derived)); +} + +/* We build the ICS for an implicit object parameter as a pointer + conversion sequence. However, such a sequence should be compared + as if it were a reference conversion sequence. If ICS is the + implicit conversion sequence for an implicit object parameter, + modify it accordingly. */ + +static void +maybe_handle_implicit_object (conversion **ics) +{ + if ((*ics)->this_p) + { + /* [over.match.funcs] + + For non-static member functions, the type of the + implicit object parameter is "reference to cv X" + where X is the class of which the function is a + member and cv is the cv-qualification on the member + function declaration. */ + conversion *t = *ics; + 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 (t->type); + reference_type = build_reference_type (reference_type); + + if (t->kind == ck_qual) + t = t->u.next; + if (t->kind == ck_ptr) + t = t->u.next; + t = build_identity_conv (TREE_TYPE (t->type), NULL_TREE); + t = direct_reference_binding (reference_type, t); + t->this_p = 1; + t->rvaluedness_matches_p = 0; + *ics = t; + } +} + +/* If *ICS is a REF_BIND set *ICS to the remainder of the conversion, + and return the initial reference binding conversion. Otherwise, + leave *ICS unchanged and return NULL. */ + +static conversion * +maybe_handle_ref_bind (conversion **ics) +{ + if ((*ics)->kind == ck_ref_bind) + { + conversion *old_ics = *ics; + *ics = old_ics->u.next; + (*ics)->user_conv_p = old_ics->user_conv_p; + return old_ics; + } + + return NULL; +} + +/* Compare two implicit conversion sequences according to the rules set out in + [over.ics.rank]. Return values: + + 1: ics1 is better than ics2 + -1: ics2 is better than ics1 + 0: ics1 and ics2 are indistinguishable */ + +static int +compare_ics (conversion *ics1, conversion *ics2) +{ + tree from_type1; + tree from_type2; + tree to_type1; + tree to_type2; + tree deref_from_type1 = NULL_TREE; + tree deref_from_type2 = NULL_TREE; + tree deref_to_type1 = NULL_TREE; + tree deref_to_type2 = NULL_TREE; + conversion_rank rank1, rank2; + + /* REF_BINDING is nonzero if the result of the conversion sequence + is a reference type. In that case REF_CONV is the reference + binding conversion. */ + conversion *ref_conv1; + conversion *ref_conv2; + + /* Handle implicit object parameters. */ + maybe_handle_implicit_object (&ics1); + maybe_handle_implicit_object (&ics2); + + /* Handle reference parameters. */ + ref_conv1 = maybe_handle_ref_bind (&ics1); + ref_conv2 = maybe_handle_ref_bind (&ics2); + + /* List-initialization sequence L1 is a better conversion sequence than + list-initialization sequence L2 if L1 converts to + std::initializer_list for some X and L2 does not. */ + if (ics1->kind == ck_list && ics2->kind != ck_list) + return 1; + if (ics2->kind == ck_list && ics1->kind != ck_list) + return -1; + + /* [over.ics.rank] + + When comparing the basic forms of implicit conversion sequences (as + defined in _over.best.ics_) + + --a standard conversion sequence (_over.ics.scs_) is a better + conversion sequence than a user-defined conversion sequence + or an ellipsis conversion sequence, and + + --a user-defined conversion sequence (_over.ics.user_) is a + better conversion sequence than an ellipsis conversion sequence + (_over.ics.ellipsis_). */ + rank1 = CONVERSION_RANK (ics1); + rank2 = CONVERSION_RANK (ics2); + + if (rank1 > rank2) + return -1; + else if (rank1 < rank2) + return 1; + + if (rank1 == cr_bad) + { + /* Both ICS are bad. We try to make a decision based on what would + have happened if they'd been good. This is not an extension, + we'll still give an error when we build up the call; this just + helps us give a more helpful error message. */ + rank1 = BAD_CONVERSION_RANK (ics1); + rank2 = BAD_CONVERSION_RANK (ics2); + + if (rank1 > rank2) + return -1; + else if (rank1 < rank2) + return 1; + + /* We couldn't make up our minds; try to figure it out below. */ + } + + if (ics1->ellipsis_p) + /* Both conversions are ellipsis conversions. */ + return 0; + + /* User-defined conversion sequence U1 is a better conversion sequence + than another user-defined conversion sequence U2 if they contain the + same user-defined conversion operator or constructor and if the sec- + ond standard conversion sequence of U1 is better than the second + standard conversion sequence of U2. */ + + /* Handle list-conversion with the same code even though it isn't always + ranked as a user-defined conversion and it doesn't have a second + standard conversion sequence; it will still have the desired effect. + Specifically, we need to do the reference binding comparison at the + end of this function. */ + + if (ics1->user_conv_p || ics1->kind == ck_list) + { + conversion *t1; + conversion *t2; + + for (t1 = ics1; t1->kind != ck_user; t1 = t1->u.next) + if (t1->kind == ck_ambig || t1->kind == ck_aggr + || t1->kind == ck_list) + break; + for (t2 = ics2; t2->kind != ck_user; t2 = t2->u.next) + if (t2->kind == ck_ambig || t2->kind == ck_aggr + || t2->kind == ck_list) + break; + + if (t1->kind != t2->kind) + return 0; + else if (t1->kind == ck_user) + { + if (t1->cand->fn != t2->cand->fn) + return 0; + } + else + { + /* For ambiguous or aggregate conversions, use the target type as + a proxy for the conversion function. */ + if (!same_type_ignoring_top_level_qualifiers_p (t1->type, t2->type)) + return 0; + } + + /* We can just fall through here, after setting up + FROM_TYPE1 and FROM_TYPE2. */ + from_type1 = t1->type; + from_type2 = t2->type; + } + else + { + conversion *t1; + conversion *t2; + + /* We're dealing with two standard conversion sequences. + + [over.ics.rank] + + Standard conversion sequence S1 is a better conversion + sequence than standard conversion sequence S2 if + + --S1 is a proper subsequence of S2 (comparing the conversion + sequences in the canonical form defined by _over.ics.scs_, + excluding any Lvalue Transformation; the identity + conversion sequence is considered to be a subsequence of + any non-identity conversion sequence */ + + t1 = ics1; + while (t1->kind != ck_identity) + t1 = t1->u.next; + from_type1 = t1->type; + + t2 = ics2; + while (t2->kind != ck_identity) + t2 = t2->u.next; + from_type2 = t2->type; + } + + /* One sequence can only be a subsequence of the other if they start with + the same type. They can start with different types when comparing the + second standard conversion sequence in two user-defined conversion + sequences. */ + if (same_type_p (from_type1, from_type2)) + { + if (is_subseq (ics1, ics2)) + return 1; + if (is_subseq (ics2, ics1)) + return -1; + } + + /* [over.ics.rank] + + Or, if not that, + + --the rank of S1 is better than the rank of S2 (by the rules + defined below): + + Standard conversion sequences are ordered by their ranks: an Exact + Match is a better conversion than a Promotion, which is a better + conversion than a Conversion. + + Two conversion sequences with the same rank are indistinguishable + unless one of the following rules applies: + + --A conversion that does not a convert a pointer, pointer to member, + or std::nullptr_t to bool is better than one that does. + + The ICS_STD_RANK automatically handles the pointer-to-bool rule, + so that we do not have to check it explicitly. */ + if (ics1->rank < ics2->rank) + return 1; + else if (ics2->rank < ics1->rank) + return -1; + + to_type1 = ics1->type; + to_type2 = ics2->type; + + /* A conversion from scalar arithmetic type to complex is worse than a + conversion between scalar arithmetic types. */ + if (same_type_p (from_type1, from_type2) + && ARITHMETIC_TYPE_P (from_type1) + && ARITHMETIC_TYPE_P (to_type1) + && ARITHMETIC_TYPE_P (to_type2) + && ((TREE_CODE (to_type1) == COMPLEX_TYPE) + != (TREE_CODE (to_type2) == COMPLEX_TYPE))) + { + if (TREE_CODE (to_type1) == COMPLEX_TYPE) + return -1; + else + return 1; + } + + if (TYPE_PTR_P (from_type1) + && TYPE_PTR_P (from_type2) + && TYPE_PTR_P (to_type1) + && TYPE_PTR_P (to_type2)) + { + deref_from_type1 = TREE_TYPE (from_type1); + deref_from_type2 = TREE_TYPE (from_type2); + deref_to_type1 = TREE_TYPE (to_type1); + deref_to_type2 = TREE_TYPE (to_type2); + } + /* The rules for pointers to members A::* are just like the rules + 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 + && RECORD_OR_UNION_CODE_P (TREE_CODE (deref_from_type1)) + && RECORD_OR_UNION_CODE_P (TREE_CODE (deref_from_type2))) + { + /* This was one of the pointer or pointer-like conversions. + + [over.ics.rank] + + --If class B is derived directly or indirectly from class A, + conversion of B* to A* is better than conversion of B* to + void*, and conversion of A* to void* is better than + conversion of B* to void*. */ + if (TREE_CODE (deref_to_type1) == VOID_TYPE + && TREE_CODE (deref_to_type2) == VOID_TYPE) + { + if (is_properly_derived_from (deref_from_type1, + deref_from_type2)) + return -1; + else if (is_properly_derived_from (deref_from_type2, + deref_from_type1)) + return 1; + } + else if (TREE_CODE (deref_to_type1) == VOID_TYPE + || TREE_CODE (deref_to_type2) == VOID_TYPE) + { + if (same_type_p (deref_from_type1, deref_from_type2)) + { + if (TREE_CODE (deref_to_type2) == VOID_TYPE) + { + if (is_properly_derived_from (deref_from_type1, + deref_to_type1)) + return 1; + } + /* We know that DEREF_TO_TYPE1 is `void' here. */ + else if (is_properly_derived_from (deref_from_type1, + deref_to_type2)) + return -1; + } + } + else if (RECORD_OR_UNION_CODE_P (TREE_CODE (deref_to_type1)) + && RECORD_OR_UNION_CODE_P (TREE_CODE (deref_to_type2))) + { + /* [over.ics.rank] + + --If class B is derived directly or indirectly from class A + and class C is derived directly or indirectly from B, + + --conversion of C* to B* is better than conversion of C* to + A*, + + --conversion of B* to A* is better than conversion of C* to + A* */ + if (same_type_p (deref_from_type1, deref_from_type2)) + { + if (is_properly_derived_from (deref_to_type1, + deref_to_type2)) + return 1; + else if (is_properly_derived_from (deref_to_type2, + deref_to_type1)) + return -1; + } + else if (same_type_p (deref_to_type1, deref_to_type2)) + { + if (is_properly_derived_from (deref_from_type2, + deref_from_type1)) + return 1; + else if (is_properly_derived_from (deref_from_type1, + deref_from_type2)) + return -1; + } + } + } + else if (CLASS_TYPE_P (non_reference (from_type1)) + && same_type_p (from_type1, from_type2)) + { + tree from = non_reference (from_type1); + + /* [over.ics.rank] + + --binding of an expression of type C to a reference of type + B& is better than binding an expression of type C to a + reference of type A& + + --conversion of C to B is better than conversion of C to A, */ + if (is_properly_derived_from (from, to_type1) + && is_properly_derived_from (from, to_type2)) + { + if (is_properly_derived_from (to_type1, to_type2)) + return 1; + else if (is_properly_derived_from (to_type2, to_type1)) + return -1; + } + } + else if (CLASS_TYPE_P (non_reference (to_type1)) + && same_type_p (to_type1, to_type2)) + { + tree to = non_reference (to_type1); + + /* [over.ics.rank] + + --binding of an expression of type B to a reference of type + A& is better than binding an expression of type C to a + reference of type A&, + + --conversion of B to A is better than conversion of C to A */ + if (is_properly_derived_from (from_type1, to) + && is_properly_derived_from (from_type2, to)) + { + if (is_properly_derived_from (from_type2, from_type1)) + return 1; + else if (is_properly_derived_from (from_type1, from_type2)) + return -1; + } + } + + /* [over.ics.rank] + + --S1 and S2 differ only in their qualification conversion and yield + similar types T1 and T2 (_conv.qual_), respectively, and the cv- + qualification signature of type T1 is a proper subset of the cv- + qualification signature of type T2 */ + if (ics1->kind == ck_qual + && ics2->kind == ck_qual + && same_type_p (from_type1, from_type2)) + { + int result = comp_cv_qual_signature (to_type1, to_type2); + if (result != 0) + return result; + } + + /* [over.ics.rank] + + --S1 and S2 are reference bindings (_dcl.init.ref_) and neither refers + to an implicit object parameter, and either S1 binds an lvalue reference + to an lvalue and S2 binds an rvalue reference or S1 binds an rvalue + reference to an rvalue and S2 binds an lvalue reference + (C++0x draft standard, 13.3.3.2) + + --S1 and S2 are reference bindings (_dcl.init.ref_), and the + types to which the references refer are the same type except for + top-level cv-qualifiers, and the type to which the reference + initialized by S2 refers is more cv-qualified than the type to + which the reference initialized by S1 refers */ + + if (ref_conv1 && ref_conv2) + { + if (!ref_conv1->this_p && !ref_conv2->this_p + && (TYPE_REF_IS_RVALUE (ref_conv1->type) + != TYPE_REF_IS_RVALUE (ref_conv2->type))) + { + if (ref_conv1->rvaluedness_matches_p) + return 1; + if (ref_conv2->rvaluedness_matches_p) + return -1; + } + + if (same_type_ignoring_top_level_qualifiers_p (to_type1, to_type2)) + return comp_cv_qualification (TREE_TYPE (ref_conv2->type), + TREE_TYPE (ref_conv1->type)); + } + + /* Neither conversion sequence is better than the other. */ + return 0; +} + +/* The source type for this standard conversion sequence. */ + +static tree +source_type (conversion *t) +{ + for (;; t = t->u.next) + { + if (t->kind == ck_user + || t->kind == ck_ambig + || t->kind == ck_identity) + return t->type; + } + gcc_unreachable (); +} + +/* Note a warning about preferring WINNER to LOSER. We do this by storing + a pointer to LOSER and re-running joust to produce the warning if WINNER + is actually used. */ + +static void +add_warning (struct z_candidate *winner, struct z_candidate *loser) +{ + candidate_warning *cw = (candidate_warning *) + conversion_obstack_alloc (sizeof (candidate_warning)); + cw->loser = loser; + cw->next = winner->warnings; + winner->warnings = cw; +} + +/* Compare two candidates for overloading as described in + [over.match.best]. Return values: + + 1: cand1 is better than cand2 + -1: cand2 is better than cand1 + 0: cand1 and cand2 are indistinguishable */ + +static int +joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn) +{ + int winner = 0; + int off1 = 0, off2 = 0; + size_t i; + size_t len; + + /* Candidates that involve bad conversions are always worse than those + that don't. */ + if (cand1->viable > cand2->viable) + return 1; + if (cand1->viable < cand2->viable) + return -1; + + /* If we have two pseudo-candidates for conversions to the same type, + or two candidates for the same function, arbitrarily pick one. */ + if (cand1->fn == cand2->fn + && (IS_TYPE_OR_DECL_P (cand1->fn))) + return 1; + + /* a viable function F1 + is defined to be a better function than another viable function F2 if + for all arguments i, ICSi(F1) is not a worse conversion sequence than + ICSi(F2), and then */ + + /* for some argument j, ICSj(F1) is a better conversion sequence than + ICSj(F2) */ + + /* For comparing static and non-static member functions, we ignore + the implicit object parameter of the non-static function. The + standard says to pretend that the static function has an object + parm, but that won't work with operator overloading. */ + len = cand1->num_convs; + if (len != cand2->num_convs) + { + int static_1 = DECL_STATIC_FUNCTION_P (cand1->fn); + int static_2 = DECL_STATIC_FUNCTION_P (cand2->fn); + + gcc_assert (static_1 != static_2); + + if (static_1) + off2 = 1; + else + { + off1 = 1; + --len; + } + } + + for (i = 0; i < len; ++i) + { + conversion *t1 = cand1->convs[i + off1]; + conversion *t2 = cand2->convs[i + off2]; + int comp = compare_ics (t1, t2); + + if (comp != 0) + { + if (warn_sign_promo + && (CONVERSION_RANK (t1) + CONVERSION_RANK (t2) + == cr_std + cr_promotion) + && t1->kind == ck_std + && t2->kind == ck_std + && TREE_CODE (t1->type) == INTEGER_TYPE + && TREE_CODE (t2->type) == INTEGER_TYPE + && (TYPE_PRECISION (t1->type) + == TYPE_PRECISION (t2->type)) + && (TYPE_UNSIGNED (t1->u.next->type) + || (TREE_CODE (t1->u.next->type) + == ENUMERAL_TYPE))) + { + tree type = t1->u.next->type; + tree type1, type2; + struct z_candidate *w, *l; + if (comp > 0) + type1 = t1->type, type2 = t2->type, + w = cand1, l = cand2; + else + type1 = t2->type, type2 = t1->type, + w = cand2, l = cand1; + + if (warn) + { + warning (OPT_Wsign_promo, "passing %qT chooses %qT over %qT", + type, type1, type2); + warning (OPT_Wsign_promo, " in call to %qD", w->fn); + } + else + add_warning (w, l); + } + + if (winner && comp != winner) + { + winner = 0; + goto tweak; + } + winner = comp; + } + } + + /* 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 (w->convs[0]); + if (! DECL_CONSTRUCTOR_P (w->fn)) + source = TREE_TYPE (source); + if (warning (OPT_Wconversion, "choosing %qD over %qD", w->fn, l->fn) + && warning (OPT_Wconversion, " for conversion from %qT to %qT", + source, w->second_conv->type)) + { + inform (input_location, " because conversion sequence for the argument is better"); + } + } + else + add_warning (w, l); + } + + if (winner) + return winner; + + /* or, if not that, + F1 is a non-template function and F2 is a template function + specialization. */ + + if (!cand1->template_decl && cand2->template_decl) + return 1; + else if (cand1->template_decl && !cand2->template_decl) + return -1; + + /* or, if not that, + F1 and F2 are template functions and the function template for F1 is + more specialized than the template for F2 according to the partial + ordering rules. */ + + if (cand1->template_decl && cand2->template_decl) + { + winner = more_specialized_fn + (TI_TEMPLATE (cand1->template_decl), + TI_TEMPLATE (cand2->template_decl), + /* [temp.func.order]: The presence of unused ellipsis and default + arguments has no effect on the partial ordering of function + templates. add_function_candidate() will not have + counted the "this" argument for constructors. */ + cand1->num_convs + DECL_CONSTRUCTOR_P (cand1->fn)); + if (winner) + return winner; + } + + /* or, if not that, + the context is an initialization by user-defined conversion (see + _dcl.init_ and _over.match.user_) and the standard conversion + sequence from the return type of F1 to the destination type (i.e., + the type of the entity being initialized) is a better conversion + sequence than the standard conversion sequence from the return type + of F2 to the destination type. */ + + if (cand1->second_conv) + { + winner = compare_ics (cand1->second_conv, cand2->second_conv); + if (winner) + return winner; + } + + /* Check whether we can discard a builtin candidate, either because we + have two identical ones or matching builtin and non-builtin candidates. + + (Pedantically in the latter case the builtin which matched the user + function should not be added to the overload set, but we spot it here. + + [over.match.oper] + ... the builtin candidates include ... + - do not have the same parameter type list as any non-template + non-member candidate. */ + + if (TREE_CODE (cand1->fn) == IDENTIFIER_NODE + || TREE_CODE (cand2->fn) == IDENTIFIER_NODE) + { + for (i = 0; i < len; ++i) + if (!same_type_p (cand1->convs[i]->type, + cand2->convs[i]->type)) + break; + if (i == cand1->num_convs) + { + if (cand1->fn == cand2->fn) + /* Two built-in candidates; arbitrarily pick one. */ + return 1; + else if (TREE_CODE (cand1->fn) == IDENTIFIER_NODE) + /* cand1 is built-in; prefer cand2. */ + return -1; + else + /* cand2 is built-in; prefer cand1. */ + return 1; + } + } + + /* If the two function declarations represent the same function (this can + happen with declarations in multiple scopes and arg-dependent lookup), + arbitrarily choose one. But first make sure the default args we're + using match. */ + if (DECL_P (cand1->fn) && DECL_P (cand2->fn) + && equal_functions (cand1->fn, cand2->fn)) + { + tree parms1 = TYPE_ARG_TYPES (TREE_TYPE (cand1->fn)); + tree parms2 = TYPE_ARG_TYPES (TREE_TYPE (cand2->fn)); + + gcc_assert (!DECL_CONSTRUCTOR_P (cand1->fn)); + + for (i = 0; i < len; ++i) + { + /* Don't crash if the fn is variadic. */ + if (!parms1) + break; + parms1 = TREE_CHAIN (parms1); + parms2 = TREE_CHAIN (parms2); + } + + if (off1) + parms1 = TREE_CHAIN (parms1); + else if (off2) + parms2 = TREE_CHAIN (parms2); + + for (; parms1; ++i) + { + if (!cp_tree_equal (TREE_PURPOSE (parms1), + TREE_PURPOSE (parms2))) + { + if (warn) + { + permerror (input_location, "default argument mismatch in " + "overload resolution"); + inform (input_location, + " candidate 1: %q+#F", cand1->fn); + inform (input_location, + " candidate 2: %q+#F", cand2->fn); + } + else + add_warning (cand1, cand2); + break; + } + parms1 = TREE_CHAIN (parms1); + parms2 = TREE_CHAIN (parms2); + } + + return 1; + } + +tweak: + + /* Extension: If the worst conversion for one candidate is worse than the + worst conversion for the other, take the first. */ + if (!pedantic) + { + conversion_rank rank1 = cr_identity, rank2 = cr_identity; + struct z_candidate *w = 0, *l = 0; + + for (i = 0; i < len; ++i) + { + if (CONVERSION_RANK (cand1->convs[i+off1]) > rank1) + rank1 = CONVERSION_RANK (cand1->convs[i+off1]); + if (CONVERSION_RANK (cand2->convs[i + off2]) > rank2) + rank2 = CONVERSION_RANK (cand2->convs[i + off2]); + } + if (rank1 < rank2) + winner = 1, w = cand1, l = cand2; + if (rank1 > rank2) + winner = -1, w = cand2, l = cand1; + if (winner) + { + /* Don't choose a deleted function over ambiguity. */ + if (DECL_P (w->fn) && DECL_DELETED_FN (w->fn)) + return 0; + if (warn) + { + pedwarn (input_location, 0, + "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; + } + } + + gcc_assert (!winner); + return 0; +} + +/* Given a list of candidates for overloading, find the best one, if any. + This algorithm has a worst case of O(2n) (winner is last), and a best + case of O(n/2) (totally ambiguous); much better than a sorting + algorithm. */ + +static struct z_candidate * +tourney (struct z_candidate *candidates) +{ + struct z_candidate *champ = candidates, *challenger; + int fate; + int champ_compared_to_predecessor = 0; + + /* Walk through the list once, comparing each current champ to the next + candidate, knocking out a candidate or two with each comparison. */ + + for (challenger = champ->next; challenger; ) + { + fate = joust (champ, challenger, 0); + if (fate == 1) + challenger = challenger->next; + else + { + if (fate == 0) + { + champ = challenger->next; + if (champ == 0) + return NULL; + champ_compared_to_predecessor = 0; + } + else + { + champ = challenger; + champ_compared_to_predecessor = 1; + } + + challenger = champ->next; + } + } + + /* Make sure the champ is better than all the candidates it hasn't yet + been compared to. */ + + for (challenger = candidates; + challenger != champ + && !(champ_compared_to_predecessor && challenger->next == champ); + challenger = challenger->next) + { + fate = joust (champ, challenger, 0); + if (fate != 1) + return NULL; + } + + return champ; +} + +/* 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, LOOKUP_IMPLICIT); +} + +/* Returns nonzero if ARG (of type FROM) can be converted to TO. */ + +bool +can_convert_arg (tree to, tree from, tree arg, int flags) +{ + conversion *t; + void *p; + bool ok_p; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + t = implicit_conversion (to, from, arg, /*c_cast_p=*/false, + flags); + ok_p = (t && !t->bad_p); + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return ok_p; +} + +/* Like can_convert_arg, but allows dubious conversions as well. */ + +bool +can_convert_arg_bad (tree to, tree from, tree arg, int flags) +{ + conversion *t; + void *p; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + /* Try to perform the conversion. */ + t = implicit_conversion (to, from, arg, /*c_cast_p=*/false, + flags); + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return t != NULL; +} + +/* Convert EXPR to TYPE. Return the converted expression. + + Note that we allow bad conversions here because by the time we get to + this point we are committed to doing the conversion. If we end up + doing a bad conversion, convert_like will complain. */ + +tree +perform_implicit_conversion_flags (tree type, tree expr, tsubst_flags_t complain, int flags) +{ + conversion *conv; + void *p; + + if (error_operand_p (expr)) + return error_mark_node; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + conv = implicit_conversion (type, TREE_TYPE (expr), expr, + /*c_cast_p=*/false, + flags); + + if (!conv) + { + if (complain & tf_error) + { + /* If expr has unknown type, then it is an overloaded function. + Call instantiate_type to get good error messages. */ + if (TREE_TYPE (expr) == unknown_type_node) + instantiate_type (type, expr, complain); + else if (invalid_nonstatic_memfn_p (expr, complain)) + /* We gave an error. */; + else + error ("could not convert %qE from %qT to %qT", expr, + TREE_TYPE (expr), type); + } + expr = error_mark_node; + } + else if (processing_template_decl + && !(SCALAR_TYPE_P (type) && SCALAR_TYPE_P (TREE_TYPE (expr)))) + { + /* In a template, we are only concerned about determining the + type of non-dependent expressions, so we do not have to + perform the actual conversion. */ + if (TREE_TYPE (expr) != type) + expr = build_nop (type, expr); + } + else + expr = convert_like (conv, expr, complain); + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return expr; +} + +tree +perform_implicit_conversion (tree type, tree expr, tsubst_flags_t complain) +{ + return perform_implicit_conversion_flags (type, expr, complain, LOOKUP_IMPLICIT); +} + +/* Convert EXPR to TYPE (as a direct-initialization) if that is + permitted. If the conversion is valid, the converted expression is + returned. Otherwise, NULL_TREE is returned, except in the case + that TYPE is a class type; in that case, an error is issued. If + C_CAST_P is true, then this direction initialization is taking + place as part of a static_cast being attempted as part of a C-style + cast. */ + +tree +perform_direct_initialization_if_possible (tree type, + tree expr, + bool c_cast_p, + tsubst_flags_t complain) +{ + conversion *conv; + void *p; + + if (type == error_mark_node || error_operand_p (expr)) + return error_mark_node; + /* [dcl.init] + + If the destination type is a (possibly cv-qualified) class type: + + -- If the initialization is direct-initialization ..., + constructors are considered. ... If no constructor applies, or + the overload resolution is ambiguous, the initialization is + ill-formed. */ + if (CLASS_TYPE_P (type)) + { + VEC(tree,gc) *args = make_tree_vector_single (expr); + expr = build_special_member_call (NULL_TREE, complete_ctor_identifier, + &args, type, LOOKUP_NORMAL, complain); + release_tree_vector (args); + return build_cplus_new (type, expr); + } + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + conv = implicit_conversion (type, TREE_TYPE (expr), expr, + c_cast_p, + LOOKUP_NORMAL); + if (!conv || conv->bad_p) + expr = NULL_TREE; + else + expr = convert_like_real (conv, expr, NULL_TREE, 0, 0, + /*issue_conversion_warnings=*/false, + c_cast_p, + complain); + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return expr; +} + +/* DECL is a VAR_DECL whose type is a REFERENCE_TYPE. The reference + is being bound to a temporary. Create and return a new VAR_DECL + with the indicated TYPE; this variable will store the value to + which the reference is bound. */ + +tree +make_temporary_var_for_ref_to_temp (tree decl, tree type) +{ + tree var; + + /* Create the variable. */ + var = create_temporary_var (type); + + /* Register the variable. */ + if (TREE_STATIC (decl)) + { + /* Namespace-scope or local static; give it a mangled name. */ + tree name; + + TREE_STATIC (var) = 1; + name = mangle_ref_init_variable (decl); + DECL_NAME (var) = name; + SET_DECL_ASSEMBLER_NAME (var, name); + var = pushdecl_top_level (var); + } + else + /* Create a new cleanup level if necessary. */ + maybe_push_cleanup_level (type); + + return var; +} + +/* EXPR is the initializer for a variable DECL of reference or + std::initializer_list type. Create, push and return a new VAR_DECL + for the initializer so that it will live as long as DECL. Any + cleanup for the new variable is returned through CLEANUP, and the + code to initialize the new variable is returned through INITP. */ + +tree +set_up_extended_ref_temp (tree decl, tree expr, tree *cleanup, tree *initp) +{ + tree init; + tree type; + tree var; + + /* Create the temporary variable. */ + 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 initialize + VAR. */ + if (TREE_CODE (expr) != TARGET_EXPR) + expr = get_target_expr (expr); + + /* If the initializer is constant, put it in DECL_INITIAL so we get + static initialization and use in constant expressions. */ + init = maybe_constant_init (expr); + if (TREE_CONSTANT (init)) + { + if (literal_type_p (type) && CP_TYPE_CONST_NON_VOLATILE_P (type)) + { + /* 5.19 says that a constant expression can include an + lvalue-rvalue conversion applied to "a glvalue of literal type + that refers to a non-volatile temporary object initialized + with a constant expression". Rather than try to communicate + that this VAR_DECL is a temporary, just mark it constexpr. + + Currently this is only useful for initializer_list temporaries, + since reference vars can't appear in constant expressions. */ + DECL_DECLARED_CONSTEXPR_P (var) = true; + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (var) = true; + TREE_CONSTANT (var) = true; + } + DECL_INITIAL (var) = init; + init = NULL_TREE; + } + else + /* Create the INIT_EXPR that will initialize the temporary + variable. */ + init = build2 (INIT_EXPR, type, var, expr); + if (at_function_scope_p ()) + { + add_decl_expr (var); + + if (TREE_STATIC (var)) + init = add_stmt_to_compound (init, register_dtor_fn (var)); + else + *cleanup = cxx_maybe_build_cleanup (var); + + /* We must be careful to destroy the temporary only + after its initialization has taken place. If the + initialization throws an exception, then the + destructor should not be run. We cannot simply + transform INIT into something like: + + (INIT, ({ CLEANUP_STMT; })) + + because emit_local_var always treats the + initializer as a full-expression. Thus, the + destructor would run too early; it would run at the + end of initializing the reference variable, rather + than at the end of the block enclosing the + reference variable. + + The solution is to pass back a cleanup expression + which the caller is responsible for attaching to + the statement tree. */ + } + else + { + rest_of_decl_compilation (var, /*toplev=*/1, at_eof); + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + static_aggregates = tree_cons (NULL_TREE, var, + static_aggregates); + } + + *initp = init; + 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 an expression + that should be pushed as a cleanup after the returned expression + is used to initialize DECL. + + Return the converted expression. */ + +tree +initialize_reference (tree type, tree expr, tree decl, tree *cleanup, + tsubst_flags_t complain) +{ + conversion *conv; + void *p; + + if (type == error_mark_node || error_operand_p (expr)) + return error_mark_node; + + /* Get the high-water mark for the CONVERSION_OBSTACK. */ + p = conversion_obstack_alloc (0); + + conv = reference_binding (type, TREE_TYPE (expr), expr, /*c_cast_p=*/false, + LOOKUP_NORMAL); + if (!conv || conv->bad_p) + { + if (complain & tf_error) + { + if (!CP_TYPE_CONST_P (TREE_TYPE (type)) + && !TYPE_REF_IS_RVALUE (type) + && !real_lvalue_p (expr)) + error ("invalid initialization of non-const reference of " + "type %qT from an rvalue of type %qT", + type, TREE_TYPE (expr)); + else + error ("invalid initialization of reference of type " + "%qT from expression of type %qT", type, + TREE_TYPE (expr)); + } + return error_mark_node; + } + + /* If DECL is non-NULL, then this special rule applies: + + [class.temporary] + + The temporary to which the reference is bound or the temporary + that is the complete object to which the reference is bound + persists for the lifetime of the reference. + + The temporaries created during the evaluation of the expression + initializing the reference, except the temporary to which the + reference is bound, are destroyed at the end of the + full-expression in which they are created. + + In that case, we store the converted expression into a new + VAR_DECL in a new scope. + + However, we want to be careful not to create temporaries when + they are not required. For example, given: + + struct B {}; + struct D : public B {}; + D f(); + const B& b = f(); + + there is no need to copy the return value from "f"; we can just + extend its lifetime. Similarly, given: + + struct S {}; + struct T { operator S(); }; + T t; + const S& s = t; + + we can extend the lifetime of the return value of the conversion + operator. */ + gcc_assert (conv->kind == ck_ref_bind); + if (decl) + { + tree var; + tree base_conv_type; + + /* Skip over the REF_BIND. */ + conv = conv->u.next; + /* If the next conversion is a BASE_CONV, skip that too -- but + remember that the conversion was required. */ + if (conv->kind == ck_base) + { + base_conv_type = conv->type; + conv = conv->u.next; + } + else + base_conv_type = NULL_TREE; + /* Perform the remainder of the conversion. */ + expr = convert_like_real (conv, expr, + /*fn=*/NULL_TREE, /*argnum=*/0, + /*inner=*/-1, + /*issue_conversion_warnings=*/true, + /*c_cast_p=*/false, + tf_warning_or_error); + if (error_operand_p (expr)) + expr = error_mark_node; + else + { + if (!lvalue_or_rvalue_with_address_p (expr)) + { + tree init; + var = set_up_extended_ref_temp (decl, expr, cleanup, &init); + /* Use its address to initialize the reference variable. */ + expr = build_address (var); + if (base_conv_type) + expr = convert_to_base (expr, + build_pointer_type (base_conv_type), + /*check_access=*/true, + /*nonnull=*/true, complain); + if (init) + expr = build2 (COMPOUND_EXPR, TREE_TYPE (expr), init, expr); + } + else + /* Take the address of EXPR. */ + expr = cp_build_addr_expr (expr, tf_warning_or_error); + /* If a BASE_CONV was required, perform it now. */ + if (base_conv_type) + expr = (perform_implicit_conversion + (build_pointer_type (base_conv_type), expr, + tf_warning_or_error)); + expr = build_nop (type, expr); + } + } + else + /* Perform the conversion. */ + expr = convert_like (conv, expr, tf_warning_or_error); + + /* Free all the conversions we allocated. */ + obstack_free (&conversion_obstack, p); + + return expr; +} + +/* Returns true iff TYPE is some variant of std::initializer_list. */ + +bool +is_std_init_list (tree type) +{ + /* Look through typedefs. */ + if (!TYPE_P (type)) + return false; + type = TYPE_MAIN_VARIANT (type); + return (CLASS_TYPE_P (type) + && CP_TYPE_CONTEXT (type) == std_node + && strcmp (TYPE_NAME_STRING (type), "initializer_list") == 0); +} + +/* Returns true iff DECL is a list constructor: i.e. a constructor which + will accept an argument list of a single std::initializer_list. */ + +bool +is_list_ctor (tree decl) +{ + tree args = FUNCTION_FIRST_USER_PARMTYPE (decl); + tree arg; + + if (!args || args == void_list_node) + return false; + + arg = non_reference (TREE_VALUE (args)); + if (!is_std_init_list (arg)) + return false; + + args = TREE_CHAIN (args); + + if (args && args != void_list_node && !TREE_PURPOSE (args)) + /* There are more non-defaulted parms. */ + return false; + + return true; +} + +#include "gt-cp-call.h" diff --git a/gcc/cp/cfns.gperf b/gcc/cp/cfns.gperf new file mode 100644 index 000000000..ef1ed083d --- /dev/null +++ b/gcc/cp/cfns.gperf @@ -0,0 +1,247 @@ +%{ +/* Copyright (C) 2000, 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 3, 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 COPYING3. If not see +. */ +#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. +# +# [lib.res.on.exception.handling]: None of the functions from the +# Standard C library shall report an error by throwing an +# exception, unless it calls a program-supplied function that +# throws an exception. +# +# Specific functions are commented out for the reason noted in each case. +# +# abort -- synchronous exception from SIGABRT handler +abs +acos +asctime +asin +atan +atan2 +atexit +atof +atoi +atol +#bsearch -- calls user function which may throw exception +btowc +calloc +ceil +clearerr +clock +cos +cosh +ctime +difftime +div +exit +exp +fabs +#fclose -- POSIX thread cancellation point +feof +ferror +#fflush -- POSIX thread cancellation point +#fgetc -- POSIX thread cancellation point +#fgetpos -- POSIX thread cancellation point +#fgets -- POSIX thread cancellation point +#fgetwc -- POSIX thread cancellation point +#fgetws -- POSIX thread cancellation point +floor +fmod +#fopen -- POSIX thread cancellation point +#fprintf -- POSIX thread cancellation point +#fputc -- POSIX thread cancellation point +#fputs -- POSIX thread cancellation point +#fputwc -- POSIX thread cancellation point +#fputws -- POSIX thread cancellation point +#fread -- POSIX thread cancellation point +free +#freopen -- POSIX thread cancellation point +frexp +#fscanf -- POSIX thread cancellation point +fseek +#fsetpos -- POSIX thread cancellation point +#ftell -- POSIX thread cancellation point +fwide +#fwprintf -- POSIX thread cancellation point +#fwrite -- POSIX thread cancellation point +#fwscanf -- POSIX thread cancellation point +#getc -- POSIX thread cancellation point +#getchar -- POSIX thread cancellation point +getenv +#gets -- POSIX thread cancellation point +#getwc -- POSIX thread cancellation point +#getwchar -- POSIX thread cancellation point +gmtime +isalnum +isalpha +iscntrl +isdigit +isgraph +islower +isprint +ispunct +isspace +isupper +iswalnum +iswalpha +iswcntrl +iswctype +iswdigit +iswgraph +iswlower +iswprint +iswpunct +iswspace +iswupper +iswxdigit +isxdigit +labs +ldexp +ldiv +localeconv +localtime +log +log10 +longjmp +malloc +mblen +mbrlen +mbrtowc +mbsinit +mbsrtowcs +mbstowcs +mbtowc +memchr +memcmp +memcpy +memmove +memset +mktime +modf +#perror -- POSIX thread cancellation point +pow +#printf -- POSIX thread cancellation point +#putc -- POSIX thread cancellation point +#putchar -- POSIX thread cancellation point +#puts -- POSIX thread cancellation point +#putwc -- POSIX thread cancellation point +#putwchar -- POSIX thread cancellation point +#qsort -- calls user function which may throw exception +#raise -- synchronous exception from signal handler +rand +realloc +#remove -- POSIX thread cancellation point +#rename -- POSIX thread cancellation point +#rewind -- POSIX thread cancellation point +#scanf -- POSIX thread cancellation point +setbuf +setlocale +setvbuf +signal +sin +sinh +sprintf +sqrt +srand +sscanf +strcat +strchr +strcmp +strcoll +strcpy +strcspn +#strerror -- POSIX thread cancellation point +strftime +strlen +strncat +strncmp +strncpy +strpbrk +strrchr +strspn +strstr +strtod +strtok +strtol +strtoul +strxfrm +swprintf +swscanf +#system -- POSIX thread cancellation point +tan +tanh +time +#tmpfile -- POSIX thread cancellation point +#tmpnam -- POSIX thread cancellation point +tolower +toupper +towctrans +towlower +towupper +#ungetc -- POSIX thread cancellation point +#ungetwc -- POSIX thread cancellation point +#vfprintf -- POSIX thread cancellation point +#vfwprintf -- POSIX thread cancellation point +#vprintf -- POSIX thread cancellation point +vsprintf +vswprintf +#vwprintf -- POSIX thread cancellation point +wcrtomb +wcscat +wcschr +wcscmp +wcscoll +wcscpy +wcscspn +wcsftime +wcslen +wcsncat +wcsncmp +wcsncpy +wcspbrk +wcsrchr +wcsrtombs +wcsspn +wcsstr +wcstod +wcstok +wcstol +wcstombs +wcstoul +wcsxfrm +wctob +wctomb +wctrans +wctype +wmemchr +wmemcmp +wmemcpy +wmemmove +wmemset +#wprintf -- POSIX thread cancellation point +#wscanf -- POSIX thread cancellation point diff --git a/gcc/cp/cfns.h b/gcc/cp/cfns.h new file mode 100644 index 000000000..62cdfab93 --- /dev/null +++ b/gcc/cp/cfns.h @@ -0,0 +1,365 @@ +/* ANSI-C code produced by gperf version 3.0.3 */ +/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C 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 "cfns.gperf" + +/* Copyright (C) 2000, 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 3, 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 COPYING3. If not see +. */ +#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 +#else +#ifdef __cplusplus +inline +#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; + } + return hval + asso_values[(unsigned char)str[len - 1]]; +} + +#ifdef __GNUC__ +__inline +#ifdef __GNUC_STDC_INLINE__ +__attribute__ ((__gnu_inline__)) +#endif +#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) + { + register int key = hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int index = lookup[key]; + + if (index >= 0) + { + register const char *s = wordlist[index]; + + if (*str == *s && !strcmp (str + 1, s + 1)) + return s; + } + } + } + return 0; +} diff --git a/gcc/cp/class.c b/gcc/cp/class.c new file mode 100644 index 000000000..c6fbbabdb --- /dev/null +++ b/gcc/cp/class.c @@ -0,0 +1,8472 @@ +/* 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, 2005, 2007, 2008, 2009, 2010, 2011 + 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 3, 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 COPYING3. If not see +. */ + + +/* High-level class interface. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "flags.h" +#include "output.h" +#include "toplev.h" +#include "target.h" +#include "convert.h" +#include "cgraph.h" +#include "tree-dump.h" +#include "splay-tree.h" + +/* The number of nested classes being processed. If we are not in the + scope of any class, this is zero. */ + +int current_class_depth; + +/* In order to deal with nested classes, we keep a stack of classes. + The topmost entry is the innermost class, and is the entry at index + CURRENT_CLASS_DEPTH */ + +typedef struct class_stack_node { + /* The name of the class. */ + tree name; + + /* The _TYPE node for the class. */ + tree type; + + /* The access specifier pending for new declarations in the scope of + this class. */ + tree access; + + /* If were defining TYPE, the names used in this class. */ + splay_tree names_used; + + /* Nonzero if this class is no longer open, because of a call to + push_to_top_level. */ + size_t hidden; +}* class_stack_node_t; + +typedef struct vtbl_init_data_s +{ + /* The base for which we're building initializers. */ + tree binfo; + /* The type of the most-derived type. */ + tree derived; + /* The binfo for the dynamic type. This will be TYPE_BINFO (derived), + unless ctor_vtbl_p is true. */ + tree rtti_binfo; + /* The negative-index vtable initializers built up so far. These + are in order from least negative index to most negative index. */ + VEC(constructor_elt,gc) *inits; + /* The binfo for the virtual base for which we're building + vcall offset initializers. */ + tree vbase; + /* The functions in vbase for which we have already provided vcall + offsets. */ + VEC(tree,gc) *fns; + /* The vtable index of the next vcall or vbase offset. */ + tree index; + /* Nonzero if we are building the initializer for the primary + vtable. */ + int primary_vtbl_p; + /* Nonzero if we are building the initializer for a construction + vtable. */ + int ctor_vtbl_p; + /* True when adding vcall offset entries to the vtable. False when + merely computing the indices. */ + bool generate_vcall_entries; +} 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; + +/* The size of the largest empty class seen in this translation unit. */ +static GTY (()) tree sizeof_biggest_empty_class; + +/* An array of all local classes present in this translation unit, in + declaration order. */ +VEC(tree,gc) *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 tree dfs_modify_vtables (tree, void *); +static tree modify_all_vtables (tree, tree); +static void determine_primary_bases (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); +static tree fixed_type_or_null (tree, int *, int *); +static tree build_simple_base_path (tree expr, tree binfo); +static tree build_vtbl_ref_1 (tree, tree); +static void build_vtbl_initializer (tree, tree, tree, tree, int *, + VEC(constructor_elt,gc) **); +static int count_fields (tree); +static int add_fields_to_record_type (tree, struct sorted_fields_type*, int); +static bool check_bitfield_decl (tree); +static void check_field_decl (tree, tree, int *, int *, int *); +static void check_field_decls (tree, tree *, 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 *); +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 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_pre (tree, void *); +static tree dfs_find_final_overrider_post (tree, void *); +static tree find_final_overrider (tree, tree, tree); +static int make_new_vtable (tree, tree); +static tree get_primary_binfo (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, VEC(constructor_elt,gc) *); +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 (record_layout_info, tree, tree, splay_tree); +static void accumulate_vtbl_inits (tree, tree, tree, tree, tree, + VEC(constructor_elt,gc) **); +static void dfs_accumulate_vtbl_inits (tree, tree, tree, tree, tree, + VEC(constructor_elt,gc) **); +static void build_rtti_vtbl_entries (tree, vtbl_init_data *); +static void build_vcall_and_vbase_vtbl_entries (tree, vtbl_init_data *); +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 void build_ctor_vtbl_group (tree, tree); +static void build_vtt (tree); +static tree binfo_ctor_vtable (tree); +static void build_vtt_inits (tree, tree, VEC(constructor_elt,gc) **, tree *); +static tree dfs_build_secondary_vptr_vtt_inits (tree, void *); +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, bool); +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); +static tree get_vcall_index (tree, tree); + +/* Variables shared between class.c and call.c. */ + +#ifdef GATHER_STATISTICS +int n_vtables = 0; +int n_vtable_entries = 0; +int n_vtable_searches = 0; +int n_vtable_elems = 0; +int n_convert_harshness = 0; +int n_compute_conversion_costs = 0; +int n_inner_fields_searched = 0; +#endif + +/* Convert to or from a base subobject. EXPR is an expression of type + `A' or `A*', an expression of type `B' or `B*' is returned. To + convert A to a base B, CODE is PLUS_EXPR and BINFO is the binfo for + the B base instance within A. To convert base A to derived B, CODE + is MINUS_EXPR and BINFO is the binfo for the A instance within B. + In this latter case, A must not be a morally virtual base of B. + NONNULL is true if EXPR is known to be non-NULL (this is only + needed when EXPR is of pointer type). CV qualifiers are preserved + 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; + tree probe; + tree offset; + tree target_type; + tree null_test = NULL; + tree ptr_target_type; + int fixed_type_p; + int want_pointer = TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE; + bool has_empty = false; + bool virtual_access; + + if (expr == error_mark_node || binfo == error_mark_node || !binfo) + return error_mark_node; + + for (probe = binfo; probe; probe = BINFO_INHERITANCE_CHAIN (probe)) + { + d_binfo = probe; + if (is_empty_class (BINFO_TYPE (probe))) + has_empty = true; + if (!v_binfo && BINFO_VIRTUAL_P (probe)) + v_binfo = probe; + } + + probe = TYPE_MAIN_VARIANT (TREE_TYPE (expr)); + if (want_pointer) + probe = TYPE_MAIN_VARIANT (TREE_TYPE (probe)); + + gcc_assert ((code == MINUS_EXPR + && SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), probe)) + || (code == PLUS_EXPR + && SAME_BINFO_TYPE_P (BINFO_TYPE (d_binfo), probe))); + + if (binfo == d_binfo) + /* Nothing to do. */ + return expr; + + if (code == MINUS_EXPR && v_binfo) + { + error ("cannot convert from base %qT to derived type %qT via virtual base %qT", + BINFO_TYPE (binfo), BINFO_TYPE (d_binfo), BINFO_TYPE (v_binfo)); + return error_mark_node; + } + + if (!want_pointer) + /* This must happen before the call to save_expr. */ + expr = cp_build_addr_expr (expr, tf_warning_or_error); + else + expr = mark_rvalue_use (expr); + + offset = BINFO_OFFSET (binfo); + fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull); + target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo); + /* TARGET_TYPE has been extracted from BINFO, and, is therefore always + cv-unqualified. Extract the cv-qualifiers from EXPR so that the + expression returned matches the input. */ + target_type = cp_build_qualified_type + (target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr)))); + ptr_target_type = build_pointer_type (target_type); + + /* Do we need to look in the vtable for the real offset? */ + virtual_access = (v_binfo && fixed_type_p <= 0); + + /* Don't bother with the calculations inside sizeof; they'll ICE if the + source type is incomplete and the pointer value doesn't matter. */ + if (cp_unevaluated_operand != 0) + { + expr = build_nop (ptr_target_type, expr); + if (!want_pointer) + expr = build_indirect_ref (EXPR_LOCATION (expr), expr, RO_NULL); + return expr; + } + + /* Do we need to check for a null pointer? */ + if (want_pointer && !nonnull) + { + /* If we know the conversion will not actually change the value + of EXPR, then we can avoid testing the expression for NULL. + We have to avoid generating a COMPONENT_REF for a base class + field, because other parts of the compiler know that such + expressions are always non-NULL. */ + if (!virtual_access && integer_zerop (offset)) + return build_nop (ptr_target_type, expr); + null_test = error_mark_node; + } + + /* Protect against multiple evaluation if necessary. */ + if (TREE_SIDE_EFFECTS (expr) && (null_test || virtual_access)) + expr = save_expr (expr); + + /* Now that we've saved expr, build the real null test. */ + if (null_test) + { + tree zero = cp_convert (TREE_TYPE (expr), integer_zero_node); + null_test = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, + expr, zero); + } + + /* If this is a simple base reference, express it as a COMPONENT_REF. */ + if (code == PLUS_EXPR && !virtual_access + /* We don't build base fields for empty bases, and they aren't very + interesting to the optimizers anyway. */ + && !has_empty) + { + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); + expr = build_simple_base_path (expr, binfo); + if (want_pointer) + expr = build_address (expr); + target_type = TREE_TYPE (expr); + goto out; + } + + if (virtual_access) + { + /* Going via virtual base V_BINFO. We need the static offset + from V_BINFO to BINFO, and the dynamic offset from D_BINFO to + V_BINFO. That offset is an entry in D_BINFO's vtable. */ + tree v_offset; + + if (fixed_type_p < 0 && in_base_initializer) + { + /* In a base member initializer, we cannot rely on the + vtable being set up. We have to indirect via the + vtt_parm. */ + tree t; + + t = TREE_TYPE (TYPE_VFIELD (current_class_type)); + t = build_pointer_type (t); + v_offset = convert (t, current_vtt_parm); + v_offset = cp_build_indirect_ref (v_offset, RO_NULL, + tf_warning_or_error); + } + else + v_offset = build_vfield_ref (cp_build_indirect_ref (expr, RO_NULL, + tf_warning_or_error), + TREE_TYPE (TREE_TYPE (expr))); + + v_offset = build2 (POINTER_PLUS_EXPR, TREE_TYPE (v_offset), + v_offset, fold_convert (sizetype, BINFO_VPTR_FIELD (v_binfo))); + v_offset = build1 (NOP_EXPR, + build_pointer_type (ptrdiff_type_node), + v_offset); + v_offset = cp_build_indirect_ref (v_offset, RO_NULL, tf_warning_or_error); + TREE_CONSTANT (v_offset) = 1; + + offset = convert_to_integer (ptrdiff_type_node, + size_diffop_loc (input_location, offset, + BINFO_OFFSET (v_binfo))); + + if (!integer_zerop (offset)) + v_offset = build2 (code, ptrdiff_type_node, v_offset, offset); + + if (fixed_type_p < 0) + /* Negative fixed_type_p means this is a constructor or destructor; + virtual base layout is fixed in in-charge [cd]tors, but not in + base [cd]tors. */ + offset = build3 (COND_EXPR, ptrdiff_type_node, + build2 (EQ_EXPR, boolean_type_node, + current_in_charge_parm, integer_zero_node), + v_offset, + convert_to_integer (ptrdiff_type_node, + BINFO_OFFSET (binfo))); + else + offset = v_offset; + } + + if (want_pointer) + target_type = ptr_target_type; + + expr = build1 (NOP_EXPR, ptr_target_type, expr); + + if (!integer_zerop (offset)) + { + offset = fold_convert (sizetype, offset); + if (code == MINUS_EXPR) + offset = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, offset); + expr = build2 (POINTER_PLUS_EXPR, ptr_target_type, expr, offset); + } + else + null_test = NULL; + + if (!want_pointer) + expr = cp_build_indirect_ref (expr, RO_NULL, tf_warning_or_error); + + out: + if (null_test) + expr = fold_build3_loc (input_location, COND_EXPR, target_type, null_test, expr, + build_zero_cst (target_type)); + + return expr; +} + +/* Subroutine of build_base_path; EXPR and BINFO are as in that function. + Perform a derived-to-base conversion by recursively building up a + sequence of COMPONENT_REFs to the appropriate base fields. */ + +static tree +build_simple_base_path (tree expr, tree binfo) +{ + tree type = BINFO_TYPE (binfo); + tree d_binfo = BINFO_INHERITANCE_CHAIN (binfo); + tree field; + + if (d_binfo == NULL_TREE) + { + tree temp; + + gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type); + + /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' + into `(*(a ? &b : &c)).x', and so on. A COND_EXPR is only + an lvalue in the front end; only _DECLs and _REFs are lvalues + in the back end. */ + temp = unary_complex_lvalue (ADDR_EXPR, expr); + if (temp) + expr = cp_build_indirect_ref (temp, RO_NULL, tf_warning_or_error); + + return expr; + } + + /* Recurse. */ + expr = build_simple_base_path (expr, d_binfo); + + for (field = TYPE_FIELDS (BINFO_TYPE (d_binfo)); + field; field = DECL_CHAIN (field)) + /* Is this the base field created by build_base_field? */ + if (TREE_CODE (field) == FIELD_DECL + && DECL_FIELD_IS_BASE (field) + && TREE_TYPE (field) == type + /* If we're looking for a field in the most-derived class, + also check the field offset; we can have two base fields + of the same type if one is an indirect virtual base and one + is a direct non-virtual base. */ + && (BINFO_INHERITANCE_CHAIN (d_binfo) + || tree_int_cst_equal (byte_position (field), + BINFO_OFFSET (binfo)))) + { + /* We don't use build_class_member_access_expr here, as that + has unnecessary checks, and more importantly results in + recursive calls to dfs_walk_once. */ + int type_quals = cp_type_quals (TREE_TYPE (expr)); + + expr = build3 (COMPONENT_REF, + cp_build_qualified_type (type, type_quals), + expr, field, NULL_TREE); + expr = fold_if_not_in_template (expr); + + /* Mark the expression const or volatile, as appropriate. + Even though we've dealt with the type above, we still have + to mark the expression itself. */ + if (type_quals & TYPE_QUAL_CONST) + TREE_READONLY (expr) = 1; + if (type_quals & TYPE_QUAL_VOLATILE) + TREE_THIS_VOLATILE (expr) = 1; + + return expr; + } + + /* Didn't find the base field?!? */ + gcc_unreachable (); +} + +/* Convert OBJECT to the base TYPE. OBJECT is an expression whose + type is a class type or a pointer to a class type. In the former + case, TYPE is also a class type; in the latter it is another + pointer type. If CHECK_ACCESS is true, an error message is emitted + if TYPE is inaccessible. If OBJECT has pointer type, the value is + assumed to be non-NULL. */ + +tree +convert_to_base (tree object, tree type, bool check_access, bool nonnull, + tsubst_flags_t complain) +{ + tree binfo; + tree object_type; + base_access access; + + if (TYPE_PTR_P (TREE_TYPE (object))) + { + object_type = TREE_TYPE (TREE_TYPE (object)); + type = TREE_TYPE (type); + } + else + object_type = TREE_TYPE (object); + + access = check_access ? ba_check : ba_unique; + if (!(complain & tf_error)) + access |= ba_quiet; + binfo = lookup_base (object_type, type, + access, + NULL); + if (!binfo || binfo == error_mark_node) + return error_mark_node; + + return build_base_path (PLUS_EXPR, object, binfo, nonnull); +} + +/* EXPR is an expression with unqualified class type. BASE is a base + binfo of that class type. Returns EXPR, converted to the BASE + type. This function assumes that EXPR is the most derived class; + therefore virtual bases can be found at their static offsets. */ + +tree +convert_to_base_statically (tree expr, tree base) +{ + tree expr_type; + + expr_type = TREE_TYPE (expr); + if (!SAME_BINFO_TYPE_P (BINFO_TYPE (base), expr_type)) + { + tree pointer_type; + + /* If this is a non-empty base, use a COMPONENT_REF. */ + if (!is_empty_class (BINFO_TYPE (base))) + return build_simple_base_path (expr, base); + + pointer_type = build_pointer_type (expr_type); + + /* We use fold_build2 and fold_convert below to simplify the trees + provided to the optimizers. It is not safe to call these functions + when processing a template because they do not handle C++-specific + trees. */ + gcc_assert (!processing_template_decl); + expr = cp_build_addr_expr (expr, tf_warning_or_error); + if (!integer_zerop (BINFO_OFFSET (base))) + expr = fold_build2_loc (input_location, + POINTER_PLUS_EXPR, pointer_type, expr, + fold_convert (sizetype, BINFO_OFFSET (base))); + expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr); + expr = build_fold_indirect_ref_loc (input_location, expr); + } + + return expr; +} + + +tree +build_vfield_ref (tree datum, tree type) +{ + tree vfield, vcontext; + + if (datum == error_mark_node) + return error_mark_node; + + /* First, convert to the requested type. */ + if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (datum), type)) + datum = convert_to_base (datum, type, /*check_access=*/false, + /*nonnull=*/true, tf_warning_or_error); + + /* Second, the requested type may not be the owner of its own vptr. + If not, convert to the base class that owns it. We cannot use + convert_to_base here, because VCONTEXT may appear more than once + in the inheritance hierarchy of TYPE, and thus direct conversion + between the types may be ambiguous. Following the path back up + one step at a time via primary bases avoids the problem. */ + vfield = TYPE_VFIELD (type); + vcontext = DECL_CONTEXT (vfield); + while (!same_type_ignoring_top_level_qualifiers_p (vcontext, type)) + { + datum = build_simple_base_path (datum, CLASSTYPE_PRIMARY_BINFO (type)); + type = TREE_TYPE (datum); + } + + return build3 (COMPONENT_REF, TREE_TYPE (vfield), datum, vfield, NULL_TREE); +} + +/* 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; + + /* Try to figure out what a reference refers to, and + access its virtual function table directly. */ + + int cdtorp = 0; + tree fixed_type = fixed_type_or_null (instance, NULL, &cdtorp); + + tree basetype = non_reference (TREE_TYPE (instance)); + + if (fixed_type && !cdtorp) + { + tree binfo = lookup_base (fixed_type, basetype, + ba_unique | ba_quiet, NULL); + if (binfo) + vtbl = unshare_expr (BINFO_VTABLE (binfo)); + } + + if (!vtbl) + vtbl = build_vfield_ref (instance, basetype); + + aref = build_array_ref (input_location, vtbl, idx); + TREE_CONSTANT (aref) |= TREE_CONSTANT (vtbl) && TREE_CONSTANT (idx); + + return aref; +} + +tree +build_vtbl_ref (tree instance, tree idx) +{ + tree aref = build_vtbl_ref_1 (instance, idx); + + return aref; +} + +/* Given a stable object pointer INSTANCE_PTR, return an expression which + yields a function pointer corresponding to vtable element INDEX. */ + +tree +build_vfn_ref (tree instance_ptr, tree idx) +{ + tree aref; + + aref = build_vtbl_ref_1 (cp_build_indirect_ref (instance_ptr, RO_NULL, + tf_warning_or_error), + idx); + + /* When using function descriptors, the address of the + vtable entry is treated as a function pointer. */ + if (TARGET_VTABLE_USES_DESCRIPTORS) + aref = build1 (NOP_EXPR, TREE_TYPE (aref), + cp_build_addr_expr (aref, tf_warning_or_error)); + + /* Remember this as a method reference, for later devirtualization. */ + aref = build3 (OBJ_TYPE_REF, TREE_TYPE (aref), aref, instance_ptr, idx); + + return aref; +} + +/* Return the name of the virtual function table (as an IDENTIFIER_NODE) + for the given TYPE. */ + +static tree +get_vtable_name (tree type) +{ + return mangle_vtbl_for_type (type); +} + +/* DECL is an entity associated with TYPE, like a virtual table or an + implicitly generated constructor. Determine whether or not DECL + should have external or internal linkage at the object file + level. This routine does not deal with COMDAT linkage and other + similar complexities; it simply sets TREE_PUBLIC if it possible for + entities in other translation units to contain copies of DECL, in + the abstract. */ + +void +set_linkage_according_to_type (tree type ATTRIBUTE_UNUSED, tree decl) +{ + TREE_PUBLIC (decl) = 1; + determine_visibility (decl); +} + +/* Create a VAR_DECL for a primary or secondary vtable for CLASS_TYPE. + (For a secondary vtable for B-in-D, CLASS_TYPE should be D, not B.) + 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; + + decl = build_lang_decl (VAR_DECL, name, vtable_type); + /* vtable names are already mangled; give them their DECL_ASSEMBLER_NAME + now to avoid confusion in mangle_decl. */ + SET_DECL_ASSEMBLER_NAME (decl, name); + DECL_CONTEXT (decl) = class_type; + DECL_ARTIFICIAL (decl) = 1; + TREE_STATIC (decl) = 1; + 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)); + set_linkage_according_to_type (class_type, decl); + /* The vtable has not been defined -- yet. */ + DECL_EXTERNAL (decl) = 1; + DECL_NOT_REALLY_EXTERN (decl) = 1; + + /* Mark the VAR_DECL node representing the vtable itself as a + "gratuitous" one, thereby forcing dwarfout.c to ignore it. It + is rather important that such things be ignored because any + effort to actually generate DWARF for them will run into + trouble when/if we encounter code like: + + #pragma interface + struct S { virtual void member (); }; + + because the artificial declaration of the vtable itself (as + manufactured by the g++ front end) will say that the vtable is + a static member of `S' but only *after* the debug output for + the definition of `S' has already been output. This causes + grief because the DWARF entry for the definition of the vtable + will try to refer back to an earlier *declaration* of the + vtable as a static member of `S' and there won't be one. We + might be able to arrange to have the "vtable static member" + attached to the member list for `S' before the debug info for + `S' get written (which would solve the problem) but that would + require more intrusive changes to the g++ front end. */ + DECL_IGNORED_P (decl) = 1; + + return decl; +} + +/* Get the VAR_DECL of the vtable for TYPE. TYPE need not be polymorphic, + or even complete. If this does not exist, create it. If COMPLETE is + nonzero, then complete the definition of it -- that will render it + impossible to actually build the vtable, but is useful to get at those + 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; + cp_finish_decl (decl, NULL_TREE, false, NULL_TREE, 0); + } + + return decl; +} + +/* Build the primary virtual function table for TYPE. If BINFO is + non-NULL, build the vtable starting with the initial approximation + that it is the same as the one which is the head of the association + list. Returns a nonzero value if a new vtable is actually + created. */ + +static int +build_primary_vtable (tree binfo, tree type) +{ + tree decl; + tree virtuals; + + decl = get_vtable_decl (type, /*complete=*/0); + + 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; + + virtuals = copy_list (BINFO_VIRTUALS (binfo)); + TREE_TYPE (decl) = TREE_TYPE (get_vtbl_decl_for_binfo (binfo)); + DECL_SIZE (decl) = TYPE_SIZE (TREE_TYPE (decl)); + DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (TREE_TYPE (decl)); + } + else + { + gcc_assert (TREE_TYPE (decl) == vtbl_type_node); + virtuals = NULL_TREE; + } + +#ifdef GATHER_STATISTICS + n_vtables += 1; + n_vtable_elems += list_length (virtuals); +#endif + + /* Initialize the association list for this type, based + on our first approximation. */ + BINFO_VTABLE (TYPE_BINFO (type)) = decl; + BINFO_VIRTUALS (TYPE_BINFO (type)) = virtuals; + SET_BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (type)); + return 1; +} + +/* Give BINFO a new virtual function table which is initialized + with a skeleton-copy of its original initialization. The only + entry that changes is the `delta' entry, so we can really + share a lot of structure. + + FOR_TYPE is the most derived type which caused this table to + be needed. + + Returns nonzero if we haven't met BINFO before. + + The order in which vtables are built (by calling this function) for + an object must remain the same, otherwise a binary incompatibility + 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_list (BINFO_VIRTUALS (binfo)); + + /* Secondary vtables are laid out as part of the same structure as + the primary vtable. */ + BINFO_VTABLE (binfo) = NULL_TREE; + return 1; +} + +/* Create a new vtable for BINFO which is the hierarchy dominated by + 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 + with the approximation that its vtable is that of the + immediate base class. */ + return build_primary_vtable (binfo, t); + else + /* This is our very own copy of `basetype' to play with. Later, + 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 + (which is in the hierarchy dominated by T) list FNDECL as its + BV_FN. DELTA is the required constant adjustment from the `this' + pointer where the vtable entry appears to the `this' required when + the function is actually called. */ + +static void +modify_vtable_entry (tree t, + tree binfo, + tree fndecl, + tree delta, + tree *virtuals) +{ + tree v; + + v = *virtuals; + + if (fndecl != BV_FN (v) + || !tree_int_cst_equal (delta, BV_DELTA (v))) + { + /* We need a new vtable for BINFO. */ + if (make_new_vtable (t, binfo)) + { + /* If we really did make a new vtable, we also made a copy + of the BINFO_VIRTUALS list. Now, we have to find the + corresponding entry in that list. */ + *virtuals = BINFO_VIRTUALS (binfo); + while (BV_FN (*virtuals) != BV_FN (v)) + *virtuals = TREE_CHAIN (*virtuals); + v = *virtuals; + } + + BV_DELTA (v) = delta; + BV_VCALL_INDEX (v) = NULL_TREE; + BV_FN (v) = fndecl; + } +} + + +/* Add method METHOD to class TYPE. If USING_DECL is non-null, it is + the USING_DECL naming METHOD. Returns true if the method could be + added to the method vec. */ + +bool +add_method (tree type, tree method, tree using_decl) +{ + unsigned slot; + tree overload; + bool template_conv_p = false; + bool conv_p; + VEC(tree,gc) *method_vec; + bool complete_p; + bool insert_p = false; + tree current_fns; + tree fns; + + if (method == error_mark_node) + return false; + + complete_p = COMPLETE_TYPE_P (type); + conv_p = DECL_CONV_FN_P (method); + if (conv_p) + template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL + && DECL_TEMPLATE_CONV_FN_P (method)); + + method_vec = CLASSTYPE_METHOD_VEC (type); + if (!method_vec) + { + /* Make a new method vector. We start with 8 entries. We must + allocate at least two (for constructors and destructors), and + we're going to end up with an assignment operator at some + point as well. */ + method_vec = VEC_alloc (tree, gc, 8); + /* Create slots for constructors and destructors. */ + VEC_quick_push (tree, method_vec, NULL_TREE); + VEC_quick_push (tree, method_vec, NULL_TREE); + CLASSTYPE_METHOD_VEC (type) = method_vec; + } + + /* Maintain TYPE_HAS_USER_CONSTRUCTOR, etc. */ + grok_special_member_properties (method); + + /* Constructors and destructors go in special slots. */ + 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; + + if (TYPE_FOR_JAVA (type)) + { + if (!DECL_ARTIFICIAL (method)) + error ("Java class %qT cannot have a destructor", type); + else if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + error ("Java class %qT cannot have an implicit non-trivial " + "destructor", + type); + } + } + else + { + tree m; + + insert_p = true; + /* See if we already have an entry with this name. */ + for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT; + VEC_iterate (tree, method_vec, slot, m); + ++slot) + { + m = OVL_CURRENT (m); + if (template_conv_p) + { + if (TREE_CODE (m) == TEMPLATE_DECL + && DECL_TEMPLATE_CONV_FN_P (m)) + insert_p = false; + break; + } + if (conv_p && !DECL_CONV_FN_P (m)) + break; + if (DECL_NAME (m) == DECL_NAME (method)) + { + insert_p = false; + break; + } + if (complete_p + && !DECL_CONV_FN_P (m) + && DECL_NAME (m) > DECL_NAME (method)) + break; + } + } + current_fns = insert_p ? NULL_TREE : VEC_index (tree, method_vec, slot); + + /* Check to see if we've already got this method. */ + for (fns = current_fns; fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + tree fn_type; + tree method_type; + tree parms1; + tree parms2; + + if (TREE_CODE (fn) != TREE_CODE (method)) + continue; + + /* [over.load] Member function declarations with the + same name and the same parameter types cannot be + overloaded if any of them is a static member + function declaration. + + [namespace.udecl] When a using-declaration brings names + from a base class into a derived class scope, member + functions in the derived class override and/or hide member + functions with the same name and parameter types in a base + class (rather than conflicting). */ + fn_type = TREE_TYPE (fn); + method_type = TREE_TYPE (method); + parms1 = TYPE_ARG_TYPES (fn_type); + parms2 = TYPE_ARG_TYPES (method_type); + + /* Compare the quals on the 'this' parm. Don't compare + the whole types, as used functions are treated as + coming from the using class in overload resolution. */ + if (! DECL_STATIC_FUNCTION_P (fn) + && ! DECL_STATIC_FUNCTION_P (method) + && TREE_TYPE (TREE_VALUE (parms1)) != error_mark_node + && TREE_TYPE (TREE_VALUE (parms2)) != error_mark_node + && (cp_type_quals (TREE_TYPE (TREE_VALUE (parms1))) + != cp_type_quals (TREE_TYPE (TREE_VALUE (parms2))))) + continue; + + /* For templates, the return type and template parameters + must be identical. */ + if (TREE_CODE (fn) == TEMPLATE_DECL + && (!same_type_p (TREE_TYPE (fn_type), + TREE_TYPE (method_type)) + || !comp_template_parms (DECL_TEMPLATE_PARMS (fn), + DECL_TEMPLATE_PARMS (method)))) + continue; + + if (! DECL_STATIC_FUNCTION_P (fn)) + parms1 = TREE_CHAIN (parms1); + if (! DECL_STATIC_FUNCTION_P (method)) + parms2 = TREE_CHAIN (parms2); + + if (compparms (parms1, parms2) + && (!DECL_CONV_FN_P (fn) + || same_type_p (TREE_TYPE (fn_type), + TREE_TYPE (method_type)))) + { + if (using_decl) + { + if (DECL_CONTEXT (fn) == type) + /* Defer to the local function. */ + return false; + if (DECL_CONTEXT (fn) == DECL_CONTEXT (method)) + error ("repeated using declaration %q+D", using_decl); + else + error ("using declaration %q+D conflicts with a previous using declaration", + using_decl); + } + else + { + error ("%q+#D cannot be overloaded", method); + error ("with %q+#D", fn); + } + + /* We don't call duplicate_decls here to merge the + declarations because that will confuse things if the + methods have inline definitions. In particular, we + will crash while processing the definitions. */ + return false; + } + } + + /* A class should never have more than one destructor. */ + if (current_fns && DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (method)) + return false; + + /* Add the new binding. */ + overload = build_overload (method, current_fns); + + if (conv_p) + TYPE_HAS_CONVERSION (type) = 1; + else if (slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p) + push_class_level_binding (DECL_NAME (method), overload); + + if (insert_p) + { + bool reallocated; + + /* We only expect to add few methods in the COMPLETE_P case, so + just make room for one more method in that case. */ + if (complete_p) + reallocated = VEC_reserve_exact (tree, gc, method_vec, 1); + else + reallocated = VEC_reserve (tree, gc, method_vec, 1); + if (reallocated) + CLASSTYPE_METHOD_VEC (type) = method_vec; + if (slot == VEC_length (tree, method_vec)) + VEC_quick_push (tree, method_vec, overload); + else + VEC_quick_insert (tree, method_vec, slot, overload); + } + else + /* Replace the current slot. */ + VEC_replace (tree, method_vec, slot, overload); + return true; +} + +/* 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); + + gcc_assert (!DECL_DISCRIMINATOR_P (fdecl)); + + elem = purpose_member (t, DECL_ACCESS (fdecl)); + if (elem) + { + if (TREE_VALUE (elem) != access) + { + if (TREE_CODE (TREE_TYPE (fdecl)) == FUNCTION_DECL) + error ("conflicting access specifications for method" + " %q+D, ignored", TREE_TYPE (fdecl)); + else + error ("conflicting access specifications for field %qE, ignored", + DECL_NAME (fdecl)); + } + else + { + /* They're changing the access to the same thing they changed + it to before. That's OK. */ + ; + } + } + else + { + perform_or_defer_access_check (TYPE_BINFO (t), fdecl, fdecl); + DECL_ACCESS (fdecl) = tree_cons (t, access, DECL_ACCESS (fdecl)); + return 1; + } + return 0; +} + +/* Process the USING_DECL, which is a member of T. */ + +static void +handle_using_decl (tree using_decl, tree t) +{ + tree decl = USING_DECL_DECLS (using_decl); + tree name = DECL_NAME (using_decl); + tree access + = TREE_PRIVATE (using_decl) ? access_private_node + : TREE_PROTECTED (using_decl) ? access_protected_node + : access_public_node; + tree flist = NULL_TREE; + tree old_value; + + gcc_assert (!processing_template_decl && decl); + + old_value = lookup_member (t, name, /*protect=*/0, /*want_type=*/false); + if (old_value) + { + if (is_overloaded_fn (old_value)) + old_value = OVL_CURRENT (old_value); + + if (DECL_P (old_value) && DECL_CONTEXT (old_value) == t) + /* OK */; + else + old_value = NULL_TREE; + } + + cp_emit_debug_info_for_using (decl, USING_DECL_SCOPE (using_decl)); + + if (is_overloaded_fn (decl)) + flist = decl; + + if (! old_value) + ; + else if (is_overloaded_fn (old_value)) + { + if (flist) + /* It's OK to use functions from a base when there are functions with + the same name already present in the current class. */; + else + { + error ("%q+D invalid in %q#T", using_decl, t); + error (" because of local method %q+#D with same name", + OVL_CURRENT (old_value)); + return; + } + } + else if (!DECL_ARTIFICIAL (old_value)) + { + error ("%q+D invalid in %q#T", using_decl, t); + error (" because of local member %q+#D with same name", old_value); + return; + } + + /* Make type T see field decl FDECL with access ACCESS. */ + if (flist) + for (; flist; flist = OVL_NEXT (flist)) + { + add_method (t, OVL_CURRENT (flist), using_decl); + alter_access (t, OVL_CURRENT (flist), access); + } + else + alter_access (t, decl, access); +} + +/* Run through the base classes of T, updating CANT_HAVE_CONST_CTOR_P, + and NO_CONST_ASN_REF_P. Also set flag bits in T based on + properties of the bases. */ + +static void +check_bases (tree t, + int* cant_have_const_ctor_p, + int* no_const_asn_ref_p) +{ + int i; + int seen_non_virtual_nearly_empty_base_p; + tree base_binfo; + tree binfo; + tree field = NULL_TREE; + + seen_non_virtual_nearly_empty_base_p = 0; + + if (!CLASSTYPE_NON_STD_LAYOUT (t)) + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL) + break; + + for (binfo = TYPE_BINFO (t), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) + { + tree basetype = TREE_TYPE (base_binfo); + + gcc_assert (COMPLETE_TYPE_P (basetype)); + + /* If any base class is non-literal, so is the derived class. */ + if (!CLASSTYPE_LITERAL_P (basetype)) + CLASSTYPE_LITERAL_P (t) = false; + + /* Effective C++ rule 14. We only need to check TYPE_POLYMORPHIC_P + here because the case of virtual functions but non-virtual + dtor is handled in finish_struct_1. */ + if (!TYPE_POLYMORPHIC_P (basetype)) + warning (OPT_Weffc__, + "base class %q#T has a non-virtual destructor", basetype); + + /* If the base class doesn't have copy constructors or + assignment operators that take const references, then the + derived class cannot have such a member automatically + generated. */ + if (TYPE_HAS_COPY_CTOR (basetype) + && ! TYPE_HAS_CONST_COPY_CTOR (basetype)) + *cant_have_const_ctor_p = 1; + if (TYPE_HAS_COPY_ASSIGN (basetype) + && !TYPE_HAS_CONST_COPY_ASSIGN (basetype)) + *no_const_asn_ref_p = 1; + + if (BINFO_VIRTUAL_P (base_binfo)) + /* A virtual base does not effect nearly emptiness. */ + ; + else if (CLASSTYPE_NEARLY_EMPTY_P (basetype)) + { + if (seen_non_virtual_nearly_empty_base_p) + /* And if there is more than one nearly empty base, then the + derived class is not nearly empty either. */ + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + else + /* Remember we've seen one. */ + seen_non_virtual_nearly_empty_base_p = 1; + } + else if (!is_empty_class (basetype)) + /* If the base class is not empty or nearly empty, then this + class cannot be nearly empty. */ + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + + /* A lot of properties from the bases also apply to the derived + class. */ + TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (basetype); + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + |= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (basetype); + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) + |= (TYPE_HAS_COMPLEX_COPY_ASSIGN (basetype) + || !TYPE_HAS_COPY_ASSIGN (basetype)); + TYPE_HAS_COMPLEX_COPY_CTOR (t) |= (TYPE_HAS_COMPLEX_COPY_CTOR (basetype) + || !TYPE_HAS_COPY_CTOR (basetype)); + TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) + |= TYPE_HAS_COMPLEX_MOVE_ASSIGN (basetype); + TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_HAS_COMPLEX_MOVE_CTOR (basetype); + TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype); + CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) + |= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype); + TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) + || TYPE_HAS_COMPLEX_DFLT (basetype)); + + /* A standard-layout class is a class that: + ... + * has no non-standard-layout base classes, */ + CLASSTYPE_NON_STD_LAYOUT (t) |= CLASSTYPE_NON_STD_LAYOUT (basetype); + if (!CLASSTYPE_NON_STD_LAYOUT (t)) + { + tree basefield; + /* ...has no base classes of the same type as the first non-static + data member... */ + if (field && DECL_CONTEXT (field) == t + && (same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (field), basetype))) + CLASSTYPE_NON_STD_LAYOUT (t) = 1; + else + /* ...either has no non-static data members in the most-derived + class and at most one base class with non-static data + members, or has no base classes with non-static data + members */ + for (basefield = TYPE_FIELDS (basetype); basefield; + basefield = DECL_CHAIN (basefield)) + if (TREE_CODE (basefield) == FIELD_DECL) + { + if (field) + CLASSTYPE_NON_STD_LAYOUT (t) = 1; + else + field = basefield; + break; + } + } + } +} + +/* Determine all the primary bases within T. Sets BINFO_PRIMARY_BASE_P for + those that are primaries. Sets BINFO_LOST_PRIMARY_P for those + that have had a nearly-empty virtual primary base stolen by some + other base in the hierarchy. Determines CLASSTYPE_PRIMARY_BASE for + T. */ + +static void +determine_primary_bases (tree t) +{ + unsigned i; + tree primary = NULL_TREE; + tree type_binfo = TYPE_BINFO (t); + tree base_binfo; + + /* Determine the primary bases of our bases. */ + for (base_binfo = TREE_CHAIN (type_binfo); base_binfo; + base_binfo = TREE_CHAIN (base_binfo)) + { + tree primary = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (base_binfo)); + + /* See if we're the non-virtual primary of our inheritance + chain. */ + if (!BINFO_VIRTUAL_P (base_binfo)) + { + tree parent = BINFO_INHERITANCE_CHAIN (base_binfo); + tree parent_primary = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (parent)); + + if (parent_primary + && SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo), + BINFO_TYPE (parent_primary))) + /* We are the primary binfo. */ + BINFO_PRIMARY_P (base_binfo) = 1; + } + /* Determine if we have a virtual primary base, and mark it so. + */ + if (primary && BINFO_VIRTUAL_P (primary)) + { + tree this_primary = copied_binfo (primary, base_binfo); + + if (BINFO_PRIMARY_P (this_primary)) + /* Someone already claimed this base. */ + BINFO_LOST_PRIMARY_P (base_binfo) = 1; + else + { + tree delta; + + BINFO_PRIMARY_P (this_primary) = 1; + BINFO_INHERITANCE_CHAIN (this_primary) = base_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. */ + delta = size_diffop_loc (input_location, + convert (ssizetype, + BINFO_OFFSET (base_binfo)), + convert (ssizetype, + BINFO_OFFSET (this_primary))); + + propagate_binfo_offsets (this_primary, delta); + } + } + } + + /* First look for a dynamic direct non-virtual base. */ + for (i = 0; BINFO_BASE_ITERATE (type_binfo, i, base_binfo); i++) + { + tree basetype = BINFO_TYPE (base_binfo); + + if (TYPE_CONTAINS_VPTR_P (basetype) && !BINFO_VIRTUAL_P (base_binfo)) + { + primary = base_binfo; + goto found; + } + } + + /* A "nearly-empty" virtual base class can be the primary base + class, if no non-virtual polymorphic base can be found. Look for + a nearly-empty virtual dynamic base that is not already a primary + base of something in the hierarchy. If there is no such base, + just pick the first nearly-empty virtual base. */ + + for (base_binfo = TREE_CHAIN (type_binfo); base_binfo; + base_binfo = TREE_CHAIN (base_binfo)) + if (BINFO_VIRTUAL_P (base_binfo) + && CLASSTYPE_NEARLY_EMPTY_P (BINFO_TYPE (base_binfo))) + { + if (!BINFO_PRIMARY_P (base_binfo)) + { + /* Found one that is not primary. */ + primary = base_binfo; + goto found; + } + else if (!primary) + /* Remember the first candidate. */ + primary = base_binfo; + } + + found: + /* If we've got a primary base, use it. */ + if (primary) + { + tree basetype = BINFO_TYPE (primary); + + CLASSTYPE_PRIMARY_BINFO (t) = primary; + if (BINFO_PRIMARY_P (primary)) + /* We are stealing a primary base. */ + BINFO_LOST_PRIMARY_P (BINFO_INHERITANCE_CHAIN (primary)) = 1; + BINFO_PRIMARY_P (primary) = 1; + if (BINFO_VIRTUAL_P (primary)) + { + tree delta; + + BINFO_INHERITANCE_CHAIN (primary) = type_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. */ + delta = size_diffop_loc (input_location, ssize_int (0), + convert (ssizetype, BINFO_OFFSET (primary))); + + propagate_binfo_offsets (primary, delta); + } + + primary = TYPE_BINFO (basetype); + + TYPE_VFIELD (t) = TYPE_VFIELD (basetype); + BINFO_VTABLE (type_binfo) = BINFO_VTABLE (primary); + BINFO_VIRTUALS (type_binfo) = BINFO_VIRTUALS (primary); + } +} + +/* Update the variant types of T. */ + +void +fixup_type_variants (tree t) +{ + tree variants; + + if (!t) + return; + + for (variants = TYPE_NEXT_VARIANT (t); + variants; + variants = TYPE_NEXT_VARIANT (variants)) + { + /* These fields are in the _TYPE part of the node, not in + the TYPE_LANG_SPECIFIC component, so they are not shared. */ + TYPE_HAS_USER_CONSTRUCTOR (variants) = TYPE_HAS_USER_CONSTRUCTOR (t); + TYPE_NEEDS_CONSTRUCTING (variants) = TYPE_NEEDS_CONSTRUCTING (t); + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (variants) + = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t); + + TYPE_POLYMORPHIC_P (variants) = TYPE_POLYMORPHIC_P (t); + + TYPE_BINFO (variants) = TYPE_BINFO (t); + + /* Copy whatever these are holding today. */ + TYPE_VFIELD (variants) = TYPE_VFIELD (t); + TYPE_METHODS (variants) = TYPE_METHODS (t); + TYPE_FIELDS (variants) = TYPE_FIELDS (t); + } +} + +/* Early variant fixups: we apply attributes at the beginning of the class + definition, and we need to fix up any variants that have already been + made via elaborated-type-specifier so that check_qualified_type works. */ + +void +fixup_attribute_variants (tree t) +{ + tree variants; + + if (!t) + return; + + for (variants = TYPE_NEXT_VARIANT (t); + variants; + variants = TYPE_NEXT_VARIANT (variants)) + { + /* These are the two fields that check_qualified_type looks at and + are affected by attributes. */ + TYPE_ATTRIBUTES (variants) = TYPE_ATTRIBUTES (t); + TYPE_ALIGN (variants) = TYPE_ALIGN (t); + } +} + +/* Set memoizing fields and bits of T (and its variants) for later + use. */ + +static void +finish_struct_bits (tree t) +{ + /* Fix up variants (if any). */ + fixup_type_variants (t); + + if (BINFO_N_BASE_BINFOS (TYPE_BINFO (t)) && TYPE_POLYMORPHIC_P (t)) + /* For a class w/o baseclasses, 'finish_struct' has set + CLASSTYPE_PURE_VIRTUALS correctly (by definition). + Similarly for a class whose base classes do not have vtables. + When neither of these is true, we might have removed abstract + virtuals (by providing a definition), added some (by declaring + new ones), or redeclared ones from a base class. We need to + recalculate what's really an abstract virtual at this point (by + looking in the vtables). */ + get_pure_virtuals (t); + + /* If this type has a copy constructor or a destructor, force its + mode to be BLKmode, and force its TREE_ADDRESSABLE bit to be + nonzero. This will cause it to be passed by invisible reference + and prevent it from being returned in a register. */ + if (type_has_nontrivial_copy_init (t) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)) + { + tree variants; + DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode; + for (variants = t; variants; variants = TYPE_NEXT_VARIANT (variants)) + { + SET_TYPE_MODE (variants, BLKmode); + TREE_ADDRESSABLE (variants) = 1; + } + } +} + +/* Issue warnings about T having private constructors, but no friends, + and so forth. + + HAS_NONPRIVATE_METHOD is nonzero if T has any non-private methods or + static members. HAS_NONPRIVATE_STATIC_FN is nonzero if T has any + 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; + tree fn; + + if (!warn_ctor_dtor_privacy + /* If the class has friends, those entities might create and + access instances, so we should not warn. */ + || (CLASSTYPE_FRIEND_CLASSES (t) + || DECL_FRIENDLIST (TYPE_MAIN_DECL (t))) + /* We will have warned when the template was declared; there's + no need to warn on every instantiation. */ + || CLASSTYPE_TEMPLATE_INSTANTIATION (t)) + /* There's no reason to even consider warning about this + class. */ + return; + + /* We only issue one warning, if more than one applies, because + otherwise, on code like: + + class A { + // Oops - forgot `public:' + A(); + A(const A&); + ~A(); + }; + + we warn several times about essentially the same problem. */ + + /* Check to see if all (non-constructor, non-destructor) member + functions are private. (Since there are no friends or + non-private statics, we can't ever call any of the private member + functions.) */ + for (fn = TYPE_METHODS (t); fn; fn = DECL_CHAIN (fn)) + /* We're not interested in compiler-generated methods; they don't + provide any way to call private members. */ + if (!DECL_ARTIFICIAL (fn)) + { + if (!TREE_PRIVATE (fn)) + { + if (DECL_STATIC_FUNCTION_P (fn)) + /* A non-private static member function is just like a + friend; it can create and invoke private member + functions, and be accessed without a class + instance. */ + return; + + has_nonprivate_method = 1; + /* Keep searching for a static member function. */ + } + else if (!DECL_CONSTRUCTOR_P (fn) && !DECL_DESTRUCTOR_P (fn)) + has_member_fn = 1; + } + + if (!has_nonprivate_method && has_member_fn) + { + /* There are no non-private methods, and there's at least one + private member function that isn't a constructor or + destructor. (If all the private members are + constructors/destructors we want to use the code below that + issues error messages specifically referring to + constructors/destructors.) */ + unsigned i; + tree binfo = TYPE_BINFO (t); + + for (i = 0; i != BINFO_N_BASE_BINFOS (binfo); i++) + if (BINFO_BASE_ACCESS (binfo, i) != access_private_node) + { + has_nonprivate_method = 1; + break; + } + if (!has_nonprivate_method) + { + warning (OPT_Wctor_dtor_privacy, + "all member functions in class %qT are private", t); + return; + } + } + + /* 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. */ + fn = CLASSTYPE_DESTRUCTORS (t); + if (fn && TREE_PRIVATE (fn)) + { + warning (OPT_Wctor_dtor_privacy, + "%q#T only defines a private destructor and has no friends", + t); + return; + } + + /* Warn about classes that have private constructors and no friends. */ + if (TYPE_HAS_USER_CONSTRUCTOR (t) + /* Implicitly generated constructors are always public. */ + && (!CLASSTYPE_LAZY_DEFAULT_CTOR (t) + || !CLASSTYPE_LAZY_COPY_CTOR (t))) + { + int nonprivate_ctor = 0; + + /* If a non-template class does not define a copy + constructor, one is defined for it, enabling it to avoid + this warning. For a template class, this does not + happen, and so we would normally get a warning on: + + template class C { private: C(); }; + + To avoid this asymmetry, we check TYPE_HAS_COPY_CTOR. All + complete non-template or fully instantiated classes have this + flag set. */ + if (!TYPE_HAS_COPY_CTOR (t)) + nonprivate_ctor = 1; + else + for (fn = CLASSTYPE_CONSTRUCTORS (t); fn; fn = OVL_NEXT (fn)) + { + tree ctor = OVL_CURRENT (fn); + /* Ideally, we wouldn't count copy constructors (or, in + fact, any constructor that takes an argument of the + class type as a parameter) because such things cannot + be used to construct an instance of the class unless + you already have one. But, for now at least, we're + more generous. */ + if (! TREE_PRIVATE (ctor)) + { + nonprivate_ctor = 1; + break; + } + } + + if (nonprivate_ctor == 0) + { + warning (OPT_Wctor_dtor_privacy, + "%q#T only defines private constructors and has no friends", + t); + return; + } + } +} + +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 = (const tree *) m1_p; + const tree *const m2 = (const tree *) 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 = (const tree *) m1_p; + const tree *const m2 = (const tree *) 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) +{ + VEC(tree,gc) *method_vec = (VEC(tree,gc) *) obj; + int len = VEC_length (tree, method_vec); + size_t slot; + tree fn; + + /* The type conversion ops have to live at the front of the vec, so we + can't sort them. */ + for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT; + VEC_iterate (tree, method_vec, slot, fn); + ++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 (VEC_address (tree, method_vec) + slot, len - slot, sizeof (tree), + resort_method_name_cmp); + } +} + +/* Warn about duplicate methods in fn_fields. + + Sort methods that are not special (i.e., constructors, destructors, + and type conversion operators) so that we can find them faster in + search. */ + +static void +finish_struct_methods (tree t) +{ + tree fn_fields; + VEC(tree,gc) *method_vec; + int slot, len; + + method_vec = CLASSTYPE_METHOD_VEC (t); + if (!method_vec) + return; + + len = VEC_length (tree, method_vec); + + /* Clear DECL_IN_AGGR_P for all functions. */ + for (fn_fields = TYPE_METHODS (t); fn_fields; + fn_fields = DECL_CHAIN (fn_fields)) + DECL_IN_AGGR_P (fn_fields) = 0; + + /* Issue warnings about private constructors and such. If there are + no methods, then some public defaults are generated. */ + maybe_warn_about_overly_private_class (t); + + /* The type conversion ops have to live at the front of the vec, so we + can't sort them. */ + for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT; + VEC_iterate (tree, method_vec, slot, fn_fields); + ++slot) + if (!DECL_CONV_FN_P (OVL_CURRENT (fn_fields))) + break; + if (len - slot > 1) + qsort (VEC_address (tree, method_vec) + slot, + len-slot, sizeof (tree), method_name_cmp); +} + +/* Make BINFO's vtable have N entries, including RTTI entries, + vbase and vcall offsets, etc. Set its type and call the back end + to lay it out. */ + +static void +layout_vtable_decl (tree binfo, int n) +{ + tree atype; + tree vtable; + + atype = build_array_of_n_type (vtable_entry_type, n); + layout_type (atype); + + /* We may have to grow the vtable. */ + vtable = get_vtbl_decl_for_binfo (binfo); + if (!same_type_p (TREE_TYPE (vtable), atype)) + { + TREE_TYPE (vtable) = atype; + DECL_SIZE (vtable) = DECL_SIZE_UNIT (vtable) = NULL_TREE; + layout_decl (vtable, 0); + } +} + +/* True iff FNDECL and BASE_FNDECL (both non-static member functions) + have the same signature. */ + +int +same_signature_p (const_tree fndecl, const_tree base_fndecl) +{ + /* One destructor overrides another if they are the same kind of + destructor. */ + if (DECL_DESTRUCTOR_P (base_fndecl) && DECL_DESTRUCTOR_P (fndecl) + && special_function_p (base_fndecl) == special_function_p (fndecl)) + return 1; + /* But a non-destructor never overrides a destructor, nor vice + versa, nor do different kinds of destructors override + one-another. For example, a complete object destructor does not + override a deleting destructor. */ + if (DECL_DESTRUCTOR_P (base_fndecl) || DECL_DESTRUCTOR_P (fndecl)) + return 0; + + if (DECL_NAME (fndecl) == DECL_NAME (base_fndecl) + || (DECL_CONV_FN_P (fndecl) + && DECL_CONV_FN_P (base_fndecl) + && same_type_p (DECL_CONV_FN_TYPE (fndecl), + DECL_CONV_FN_TYPE (base_fndecl)))) + { + tree types, base_types; + types = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); + base_types = TYPE_ARG_TYPES (TREE_TYPE (base_fndecl)); + if ((cp_type_quals (TREE_TYPE (TREE_VALUE (base_types))) + == cp_type_quals (TREE_TYPE (TREE_VALUE (types)))) + && compparms (TREE_CHAIN (base_types), TREE_CHAIN (types))) + return 1; + } + 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 (BINFO_VIRTUAL_P (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 (binfo_for_vbase (BINFO_TYPE (probe), BINFO_TYPE (derived)) + != NULL_TREE); + } + return false; +} + +typedef struct find_final_overrider_data_s { + /* The function for which we are trying to find a final overrider. */ + tree fn; + /* The base class in which the function was declared. */ + tree declaring_base; + /* The candidate overriders. */ + tree candidates; + /* Path to most derived. */ + VEC(tree,heap) *path; +} find_final_overrider_data; + +/* Add the overrider along the current path to FFOD->CANDIDATES. + Returns true if an overrider was found; false otherwise. */ + +static bool +dfs_find_final_overrider_1 (tree binfo, + find_final_overrider_data *ffod, + unsigned depth) +{ + tree method; + + /* If BINFO is not the most derived type, try a more derived class. + A definition there will overrider a definition here. */ + if (depth) + { + depth--; + if (dfs_find_final_overrider_1 + (VEC_index (tree, ffod->path, depth), ffod, depth)) + return true; + } + + method = look_for_overrides_here (BINFO_TYPE (binfo), ffod->fn); + if (method) + { + tree *candidate = &ffod->candidates; + + /* 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), binfo)) + return true; + /* If METHOD overrides *CANDIDATE, remove *CANDIDATE. */ + if (base_derived_from (binfo, TREE_VALUE (*candidate))) + *candidate = TREE_CHAIN (*candidate); + else + candidate = &TREE_CHAIN (*candidate); + } + + /* Add the new function. */ + ffod->candidates = tree_cons (method, binfo, ffod->candidates); + return true; + } + + return false; +} + +/* Called from find_final_overrider via dfs_walk. */ + +static tree +dfs_find_final_overrider_pre (tree binfo, void *data) +{ + find_final_overrider_data *ffod = (find_final_overrider_data *) data; + + if (binfo == ffod->declaring_base) + dfs_find_final_overrider_1 (binfo, ffod, VEC_length (tree, ffod->path)); + VEC_safe_push (tree, heap, ffod->path, binfo); + + return NULL_TREE; +} + +static tree +dfs_find_final_overrider_post (tree binfo ATTRIBUTE_UNUSED, void *data) +{ + find_final_overrider_data *ffod = (find_final_overrider_data *) data; + VEC_pop (tree, ffod->path); + + return NULL_TREE; +} + +/* Returns a TREE_LIST whose TREE_PURPOSE is the final overrider for + FN and whose TREE_VALUE is the binfo for the base where the + overriding occurs. BINFO (in the hierarchy dominated by the binfo + 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; + + /* Getting this right is a little tricky. This is valid: + + struct S { virtual void f (); }; + struct T { virtual void f (); }; + struct U : public S, public T { }; + + even though calling `f' in `U' is ambiguous. But, + + struct R { virtual void f(); }; + struct S : virtual public R { virtual void f (); }; + struct T : virtual public R { virtual void f (); }; + struct U : public S, public T { }; + + is not -- there's no way to decide whether to put `S::f' or + `T::f' in the vtable for `R'. + + 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); + + /* Determine the depth of the hierarchy. */ + ffod.fn = fn; + ffod.declaring_base = binfo; + ffod.candidates = NULL_TREE; + ffod.path = VEC_alloc (tree, heap, 30); + + dfs_walk_all (derived, dfs_find_final_overrider_pre, + dfs_find_final_overrider_post, &ffod); + + VEC_free (tree, heap, ffod.path); + + /* If there was no winner, issue an error message. */ + if (!ffod.candidates || TREE_CHAIN (ffod.candidates)) + return error_mark_node; + + return ffod.candidates; +} + +/* Return the index of the vcall offset for FN when TYPE is used as a + virtual base. */ + +static tree +get_vcall_index (tree fn, tree type) +{ + VEC(tree_pair_s,gc) *indices = CLASSTYPE_VCALL_INDICES (type); + tree_pair_p p; + unsigned ix; + + FOR_EACH_VEC_ELT (tree_pair_s, indices, ix, p) + if ((DECL_DESTRUCTOR_P (fn) && DECL_DESTRUCTOR_P (p->purpose)) + || same_signature_p (fn, p->purpose)) + return p->value; + + /* There should always be an appropriate index. */ + gcc_unreachable (); +} + +/* Update an entry in the vtable for BINFO, which is in the hierarchy + dominated by T. FN is the old function; VIRTUALS points to the + corresponding position in the new BINFO_VIRTUALS list. IX is the index + of that entry in the 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 + this function; this is the class the caller will convert to when + calling FN through BINFO. */ + for (b = binfo; ; b = get_primary_binfo (b)) + { + gcc_assert (b); + if (look_for_overrides_here (BINFO_TYPE (b), target_fn)) + break; + + /* The nearest definition is from a lost primary. */ + if (BINFO_LOST_PRIMARY_P (b)) + lost = true; + } + first_defn = b; + + /* Find the final overrider. */ + overrider = find_final_overrider (TYPE_BINFO (t), b, target_fn); + if (overrider == error_mark_node) + { + error ("no unique final overrider for %qD in %qT", target_fn, t); + 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 the overrider is invalid, don't even try. */ + && !DECL_INVALID_OVERRIDER_P (overrider_target)) + { + /* 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; + + over_return = TREE_TYPE (over_return); + base_return = TREE_TYPE (base_return); + + if (DECL_THUNK_P (fn)) + { + gcc_assert (DECL_RESULT_THUNK_P (fn)); + 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 = binfo_for_vbase (BINFO_TYPE (virtual_offset), + over_return); + else if (!same_type_ignoring_top_level_qualifiers_p + (over_return, base_return)) + { + /* There was no existing virtual thunk (which takes + precedence). So find the binfo of the base function's + return type within the overriding function's return type. + We cannot call lookup base here, because we're inside a + dfs_walk, and will therefore clobber the BINFO_MARKED + flags. Fortunately we know the covariancy is valid (it + has already been checked), so we can just iterate along + the binfos, which have been chained in inheritance graph + order. Of course it is lame that we have to repeat the + search here anyway -- we should really be caching pieces + of the vtable and avoiding this repeated work. */ + tree thunk_binfo, base_binfo; + + /* Find the base binfo within the overriding function's + return type. We will always find a thunk_binfo, except + when the covariancy is invalid (which we will have + already diagnosed). */ + for (base_binfo = TYPE_BINFO (base_return), + thunk_binfo = TYPE_BINFO (over_return); + thunk_binfo; + thunk_binfo = TREE_CHAIN (thunk_binfo)) + if (SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo), + BINFO_TYPE (base_binfo))) + break; + + /* See if virtual inheritance is involved. */ + for (virtual_offset = thunk_binfo; + virtual_offset; + virtual_offset = BINFO_INHERITANCE_CHAIN (virtual_offset)) + if (BINFO_VIRTUAL_P (virtual_offset)) + break; + + if (virtual_offset + || (thunk_binfo && !BINFO_OFFSET_ZEROP (thunk_binfo))) + { + tree offset = convert (ssizetype, BINFO_OFFSET (thunk_binfo)); + + if (virtual_offset) + { + /* We convert via virtual base. Adjust the fixed + offset to be from there. */ + 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 + gcc_assert (DECL_INVALID_OVERRIDER_P (overrider_target) || + !DECL_THUNK_P (fn)); + + /* If we need a covariant thunk, then we may need to adjust first_defn. + The ABI specifies that the thunks emitted with a function are + determined by which bases the function overrides, so we need to be + sure that we're using a thunk for some overridden base; even if we + know that the necessary this adjustment is zero, there may not be an + appropriate zero-this-adjusment thunk for us to use since thunks for + overriding virtual bases always use the vcall offset. + + Furthermore, just choosing any base that overrides this function isn't + quite right, as this slot won't be used for calls through a type that + puts a covariant thunk here. Calling the function through such a type + will use a different slot, and that slot is the one that determines + the thunk emitted for that base. + + So, keep looking until we find the base that we're really overriding + in this slot: the nearest primary base that doesn't use a covariant + thunk in this slot. */ + if (overrider_target != overrider_fn) + { + if (BINFO_TYPE (b) == DECL_CONTEXT (overrider_target)) + /* We already know that the overrider needs a covariant thunk. */ + b = get_primary_binfo (b); + for (; ; b = get_primary_binfo (b)) + { + tree main_binfo = TYPE_BINFO (BINFO_TYPE (b)); + tree bv = chain_index (ix, BINFO_VIRTUALS (main_binfo)); + if (!DECL_THUNK_P (TREE_VALUE (bv))) + break; + if (BINFO_LOST_PRIMARY_P (b)) + lost = true; + } + first_defn = b; + } + + /* 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; + + /* See if we can convert to an intermediate virtual base first, and then + use the vcall offset located there to finish the conversion. */ + for (; b; b = BINFO_INHERITANCE_CHAIN (b)) + { + /* If we find the final overrider, then we can stop + walking. */ + if (SAME_BINFO_TYPE_P (BINFO_TYPE (b), + BINFO_TYPE (TREE_VALUE (overrider)))) + break; + + /* 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 (BINFO_VIRTUAL_P (b)) + { + virtual_base = b; + break; + } + } + + /* 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_loc (input_location, + 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, + if we happen to get our primary back. In that case, the offset + will be zero, as it will be a primary base. */ + delta = size_zero_node; + else + /* The `this' pointer needs to be adjusted from pointing to + BINFO to pointing at the base where the final overrider + appears. */ + delta = size_diffop_loc (input_location, + 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)); + else + BV_VCALL_INDEX (*virtuals) = NULL_TREE; + + BV_LOST_PRIMARY (*virtuals) = lost; +} + +/* Called from modify_all_vtables via dfs_walk. */ + +static tree +dfs_modify_vtables (tree binfo, void* data) +{ + tree t = (tree) data; + tree virtuals; + tree old_virtuals; + unsigned ix; + + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + /* A base without a vtable needs no modification, and its bases + are uninteresting. */ + return dfs_skip_bases; + + if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), t) + && !CLASSTYPE_HAS_PRIMARY_BASE_P (t)) + /* Don't do the primary vtable, if it's new. */ + return NULL_TREE; + + if (BINFO_PRIMARY_P (binfo) && !BINFO_VIRTUAL_P (binfo)) + /* There's no need to modify the vtable for a non-virtual primary + base; we're not going to use that vtable anyhow. We do still + need to do this for virtual primary bases, as they could become + non-primary in a construction vtable. */ + return NULL_TREE; + + 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); + + return NULL_TREE; +} + +/* Update all of the primary and secondary vtables for T. Create new + vtables as required, and initialize their RTTI information. Each + of the functions in VIRTUALS is declared in T and may override a + virtual function from a base class; find and modify the appropriate + entries to point to the overriding functions. Returns a list, in + declaration order, of the virtual functions that are declared in T, + but do not appear in the primary base class vtable, and which + 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_once (binfo, dfs_modify_vtables, NULL, t); + + /* Add virtual functions not already in our primary vtable. These + will be both those introduced by this class, and those overridden + from secondary bases. It does not include virtuals merely + inherited from secondary bases. */ + for (fnsp = &virtuals; *fnsp; ) + { + tree fn = TREE_VALUE (*fnsp); + + if (!value_member (fn, BINFO_VIRTUALS (binfo)) + || DECL_VINDEX (fn) == error_mark_node) + { + /* We don't need to adjust the `this' pointer when + calling this function. */ + BV_DELTA (*fnsp) = integer_zero_node; + BV_VCALL_INDEX (*fnsp) = NULL_TREE; + + /* This is a function not already in our vtable. Keep it. */ + fnsp = &TREE_CHAIN (*fnsp); + } + else + /* We've already got an entry for this function. Skip it. */ + *fnsp = TREE_CHAIN (*fnsp); + } + + return virtuals; +} + +/* Get the base virtual function declarations in T that have the + indicated NAME. */ + +static tree +get_basefndecls (tree name, tree t) +{ + tree methods; + tree base_fndecls = NULL_TREE; + int n_baseclasses = BINFO_N_BASE_BINFOS (TYPE_BINFO (t)); + int i; + + /* Find virtual functions in T with the indicated NAME. */ + i = lookup_fnfields_1 (t, name); + if (i != -1) + for (methods = VEC_index (tree, CLASSTYPE_METHOD_VEC (t), i); + methods; + methods = OVL_NEXT (methods)) + { + tree method = OVL_CURRENT (methods); + + if (TREE_CODE (method) == FUNCTION_DECL + && DECL_VINDEX (method)) + base_fndecls = tree_cons (NULL_TREE, method, base_fndecls); + } + + if (base_fndecls) + return base_fndecls; + + for (i = 0; i < n_baseclasses; i++) + { + tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (t), i)); + base_fndecls = chainon (get_basefndecls (name, basetype), + base_fndecls); + } + + return base_fndecls; +} + +/* If this declaration supersedes the declaration of + a method declared virtual in the base class, then + mark this field as being virtual as well. */ + +void +check_for_override (tree decl, tree ctype) +{ + if (TREE_CODE (decl) == TEMPLATE_DECL) + /* In [temp.mem] we have: + + A specialization of a member function template does not + override a virtual function from a base class. */ + return; + if ((DECL_DESTRUCTOR_P (decl) + || IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) + || DECL_CONV_FN_P (decl)) + && look_for_overrides (ctype, decl) + && !DECL_STATIC_FUNCTION_P (decl)) + /* Set DECL_VINDEX to a value that is neither an INTEGER_CST nor + the error_mark_node so that we know it is an overriding + function. */ + DECL_VINDEX (decl) = decl; + + if (DECL_VIRTUAL_P (decl)) + { + if (!DECL_VINDEX (decl)) + DECL_VINDEX (decl) = error_mark_node; + IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1; + } +} + +/* Warn about hidden virtual functions that are not overridden in t. + We know that constructors and destructors don't apply. */ + +static void +warn_hidden (tree t) +{ + VEC(tree,gc) *method_vec = CLASSTYPE_METHOD_VEC (t); + tree fns; + size_t i; + + /* We go through each separately named virtual function. */ + for (i = CLASSTYPE_FIRST_CONVERSION_SLOT; + VEC_iterate (tree, method_vec, i, fns); + ++i) + { + tree fn; + tree name; + tree fndecl; + tree base_fndecls; + tree base_binfo; + tree binfo; + int j; + + /* All functions in this slot in the CLASSTYPE_METHOD_VEC will + have the same name. Figure out what name that is. */ + name = DECL_NAME (OVL_CURRENT (fns)); + /* There are no possibly hidden functions yet. */ + base_fndecls = NULL_TREE; + /* Iterate through all of the base classes looking for possibly + hidden functions. */ + for (binfo = TYPE_BINFO (t), j = 0; + BINFO_BASE_ITERATE (binfo, j, base_binfo); j++) + { + tree basetype = BINFO_TYPE (base_binfo); + base_fndecls = chainon (get_basefndecls (name, basetype), + base_fndecls); + } + + /* If there are no functions to hide, continue. */ + if (!base_fndecls) + continue; + + /* Remove any overridden functions. */ + for (fn = fns; fn; fn = OVL_NEXT (fn)) + { + fndecl = OVL_CURRENT (fn); + if (DECL_VINDEX (fndecl)) + { + tree *prev = &base_fndecls; + + while (*prev) + /* If the method from the base class has the same + signature as the method from the derived class, it + has been overridden. */ + if (same_signature_p (fndecl, TREE_VALUE (*prev))) + *prev = TREE_CHAIN (*prev); + else + prev = &TREE_CHAIN (*prev); + } + } + + /* Now give a warning for all base functions without overriders, + as they are hidden. */ + while (base_fndecls) + { + /* Here we know it is a hider, and no overrider exists. */ + warning (OPT_Woverloaded_virtual, "%q+D was hidden", TREE_VALUE (base_fndecls)); + warning (OPT_Woverloaded_virtual, " by %q+D", fns); + base_fndecls = TREE_CHAIN (base_fndecls); + } + } +} + +/* Check for things that are invalid. There are probably plenty of other + things we should check for also. */ + +static void +finish_struct_anon (tree t) +{ + tree field; + + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + { + if (TREE_STATIC (field)) + continue; + if (TREE_CODE (field) != FIELD_DECL) + continue; + + if (DECL_NAME (field) == NULL_TREE + && ANON_AGGR_TYPE_P (TREE_TYPE (field))) + { + bool is_union = TREE_CODE (TREE_TYPE (field)) == UNION_TYPE; + tree elt = TYPE_FIELDS (TREE_TYPE (field)); + for (; elt; elt = DECL_CHAIN (elt)) + { + /* We're generally only interested in entities the user + declared, but we also find nested classes by noticing + the TYPE_DECL that we create implicitly. You're + allowed to put one anonymous union inside another, + though, so we explicitly tolerate that. We use + TYPE_ANONYMOUS_P rather than ANON_AGGR_TYPE_P so that + we also allow unnamed types used for defining fields. */ + if (DECL_ARTIFICIAL (elt) + && (!DECL_IMPLICIT_TYPEDEF_P (elt) + || TYPE_ANONYMOUS_P (TREE_TYPE (elt)))) + continue; + + if (TREE_CODE (elt) != FIELD_DECL) + { + if (is_union) + permerror (input_location, "%q+#D invalid; an anonymous union can " + "only have non-static data members", elt); + else + permerror (input_location, "%q+#D invalid; an anonymous struct can " + "only have non-static data members", elt); + continue; + } + + if (TREE_PRIVATE (elt)) + { + if (is_union) + permerror (input_location, "private member %q+#D in anonymous union", elt); + else + permerror (input_location, "private member %q+#D in anonymous struct", elt); + } + else if (TREE_PROTECTED (elt)) + { + if (is_union) + permerror (input_location, "protected member %q+#D in anonymous union", elt); + else + permerror (input_location, "protected member %q+#D in anonymous struct", elt); + } + + TREE_PRIVATE (elt) = TREE_PRIVATE (field); + TREE_PROTECTED (elt) = TREE_PROTECTED (field); + } + } + } +} + +/* Add T to CLASSTYPE_DECL_LIST of current_class_type which + will be used later during class template instantiation. + When FRIEND_P is zero, T can be a static member data (VAR_DECL), + a non-static member data (FIELD_DECL), a member function + (FUNCTION_DECL), a nested type (RECORD_TYPE, ENUM_TYPE), + a typedef (TYPE_DECL) or a member class template (TEMPLATE_DECL) + When FRIEND_P is nonzero, T is either a friend class + (RECORD_TYPE, TEMPLATE_DECL) or a friend function + (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)) + CLASSTYPE_DECL_LIST (type) + = tree_cons (friend_p ? NULL_TREE : type, + t, CLASSTYPE_DECL_LIST (type)); +} + +/* This function is called from declare_virt_assop_and_dtor via + dfs_walk_all. + + DATA is a type that direcly or indirectly inherits the base + represented by BINFO. If BINFO contains a virtual assignment [copy + assignment or move assigment] operator or a virtual constructor, + declare that function in DATA if it hasn't been already declared. */ + +static tree +dfs_declare_virt_assop_and_dtor (tree binfo, void *data) +{ + tree bv, fn, t = (tree)data; + tree opname = ansi_assopname (NOP_EXPR); + + gcc_assert (t && CLASS_TYPE_P (t)); + gcc_assert (binfo && TREE_CODE (binfo) == TREE_BINFO); + + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + /* A base without a vtable needs no modification, and its bases + are uninteresting. */ + return dfs_skip_bases; + + if (BINFO_PRIMARY_P (binfo)) + /* If this is a primary base, then we have already looked at the + virtual functions of its vtable. */ + return NULL_TREE; + + for (bv = BINFO_VIRTUALS (binfo); bv; bv = TREE_CHAIN (bv)) + { + fn = BV_FN (bv); + + if (DECL_NAME (fn) == opname) + { + if (CLASSTYPE_LAZY_COPY_ASSIGN (t)) + lazily_declare_fn (sfk_copy_assignment, t); + if (CLASSTYPE_LAZY_MOVE_ASSIGN (t)) + lazily_declare_fn (sfk_move_assignment, t); + } + else if (DECL_DESTRUCTOR_P (fn) + && CLASSTYPE_LAZY_DESTRUCTOR (t)) + lazily_declare_fn (sfk_destructor, t); + } + + return NULL_TREE; +} + +/* If the class type T has a direct or indirect base that contains a + virtual assignment operator or a virtual destructor, declare that + function in T if it hasn't been already declared. */ + +static void +declare_virt_assop_and_dtor (tree t) +{ + if (!(TYPE_POLYMORPHIC_P (t) + && (CLASSTYPE_LAZY_COPY_ASSIGN (t) + || CLASSTYPE_LAZY_MOVE_ASSIGN (t) + || CLASSTYPE_LAZY_DESTRUCTOR (t)))) + return; + + dfs_walk_all (TYPE_BINFO (t), + dfs_declare_virt_assop_and_dtor, + NULL, t); +} + +/* Create default constructors, assignment operators, and so forth for + the type indicated by T, if they are needed. CANT_HAVE_CONST_CTOR, + and CANT_HAVE_CONST_ASSIGNMENT are nonzero if, for whatever reason, + the class cannot have a default constructor, copy constructor + taking a const reference argument, or an assignment operator taking + a const reference, respectively. */ + +static void +add_implicitly_declared_members (tree t, + int cant_have_const_cctor, + int cant_have_const_assignment) +{ + /* Destructor. */ + if (!CLASSTYPE_DESTRUCTORS (t)) + { + /* In general, we create destructors lazily. */ + CLASSTYPE_LAZY_DESTRUCTOR (t) = 1; + + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + && TYPE_FOR_JAVA (t)) + /* But if this is a Java class, any non-trivial destructor is + invalid, even if compiler-generated. Therefore, if the + destructor is non-trivial we create it now. */ + lazily_declare_fn (sfk_destructor, t); + } + + /* [class.ctor] + + If there is no user-declared constructor for a class, a default + constructor is implicitly declared. */ + if (! TYPE_HAS_USER_CONSTRUCTOR (t)) + { + TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 1; + CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1; + if (cxx_dialect >= cxx0x) + TYPE_HAS_CONSTEXPR_CTOR (t) + = synthesized_default_constructor_is_constexpr (t); + } + + /* [class.ctor] + + If a class definition does not explicitly declare a copy + constructor, one is declared implicitly. */ + if (! TYPE_HAS_COPY_CTOR (t) && ! TYPE_FOR_JAVA (t) + && !type_has_move_constructor (t)) + { + TYPE_HAS_COPY_CTOR (t) = 1; + TYPE_HAS_CONST_COPY_CTOR (t) = !cant_have_const_cctor; + CLASSTYPE_LAZY_COPY_CTOR (t) = 1; + if (cxx_dialect >= cxx0x) + CLASSTYPE_LAZY_MOVE_CTOR (t) = 1; + } + + /* If there is no assignment operator, one will be created if and + when it is needed. For now, just record whether or not the type + of the parameter to the assignment operator will be a const or + non-const reference. */ + if (!TYPE_HAS_COPY_ASSIGN (t) && !TYPE_FOR_JAVA (t) + && !type_has_move_assign (t)) + { + TYPE_HAS_COPY_ASSIGN (t) = 1; + TYPE_HAS_CONST_COPY_ASSIGN (t) = !cant_have_const_assignment; + CLASSTYPE_LAZY_COPY_ASSIGN (t) = 1; + if (cxx_dialect >= cxx0x) + CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1; + } + + /* We can't be lazy about declaring functions that might override + a virtual function from a base class. */ + declare_virt_assop_and_dtor (t); +} + +/* Subroutine of finish_struct_1. Recursively count the number of fields + in TYPE, including anonymous union members. */ + +static int +count_fields (tree fields) +{ + tree x; + int n_fields = 0; + for (x = fields; x; x = DECL_CHAIN (x)) + { + if (TREE_CODE (x) == FIELD_DECL && ANON_AGGR_TYPE_P (TREE_TYPE (x))) + n_fields += count_fields (TYPE_FIELDS (TREE_TYPE (x))); + else + n_fields += 1; + } + return n_fields; +} + +/* 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 = DECL_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; +} + +/* FIELD is a bit-field. We are finishing the processing for its + enclosing type. Issue any appropriate messages and set appropriate + flags. Returns false if an error has been diagnosed. */ + +static bool +check_bitfield_decl (tree field) +{ + tree type = TREE_TYPE (field); + tree w; + + /* Extract the declared width of the bitfield, which has been + temporarily stashed in DECL_INITIAL. */ + w = DECL_INITIAL (field); + gcc_assert (w != NULL_TREE); + /* Remove the bit-field width indicator so that the rest of the + compiler does not treat that value as an initializer. */ + DECL_INITIAL (field) = NULL_TREE; + + /* Detect invalid bit-field type. */ + if (!INTEGRAL_OR_ENUMERATION_TYPE_P (type)) + { + error ("bit-field %q+#D with non-integral type", field); + w = error_mark_node; + } + else + { + location_t loc = input_location; + /* Avoid the non_lvalue wrapper added by fold for PLUS_EXPRs. */ + STRIP_NOPS (w); + + /* detect invalid field size. */ + input_location = DECL_SOURCE_LOCATION (field); + w = cxx_constant_value (w); + input_location = loc; + + if (TREE_CODE (w) != INTEGER_CST) + { + error ("bit-field %q+D width not an integer constant", field); + w = error_mark_node; + } + else if (tree_int_cst_sgn (w) < 0) + { + error ("negative width in bit-field %q+D", field); + w = error_mark_node; + } + else if (integer_zerop (w) && DECL_NAME (field) != 0) + { + error ("zero width for bit-field %q+D", field); + w = error_mark_node; + } + else if (compare_tree_int (w, TYPE_PRECISION (type)) > 0 + && TREE_CODE (type) != ENUMERAL_TYPE + && TREE_CODE (type) != BOOLEAN_TYPE) + warning (0, "width of %q+D exceeds its type", field); + else if (TREE_CODE (type) == ENUMERAL_TYPE + && (0 > (compare_tree_int + (w, TYPE_PRECISION (ENUM_UNDERLYING_TYPE (type)))))) + warning (0, "%q+D is too small to hold all values of %q#T", field, type); + } + + if (w != error_mark_node) + { + DECL_SIZE (field) = convert (bitsizetype, w); + DECL_BIT_FIELD (field) = 1; + return true; + } + else + { + /* Non-bit-fields are aligned for their type. */ + DECL_BIT_FIELD (field) = 0; + CLEAR_DECL_C_BIT_FIELD (field); + return false; + } +} + +/* FIELD is a non bit-field. We are finishing the processing for its + enclosing type T. Issue any appropriate messages and set appropriate + flags. */ + +static void +check_field_decl (tree field, + tree t, + int* cant_have_const_ctor, + int* no_const_asn_ref, + int* any_default_members) +{ + tree type = strip_array_types (TREE_TYPE (field)); + + /* In C++98 an anonymous union cannot contain any fields which would change + the settings of CANT_HAVE_CONST_CTOR and friends. */ + if (ANON_UNION_TYPE_P (type) && cxx_dialect < cxx0x) + ; + /* And, we don't set TYPE_HAS_CONST_COPY_CTOR, etc., for anonymous + structs. So, we recurse through their fields here. */ + else if (ANON_AGGR_TYPE_P (type)) + { + tree fields; + + for (fields = TYPE_FIELDS (type); fields; fields = DECL_CHAIN (fields)) + if (TREE_CODE (fields) == FIELD_DECL && !DECL_C_BIT_FIELD (field)) + check_field_decl (fields, t, cant_have_const_ctor, + no_const_asn_ref, any_default_members); + } + /* Check members with class type for constructors, destructors, + etc. */ + else if (CLASS_TYPE_P (type)) + { + /* Never let anything with uninheritable virtuals + make it through without complaint. */ + abstract_virtuals_error (field, type); + + if (TREE_CODE (t) == UNION_TYPE && cxx_dialect < cxx0x) + { + static bool warned; + int oldcount = errorcount; + if (TYPE_NEEDS_CONSTRUCTING (type)) + error ("member %q+#D with constructor not allowed in union", + field); + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + error ("member %q+#D with destructor not allowed in union", field); + if (TYPE_HAS_COMPLEX_COPY_ASSIGN (type)) + error ("member %q+#D with copy assignment operator not allowed in union", + field); + if (!warned && errorcount > oldcount) + { + inform (DECL_SOURCE_LOCATION (field), "unrestricted unions " + "only available with -std=c++0x or -std=gnu++0x"); + warned = true; + } + } + else + { + TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type); + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + |= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type); + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) + |= (TYPE_HAS_COMPLEX_COPY_ASSIGN (type) + || !TYPE_HAS_COPY_ASSIGN (type)); + TYPE_HAS_COMPLEX_COPY_CTOR (t) |= (TYPE_HAS_COMPLEX_COPY_CTOR (type) + || !TYPE_HAS_COPY_CTOR (type)); + TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) |= TYPE_HAS_COMPLEX_MOVE_ASSIGN (type); + TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_HAS_COMPLEX_MOVE_CTOR (type); + TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type) + || TYPE_HAS_COMPLEX_DFLT (type)); + } + + if (TYPE_HAS_COPY_CTOR (type) + && !TYPE_HAS_CONST_COPY_CTOR (type)) + *cant_have_const_ctor = 1; + + if (TYPE_HAS_COPY_ASSIGN (type) + && !TYPE_HAS_CONST_COPY_ASSIGN (type)) + *no_const_asn_ref = 1; + } + if (DECL_INITIAL (field) != NULL_TREE) + { + /* `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 %qT initialized", t); + *any_default_members = 1; + } +} + +/* Check the data members (both static and non-static), class-scoped + typedefs, etc., appearing in the declaration of T. Issue + appropriate diagnostics. Sets ACCESS_DECLS to a list (in + declaration order) of access declarations; each TREE_VALUE in this + list is a USING_DECL. + + In addition, set the following flags: + + EMPTY_P + The class is empty, i.e., contains no non-static data members. + + CANT_HAVE_CONST_CTOR_P + This class cannot have an implicitly generated copy constructor + taking a const reference. + + CANT_HAVE_CONST_ASN_REF + This class cannot have an implicitly generated assignment + operator taking a const reference. + + All of these flags should be initialized before calling this + function. + + Returns a pointer to the end of the TYPE_FIELDs chain; additional + fields can be added by adding to this chain. */ + +static void +check_field_decls (tree t, tree *access_decls, + int *cant_have_const_ctor_p, + int *no_const_asn_ref_p) +{ + tree *field; + tree *next; + bool has_pointers; + int any_default_members; + int cant_pack = 0; + int field_access = -1; + + /* Assume there are no access declarations. */ + *access_decls = NULL_TREE; + /* Assume this class has no pointer members. */ + has_pointers = false; + /* Assume none of the members of this class have default + initializations. */ + any_default_members = 0; + + for (field = &TYPE_FIELDS (t); *field; field = next) + { + tree x = *field; + tree type = TREE_TYPE (x); + int this_field_access; + + next = &DECL_CHAIN (x); + + if (TREE_CODE (x) == USING_DECL) + { + /* Prune the access declaration from the list of fields. */ + *field = DECL_CHAIN (x); + + /* Save the access declarations for our caller. */ + *access_decls = tree_cons (NULL_TREE, x, *access_decls); + + /* Since we've reset *FIELD there's no reason to skip to the + next field. */ + next = field; + continue; + } + + if (TREE_CODE (x) == TYPE_DECL + || TREE_CODE (x) == TEMPLATE_DECL) + continue; + + /* 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) + { + error ("%q+D may not be static because it is a member of a union", x); + continue; + } + if (TREE_CODE (type) == REFERENCE_TYPE) + { + error ("%q+D may not have reference type %qT because" + " it is a member of a union", + x, type); + continue; + } + } + + /* Perform error checking that did not get done in + grokdeclarator. */ + if (TREE_CODE (type) == FUNCTION_TYPE) + { + error ("field %q+D invalidly declared function type", x); + type = build_pointer_type (type); + TREE_TYPE (x) = type; + } + else if (TREE_CODE (type) == METHOD_TYPE) + { + error ("field %q+D invalidly declared method type", x); + 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)) + CLASSTYPE_NON_AGGREGATE (t) = 1; + + /* If at least one non-static data member is non-literal, the whole + class becomes non-literal. */ + if (!literal_type_p (type)) + CLASSTYPE_LITERAL_P (t) = false; + + /* A standard-layout class is a class that: + ... + has the same access control (Clause 11) for all non-static data members, + ... */ + this_field_access = TREE_PROTECTED (x) ? 1 : TREE_PRIVATE (x) ? 2 : 0; + if (field_access == -1) + field_access = this_field_access; + else if (this_field_access != field_access) + CLASSTYPE_NON_STD_LAYOUT (t) = 1; + + /* If this is of reference type, check if it needs an init. */ + if (TREE_CODE (type) == REFERENCE_TYPE) + { + CLASSTYPE_NON_LAYOUT_POD_P (t) = 1; + CLASSTYPE_NON_STD_LAYOUT (t) = 1; + if (DECL_INITIAL (x) == NULL_TREE) + SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1); + + /* ARM $12.6.2: [A member initializer list] (or, for an + aggregate, initialization by a brace-enclosed list) is the + only way to initialize nonstatic const and reference + members. */ + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1; + TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1; + } + + type = strip_array_types (type); + + if (TYPE_PACKED (t)) + { + if (!layout_pod_type_p (type) && !TYPE_PACKED (type)) + { + warning + (0, + "ignoring packed attribute because of unpacked non-POD field %q+#D", + x); + cant_pack = 1; + } + else if (DECL_C_BIT_FIELD (x) + || TYPE_ALIGN (TREE_TYPE (x)) > BITS_PER_UNIT) + 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 + non-empty. */ + ; + else + { + /* The class is non-empty. */ + CLASSTYPE_EMPTY_P (t) = 0; + /* The class is not even nearly empty. */ + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + /* If one of the data members contains an empty class, + so does T. */ + if (CLASS_TYPE_P (type) + && CLASSTYPE_CONTAINS_EMPTY_CLASS_P (type)) + CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) = 1; + } + + /* This is used by -Weffc++ (see below). Warn only for pointers + to members which might hold dynamic memory. So do not warn + for pointers to functions or pointers to members. */ + if (TYPE_PTR_P (type) + && !TYPE_PTRFN_P (type) + && !TYPE_PTR_TO_MEMBER_P (type)) + has_pointers = true; + + 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; + + if (! layout_pod_type_p (type)) + /* DR 148 now allows pointers to members (which are POD themselves), + to be allowed in POD structs. */ + CLASSTYPE_NON_LAYOUT_POD_P (t) = 1; + + if (!std_layout_type_p (type)) + CLASSTYPE_NON_STD_LAYOUT (t) = 1; + + if (! zero_init_p (type)) + CLASSTYPE_NON_ZERO_INIT_P (t) = 1; + + /* We set DECL_C_BIT_FIELD in grokbitfield. + If the type and width are valid, we'll also set DECL_BIT_FIELD. */ + if (! DECL_C_BIT_FIELD (x) || ! check_bitfield_decl (x)) + check_field_decl (x, t, + cant_have_const_ctor_p, + no_const_asn_ref_p, + &any_default_members); + + /* If any field is const, the structure type is pseudo-const. */ + if (CP_TYPE_CONST_P (type)) + { + C_TYPE_FIELDS_READONLY (t) = 1; + if (DECL_INITIAL (x) == NULL_TREE) + SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, 1); + + /* ARM $12.6.2: [A member initializer list] (or, for an + aggregate, initialization by a brace-enclosed list) is the + only way to initialize nonstatic const and reference + members. */ + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1; + TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1; + } + /* 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, + CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) + | CLASSTYPE_READONLY_FIELDS_NEED_INIT (type)); + } + + /* Core issue 80: A nonstatic data member is required to have a + different name from the class iff the class has a + user-declared constructor. */ + if (constructor_name_p (DECL_NAME (x), t) + && TYPE_HAS_USER_CONSTRUCTOR (t)) + permerror (input_location, "field %q+#D with same name as class", x); + } + + /* Effective C++ rule 11: if a class has dynamic memory held by pointers, + it should also define a copy constructor and an assignment operator to + implement the correct copy semantic (deep vs shallow, etc.). As it is + not feasible to check whether the constructors do allocate dynamic memory + and store it within members, we approximate the warning like this: + + -- Warn only if there are members which are pointers + -- Warn only if there is a non-trivial constructor (otherwise, + there cannot be memory allocated). + -- Warn only if there is a non-trivial destructor. We assume that the + user at least implemented the cleanup correctly, and a destructor + is needed to free dynamic memory. + + This seems enough for practical purposes. */ + if (warn_ecpp + && has_pointers + && TYPE_HAS_USER_CONSTRUCTOR (t) + && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + && !(TYPE_HAS_COPY_CTOR (t) && TYPE_HAS_COPY_ASSIGN (t))) + { + warning (OPT_Weffc__, "%q#T has pointer data members", t); + + if (! TYPE_HAS_COPY_CTOR (t)) + { + warning (OPT_Weffc__, + " but does not override %<%T(const %T&)%>", t, t); + if (!TYPE_HAS_COPY_ASSIGN (t)) + warning (OPT_Weffc__, " or %", t); + } + else if (! TYPE_HAS_COPY_ASSIGN (t)) + warning (OPT_Weffc__, + " but does not override %", t); + } + + /* If any of the fields couldn't be packed, unset TYPE_PACKED. */ + if (cant_pack) + TYPE_PACKED (t) = 0; + + /* Check anonymous struct/anonymous union fields. */ + finish_struct_anon (t); + + /* We've built up the list of access declarations in reverse order. + Fix that now. */ + *access_decls = nreverse (*access_decls); +} + +/* If TYPE is an empty class type, records its OFFSET in the table of + OFFSETS. */ + +static int +record_subobject_offset (tree type, tree offset, splay_tree offsets) +{ + splay_tree_node n; + + if (!is_empty_class (type)) + return 0; + + /* Record the location of this empty object in OFFSETS. */ + n = splay_tree_lookup (offsets, (splay_tree_key) offset); + if (!n) + n = splay_tree_insert (offsets, + (splay_tree_key) offset, + (splay_tree_value) NULL_TREE); + n->value = ((splay_tree_value) + tree_cons (NULL_TREE, + type, + (tree) n->value)); + + return 0; +} + +/* Returns nonzero if TYPE is an empty class type and there is + 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; + + if (!is_empty_class (type)) + return 0; + + /* Record the location of this empty object in OFFSETS. */ + n = splay_tree_lookup (offsets, (splay_tree_key) offset); + if (!n) + return 0; + + for (t = (tree) n->value; t; t = TREE_CHAIN (t)) + if (same_type_p (TREE_VALUE (t), type)) + return 1; + + return 0; +} + +/* Walk through all the subobjects of TYPE (located at OFFSET). Call + F for every subobject, passing it the type, offset, and table of + OFFSETS. If VBASES_P is one, then virtual non-primary bases should + be traversed. + + If MAX_OFFSET is non-NULL, then subobjects with an offset greater + than MAX_OFFSET will not be walked. + + If F returns a nonzero value, the traversal ceases, and that value + 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; + + /* If this OFFSET is bigger than the MAX_OFFSET, then we should + stop. */ + if (max_offset && INT_CST_LT (max_offset, offset)) + return 0; + + if (type == error_mark_node) + return 0; + + if (!TYPE_P (type)) + { + if (abi_version_at_least (2)) + type_binfo = type; + type = BINFO_TYPE (type); + } + + if (CLASS_TYPE_P (type)) + { + tree field; + tree binfo; + int i; + + /* Avoid recursing into objects that are not interesting. */ + if (!CLASSTYPE_CONTAINS_EMPTY_CLASS_P (type)) + return 0; + + /* Record the location of TYPE. */ + r = (*f) (type, offset, offsets); + if (r) + return r; + + /* Iterate through the direct base classes of TYPE. */ + if (!type_binfo) + type_binfo = TYPE_BINFO (type); + for (i = 0; BINFO_BASE_ITERATE (type_binfo, i, binfo); i++) + { + tree binfo_offset; + + if (abi_version_at_least (2) + && BINFO_VIRTUAL_P (binfo)) + continue; + + if (!vbases_p + && BINFO_VIRTUAL_P (binfo) + && !BINFO_PRIMARY_P (binfo)) + continue; + + if (!abi_version_at_least (2)) + binfo_offset = size_binop (PLUS_EXPR, + offset, + BINFO_OFFSET (binfo)); + else + { + tree orig_binfo; + /* We cannot rely on BINFO_OFFSET being set for the base + class yet, but the offsets for direct non-virtual + bases can be calculated by going back to the TYPE. */ + orig_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), i); + binfo_offset = size_binop (PLUS_EXPR, + offset, + BINFO_OFFSET (orig_binfo)); + } + + r = walk_subobject_offsets (binfo, + f, + binfo_offset, + offsets, + max_offset, + (abi_version_at_least (2) + ? /*vbases_p=*/0 : vbases_p)); + if (r) + return r; + } + + if (abi_version_at_least (2) && CLASSTYPE_VBASECLASSES (type)) + { + unsigned ix; + VEC(tree,gc) *vbases; + + /* Iterate through the virtual base classes of TYPE. In G++ + 3.2, we included virtual bases in the direct base class + loop above, which results in incorrect results; the + correct offsets for virtual bases are only known when + working with the most derived type. */ + if (vbases_p) + for (vbases = CLASSTYPE_VBASECLASSES (type), ix = 0; + VEC_iterate (tree, vbases, ix, binfo); ix++) + { + r = walk_subobject_offsets (binfo, + f, + size_binop (PLUS_EXPR, + offset, + BINFO_OFFSET (binfo)), + offsets, + max_offset, + /*vbases_p=*/0); + if (r) + return r; + } + else + { + /* We still have to walk the primary base, if it is + virtual. (If it is non-virtual, then it was walked + above.) */ + tree vbase = get_primary_binfo (type_binfo); + + if (vbase && BINFO_VIRTUAL_P (vbase) + && BINFO_PRIMARY_P (vbase) + && BINFO_INHERITANCE_CHAIN (vbase) == type_binfo) + { + r = (walk_subobject_offsets + (vbase, f, offset, + offsets, max_offset, /*vbases_p=*/0)); + if (r) + return r; + } + } + } + + /* Iterate through the fields of TYPE. */ + for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL && !DECL_ARTIFICIAL (field)) + { + tree field_offset; + + if (abi_version_at_least (2)) + field_offset = byte_position (field); + else + /* In G++ 3.2, DECL_FIELD_OFFSET was used. */ + field_offset = DECL_FIELD_OFFSET (field); + + r = walk_subobject_offsets (TREE_TYPE (field), + f, + size_binop (PLUS_EXPR, + offset, + field_offset), + offsets, + max_offset, + /*vbases_p=*/1); + if (r) + return r; + } + } + else if (TREE_CODE (type) == ARRAY_TYPE) + { + tree element_type = strip_array_types (type); + tree domain = TYPE_DOMAIN (type); + tree index; + + /* Avoid recursing into objects that are not interesting. */ + if (!CLASS_TYPE_P (element_type) + || !CLASSTYPE_CONTAINS_EMPTY_CLASS_P (element_type)) + return 0; + + /* Step through each of the elements in the array. */ + for (index = size_zero_node; + /* G++ 3.2 had an off-by-one error here. */ + (abi_version_at_least (2) + ? !INT_CST_LT (TYPE_MAX_VALUE (domain), index) + : INT_CST_LT (index, TYPE_MAX_VALUE (domain))); + index = size_binop (PLUS_EXPR, index, size_one_node)) + { + r = walk_subobject_offsets (TREE_TYPE (type), + f, + offset, + offsets, + max_offset, + /*vbases_p=*/1); + if (r) + return r; + offset = size_binop (PLUS_EXPR, offset, + TYPE_SIZE_UNIT (TREE_TYPE (type))); + /* If this new OFFSET is bigger than the MAX_OFFSET, then + there's no point in iterating through the remaining + elements of the array. */ + if (max_offset && INT_CST_LT (max_offset, offset)) + break; + } + } + + return 0; +} + +/* Record all of the empty subobjects of TYPE (either a type or a + binfo). If IS_DATA_MEMBER is true, then a non-static data member + is being placed at OFFSET; otherwise, it is a base class that is + being placed at OFFSET. */ + +static void +record_subobject_offsets (tree type, + tree offset, + splay_tree offsets, + bool is_data_member) +{ + tree max_offset; + /* If recording subobjects for a non-static data member or a + non-empty base class , we do not need to record offsets beyond + the size of the biggest empty class. Additional data members + will go at the end of the class. Additional base classes will go + either at offset zero (if empty, in which case they cannot + overlap with offsets past the size of the biggest empty class) or + at the end of the class. + + However, if we are placing an empty base class, then we must record + all offsets, as either the empty class is at offset zero (where + other empty classes might later be placed) or at the end of the + class (where other objects might then be placed, so other empty + subobjects might later overlap). */ + if (is_data_member + || !is_empty_class (BINFO_TYPE (type))) + max_offset = sizeof_biggest_empty_class; + else + max_offset = NULL_TREE; + walk_subobject_offsets (type, record_subobject_offset, offset, + offsets, max_offset, is_data_member); +} + +/* Returns nonzero if any of the empty subobjects of TYPE (located at + OFFSET) conflict with entries in OFFSETS. If VBASES_P is nonzero, + 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; + + /* Get the node in OFFSETS that indicates the maximum offset where + an empty subobject is located. */ + max_node = splay_tree_max (offsets); + /* If there aren't any empty subobjects, then there's no point in + performing this check. */ + if (!max_node) + return 0; + + return walk_subobject_offsets (type, check_subobject_offset, offset, + offsets, (tree) (max_node->key), + vbases_p); +} + +/* DECL is a FIELD_DECL corresponding either to a base subobject of a + non-static data member of the type indicated by RLI. BINFO is the + binfo corresponding to the base subobject, OFFSETS maps offsets to + types already located at those offsets. This function determines + the position of the DECL. */ + +static void +layout_nonempty_base_or_field (record_layout_info rli, + tree decl, + tree binfo, + splay_tree offsets) +{ + tree offset = NULL_TREE; + bool field_p; + tree type; + + if (binfo) + { + /* For the purposes of determining layout conflicts, we want to + use the class type of BINFO; TREE_TYPE (DECL) will be the + CLASSTYPE_AS_BASE version, which does not contain entries for + zero-sized bases. */ + type = TREE_TYPE (binfo); + field_p = false; + } + else + { + type = TREE_TYPE (decl); + field_p = true; + } + + /* Try to place the field. It may take more than one try if we have + a hard time placing the field without putting two objects of the + same type at the same address. */ + while (1) + { + struct record_layout_info_s old_rli = *rli; + + /* Place this field. */ + place_field (rli, decl); + offset = byte_position (decl); + + /* We have to check to see whether or not there is already + something of the same type at the offset we're about to use. + For example, consider: + + struct S {}; + struct T : public S { int i; }; + struct U : public S, public T {}; + + Here, we put S at offset zero in U. Then, we can't put T at + offset zero -- its S component would be at the same address + as the S we already allocated. So, we have to skip ahead. + Since all data members, including those whose type is an + empty class, have nonzero size, any overlap can happen only + with a direct or indirect base-class -- it can't happen with + a data member. */ + /* In a union, overlap is permitted; all members are placed at + offset zero. */ + if (TREE_CODE (rli->t) == UNION_TYPE) + break; + /* G++ 3.2 did not check for overlaps when placing a non-empty + virtual base. */ + if (!abi_version_at_least (2) && binfo && BINFO_VIRTUAL_P (binfo)) + break; + if (layout_conflict_p (field_p ? type : binfo, offset, + offsets, field_p)) + { + /* Strip off the size allocated to this field. That puts us + at the first place we could have put the field with + proper alignment. */ + *rli = old_rli; + + /* Bump up by the alignment required for the type. */ + rli->bitpos + = size_binop (PLUS_EXPR, rli->bitpos, + bitsize_int (binfo + ? CLASSTYPE_ALIGN (type) + : TYPE_ALIGN (type))); + normalize_rli (rli); + } + else + /* There was no conflict. We're done laying out this field. */ + break; + } + + /* Now that we know where it will be placed, update its + BINFO_OFFSET. */ + if (binfo && CLASS_TYPE_P (BINFO_TYPE (binfo))) + /* Indirect virtual bases may have a nonzero BINFO_OFFSET at + this point because their BINFO_OFFSET is copied from another + hierarchy. Therefore, we may not need to add the entire + OFFSET. */ + propagate_binfo_offsets (binfo, + size_diffop_loc (input_location, + convert (ssizetype, offset), + convert (ssizetype, + BINFO_OFFSET (binfo)))); +} + +/* Returns true if TYPE is empty and OFFSET is nonzero. */ + +static int +empty_base_at_nonzero_offset_p (tree type, + tree offset, + splay_tree offsets ATTRIBUTE_UNUSED) +{ + return is_empty_class (type) && !integer_zerop (offset); +} + +/* Layout the empty base BINFO. EOC indicates the byte currently just + past the end of the class, and should be correctly aligned for a + class of the type indicated by BINFO; OFFSETS gives the offsets of + the empty bases allocated so far. T is the most derived + type. Return nonzero iff we added it at the end. */ + +static bool +layout_empty_base (record_layout_info rli, tree binfo, + tree eoc, splay_tree offsets) +{ + tree alignment; + tree basetype = BINFO_TYPE (binfo); + bool atend = false; + + /* This routine should only be used for empty classes. */ + gcc_assert (is_empty_class (basetype)); + 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_loc (input_location, + size_zero_node, BINFO_OFFSET (binfo))); + else + warning (OPT_Wabi, + "offset of empty base %qT 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, + BINFO_OFFSET (binfo), + offsets, + /*vbases_p=*/0)) + { + /* 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, + BINFO_OFFSET (binfo), + offsets, + /*vbases_p=*/0)) + /* We finally found a spot where there's no overlap. */ + break; + + /* There's overlap here, too. Bump along to the next spot. */ + propagate_binfo_offsets (binfo, alignment); + } + } + + if (CLASSTYPE_USER_ALIGN (basetype)) + { + rli->record_align = MAX (rli->record_align, CLASSTYPE_ALIGN (basetype)); + if (warn_packed) + rli->unpacked_align = MAX (rli->unpacked_align, CLASSTYPE_ALIGN (basetype)); + TYPE_USER_ALIGN (rli->t) = 1; + } + + return atend; +} + +/* Layout the base given by BINFO in the class indicated by RLI. + *BASE_ALIGN is a running maximum of the alignments of + any base class. OFFSETS gives the location of empty base + subobjects. T is the most derived type. Return nonzero if the new + object cannot be nearly-empty. A new FIELD_DECL is inserted at + *NEXT_FIELD, unless BINFO is for an empty base class. + + Returns the location at which the next field should be inserted. */ + +static tree * +build_base_field (record_layout_info rli, tree binfo, + splay_tree offsets, tree *next_field) +{ + tree t = rli->t; + tree basetype = BINFO_TYPE (binfo); + + if (!COMPLETE_TYPE_P (basetype)) + /* This error is now reported in xref_tag, thus giving better + location information. */ + return next_field; + + /* Place the base class. */ + if (!is_empty_class (basetype)) + { + tree decl; + + /* The containing class is non-empty because it has a non-empty + base class. */ + CLASSTYPE_EMPTY_P (t) = 0; + + /* Create the FIELD_DECL. */ + decl = build_decl (input_location, + FIELD_DECL, NULL_TREE, CLASSTYPE_AS_BASE (basetype)); + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; + DECL_FIELD_CONTEXT (decl) = t; + if (CLASSTYPE_AS_BASE (basetype)) + { + DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype); + DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype); + DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype); + DECL_USER_ALIGN (decl) = CLASSTYPE_USER_ALIGN (basetype); + DECL_MODE (decl) = TYPE_MODE (basetype); + DECL_FIELD_IS_BASE (decl) = 1; + + /* Try to place the field. It may take more than one try if we + have a hard time placing the field without putting two + objects of the same type at the same address. */ + layout_nonempty_base_or_field (rli, decl, binfo, offsets); + /* Add the new FIELD_DECL to the list of fields for T. */ + DECL_CHAIN (decl) = *next_field; + *next_field = decl; + next_field = &DECL_CHAIN (decl); + } + } + else + { + tree eoc; + bool atend; + + /* On some platforms (ARM), even empty classes will not be + byte-aligned. */ + eoc = round_up_loc (input_location, + rli_size_unit_so_far (rli), + CLASSTYPE_ALIGN_UNIT (basetype)); + atend = layout_empty_base (rli, 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 (!BINFO_VIRTUAL_P (binfo) && CLASSTYPE_NEARLY_EMPTY_P (t)) + { + if (atend) + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + /* The check above (used in G++ 3.2) is insufficient because + an empty class placed at offset zero might itself have an + empty base at a nonzero offset. */ + else if (walk_subobject_offsets (basetype, + empty_base_at_nonzero_offset_p, + size_zero_node, + /*offsets=*/NULL, + /*max_offset=*/NULL_TREE, + /*vbases_p=*/true)) + { + if (abi_version_at_least (2)) + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + else + warning (OPT_Wabi, + "class %qT will be considered nearly empty in a " + "future version of GCC", t); + } + } + + /* We do not create a FIELD_DECL for empty base classes because + it might overlap some other field. We want to be able to + create CONSTRUCTORs for the class by iterating over the + FIELD_DECLs, and the back end does not handle overlapping + FIELD_DECLs. */ + + /* An empty virtual base causes a class to be non-empty + -- but in that case we do not need to clear CLASSTYPE_EMPTY_P + here because that was already done when the virtual table + pointer was created. */ + } + + /* Record the offsets of BINFO and its base subobjects. */ + record_subobject_offsets (binfo, + BINFO_OFFSET (binfo), + offsets, + /*is_data_member=*/false); + + return next_field; +} + +/* Layout all of the non-virtual base classes. Record empty + subobjects in OFFSETS. T is the most derived type. Return nonzero + if the type cannot be nearly empty. The fields created + corresponding to the base classes will be inserted at + *NEXT_FIELD. */ + +static void +build_base_fields (record_layout_info rli, + splay_tree offsets, tree *next_field) +{ + /* Chain to hold all the new FIELD_DECLs which stand in for base class + subobjects. */ + tree t = rli->t; + int n_baseclasses = BINFO_N_BASE_BINFOS (TYPE_BINFO (t)); + int i; + + /* The primary base class is always allocated first. */ + if (CLASSTYPE_HAS_PRIMARY_BASE_P (t)) + next_field = build_base_field (rli, CLASSTYPE_PRIMARY_BINFO (t), + offsets, next_field); + + /* Now allocate the rest of the bases. */ + for (i = 0; i < n_baseclasses; ++i) + { + tree base_binfo; + + base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (t), i); + + /* The primary base was already allocated above, so we don't + need to allocate it again here. */ + 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 (BINFO_VIRTUAL_P (base_binfo)) + continue; + + next_field = build_base_field (rli, base_binfo, + offsets, next_field); + } +} + +/* Go through the TYPE_METHODS of T issuing any appropriate + diagnostics, figuring out which methods override which other + methods, and so forth. */ + +static void +check_methods (tree t) +{ + tree x; + + for (x = TYPE_METHODS (t); x; x = DECL_CHAIN (x)) + { + check_for_override (x, t); + if (DECL_PURE_VIRTUAL_P (x) && ! DECL_VINDEX (x)) + error ("initializer specified for non-virtual method %q+D", x); + /* The name of the field is the original field name + Save this in auxiliary field for later overloading. */ + if (DECL_VINDEX (x)) + { + TYPE_POLYMORPHIC_P (t) = 1; + if (DECL_PURE_VIRTUAL_P (x)) + VEC_safe_push (tree, gc, CLASSTYPE_PURE_VIRTUALS (t), x); + } + /* All user-provided destructors are non-trivial. + Constructors and assignment ops are handled in + grok_special_member_properties. */ + if (DECL_DESTRUCTOR_P (x) && user_provided_p (x)) + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = 1; + } +} + +/* FN is a constructor or destructor. Clone the declaration to create + a specialized in-charge or not-in-charge version, as indicated by + NAME. */ + +static tree +build_clone (tree fn, tree name) +{ + tree parms; + tree clone; + + /* Copy the function. */ + clone = copy_decl (fn); + /* Reset the function name. */ + DECL_NAME (clone) = name; + SET_DECL_ASSEMBLER_NAME (clone, NULL_TREE); + /* Remember where this function came from. */ + DECL_ABSTRACT_ORIGIN (clone) = fn; + /* Make it easy to find the CLONE given the FN. */ + DECL_CHAIN (clone) = DECL_CHAIN (fn); + DECL_CHAIN (fn) = clone; + + /* If this is a template, do the rest on the DECL_TEMPLATE_RESULT. */ + if (TREE_CODE (clone) == TEMPLATE_DECL) + { + tree result = build_clone (DECL_TEMPLATE_RESULT (clone), name); + DECL_TEMPLATE_RESULT (clone) = result; + DECL_TEMPLATE_INFO (result) = copy_node (DECL_TEMPLATE_INFO (result)); + DECL_TI_TEMPLATE (result) = clone; + TREE_TYPE (clone) = TREE_TYPE (result); + return clone; + } + + DECL_CLONED_FUNCTION (clone) = fn; + /* There's no pending inline data for this function. */ + DECL_PENDING_INLINE_INFO (clone) = NULL; + DECL_PENDING_INLINE_P (clone) = 0; + + /* The base-class destructor is not virtual. */ + if (name == base_dtor_identifier) + { + DECL_VIRTUAL_P (clone) = 0; + if (TREE_CODE (clone) != TEMPLATE_DECL) + DECL_VINDEX (clone) = NULL_TREE; + } + + /* If there was an in-charge parameter, drop it from the function + type. */ + if (DECL_HAS_IN_CHARGE_PARM_P (clone)) + { + tree basetype; + tree parmtypes; + tree exceptions; + + exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (clone)); + basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (clone)); + parmtypes = TYPE_ARG_TYPES (TREE_TYPE (clone)); + /* Skip the `this' parameter. */ + parmtypes = TREE_CHAIN (parmtypes); + /* Skip the in-charge parameter. */ + parmtypes = TREE_CHAIN (parmtypes); + /* And the VTT parm, in a complete [cd]tor. */ + if (DECL_HAS_VTT_PARM_P (fn) + && ! DECL_NEEDS_VTT_PARM_P (clone)) + parmtypes = TREE_CHAIN (parmtypes); + /* 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. */ + DECL_ARGUMENTS (clone) = copy_list (DECL_ARGUMENTS (clone)); + /* Remove the in-charge parameter. */ + if (DECL_HAS_IN_CHARGE_PARM_P (clone)) + { + DECL_CHAIN (DECL_ARGUMENTS (clone)) + = DECL_CHAIN (DECL_CHAIN (DECL_ARGUMENTS (clone))); + DECL_HAS_IN_CHARGE_PARM_P (clone) = 0; + } + /* And the VTT parm, in a complete [cd]tor. */ + if (DECL_HAS_VTT_PARM_P (fn)) + { + if (DECL_NEEDS_VTT_PARM_P (clone)) + DECL_HAS_VTT_PARM_P (clone) = 1; + else + { + DECL_CHAIN (DECL_ARGUMENTS (clone)) + = DECL_CHAIN (DECL_CHAIN (DECL_ARGUMENTS (clone))); + DECL_HAS_VTT_PARM_P (clone) = 0; + } + } + + for (parms = DECL_ARGUMENTS (clone); parms; parms = DECL_CHAIN (parms)) + { + DECL_CONTEXT (parms) = clone; + cxx_dup_lang_specific_decl (parms); + } + + /* Create the RTL for this function. */ + SET_DECL_RTL (clone, NULL); + rest_of_decl_compilation (clone, /*top_level=*/1, at_eof); + + if (pch_file) + note_decl_for_pch (clone); + + return clone; +} + +/* Implementation of DECL_CLONED_FUNCTION and DECL_CLONED_FUNCTION_P, do + not invoke this function directly. + + For a non-thunk function, returns the address of the slot for storing + the function it is a clone of. Otherwise returns NULL_TREE. + + If JUST_TESTING, looks through TEMPLATE_DECL and returns NULL if + cloned_function is unset. This is to support the separate + DECL_CLONED_FUNCTION and DECL_CLONED_FUNCTION_P modes; using the latter + on a template makes sense, but not the former. */ + +tree * +decl_cloned_function_p (const_tree decl, bool just_testing) +{ + tree *ptr; + if (just_testing) + decl = STRIP_TEMPLATE (decl); + + if (TREE_CODE (decl) != FUNCTION_DECL + || !DECL_LANG_SPECIFIC (decl) + || DECL_LANG_SPECIFIC (decl)->u.fn.thunk_p) + { +#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) + if (!just_testing) + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); + else +#endif + return NULL; + } + + ptr = &DECL_LANG_SPECIFIC (decl)->u.fn.u5.cloned_function; + if (just_testing && *ptr == NULL_TREE) + return NULL; + else + return ptr; +} + +/* Produce declarations for all appropriate clones of FN. If + UPDATE_METHOD_VEC_P is nonzero, the clones are added to the + CLASTYPE_METHOD_VEC as well. */ + +void +clone_function_decl (tree fn, int update_method_vec_p) +{ + tree clone; + + /* Avoid inappropriate cloning. */ + if (DECL_CHAIN (fn) + && DECL_CLONED_FUNCTION_P (DECL_CHAIN (fn))) + return; + + if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)) + { + /* For each constructor, we need two variants: an in-charge version + and a not-in-charge version. */ + clone = build_clone (fn, complete_ctor_identifier); + if (update_method_vec_p) + add_method (DECL_CONTEXT (clone), clone, NULL_TREE); + clone = build_clone (fn, base_ctor_identifier); + if (update_method_vec_p) + add_method (DECL_CONTEXT (clone), clone, NULL_TREE); + } + else + { + gcc_assert (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn)); + + /* For each destructor, we need three variants: an in-charge + version, a not-in-charge version, and an in-charge deleting + version. We clone the deleting version first because that + means it will go second on the TYPE_METHODS list -- and that + corresponds to the correct layout order in the virtual + function table. + + For a non-virtual destructor, we do not build a deleting + destructor. */ + if (DECL_VIRTUAL_P (fn)) + { + clone = build_clone (fn, deleting_dtor_identifier); + if (update_method_vec_p) + add_method (DECL_CONTEXT (clone), clone, NULL_TREE); + } + clone = build_clone (fn, complete_dtor_identifier); + if (update_method_vec_p) + add_method (DECL_CONTEXT (clone), clone, NULL_TREE); + clone = build_clone (fn, base_dtor_identifier); + if (update_method_vec_p) + add_method (DECL_CONTEXT (clone), clone, NULL_TREE); + } + + /* Note that this is an abstract function that is never emitted. */ + DECL_ABSTRACT (fn) = 1; +} + +/* DECL is an in charge constructor, which is being defined. This will + have had an in class declaration, from whence clones were + declared. An out-of-class definition can specify additional default + arguments. As it is the clones that are involved in overload + resolution, we must propagate the information from the DECL to its + clones. */ + +void +adjust_clone_args (tree decl) +{ + tree clone; + + for (clone = DECL_CHAIN (decl); clone && DECL_CLONED_FUNCTION_P (clone); + clone = DECL_CHAIN (clone)) + { + tree orig_clone_parms = TYPE_ARG_TYPES (TREE_TYPE (clone)); + tree orig_decl_parms = TYPE_ARG_TYPES (TREE_TYPE (decl)); + tree decl_parms, clone_parms; + + clone_parms = orig_clone_parms; + + /* Skip the 'this' parameter. */ + orig_clone_parms = TREE_CHAIN (orig_clone_parms); + orig_decl_parms = TREE_CHAIN (orig_decl_parms); + + if (DECL_HAS_IN_CHARGE_PARM_P (decl)) + orig_decl_parms = TREE_CHAIN (orig_decl_parms); + if (DECL_HAS_VTT_PARM_P (decl)) + orig_decl_parms = TREE_CHAIN (orig_decl_parms); + + clone_parms = orig_clone_parms; + if (DECL_HAS_VTT_PARM_P (clone)) + clone_parms = TREE_CHAIN (clone_parms); + + for (decl_parms = orig_decl_parms; decl_parms; + decl_parms = TREE_CHAIN (decl_parms), + clone_parms = TREE_CHAIN (clone_parms)) + { + gcc_assert (same_type_p (TREE_TYPE (decl_parms), + TREE_TYPE (clone_parms))); + + if (TREE_PURPOSE (decl_parms) && !TREE_PURPOSE (clone_parms)) + { + /* A default parameter has been added. Adjust the + clone's parameters. */ + tree exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (clone)); + tree attrs = TYPE_ATTRIBUTES (TREE_TYPE (clone)); + tree basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (clone)); + tree type; + + clone_parms = orig_decl_parms; + + if (DECL_HAS_VTT_PARM_P (clone)) + { + clone_parms = tree_cons (TREE_PURPOSE (orig_clone_parms), + TREE_VALUE (orig_clone_parms), + 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); + if (attrs) + type = cp_build_type_attribute_variant (type, attrs); + TREE_TYPE (clone) = type; + + clone_parms = NULL_TREE; + break; + } + } + gcc_assert (!clone_parms); + } +} + +/* For each of the constructors and destructors in T, create an + in-charge and not-in-charge variant. */ + +static void +clone_constructors_and_destructors (tree t) +{ + tree fns; + + /* If for some reason we don't have a CLASSTYPE_METHOD_VEC, we bail + out now. */ + if (!CLASSTYPE_METHOD_VEC (t)) + return; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + clone_function_decl (OVL_CURRENT (fns), /*update_method_vec_p=*/1); + for (fns = CLASSTYPE_DESTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + clone_function_decl (OVL_CURRENT (fns), /*update_method_vec_p=*/1); +} + +/* Returns true iff class T has a user-defined constructor other than + the default constructor. */ + +bool +type_has_user_nondefault_constructor (tree t) +{ + tree fns; + + if (!TYPE_HAS_USER_CONSTRUCTOR (t)) + return false; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + if (!DECL_ARTIFICIAL (fn) + && (TREE_CODE (fn) == TEMPLATE_DECL + || (skip_artificial_parms_for (fn, DECL_ARGUMENTS (fn)) + != NULL_TREE))) + return true; + } + + return false; +} + +/* Returns the defaulted constructor if T has one. Otherwise, returns + NULL_TREE. */ + +tree +in_class_defaulted_default_constructor (tree t) +{ + tree fns, args; + + if (!TYPE_HAS_USER_CONSTRUCTOR (t)) + return NULL_TREE; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + + if (DECL_DEFAULTED_IN_CLASS_P (fn)) + { + args = FUNCTION_FIRST_USER_PARMTYPE (fn); + while (args && TREE_PURPOSE (args)) + args = TREE_CHAIN (args); + if (!args || args == void_list_node) + return fn; + } + } + + return NULL_TREE; +} + +/* Returns true iff FN is a user-provided function, i.e. user-declared + and not defaulted at its first declaration; or explicit, private, + protected, or non-const. */ + +bool +user_provided_p (tree fn) +{ + if (TREE_CODE (fn) == TEMPLATE_DECL) + return true; + else + return (!DECL_ARTIFICIAL (fn) + && !DECL_DEFAULTED_IN_CLASS_P (fn)); +} + +/* Returns true iff class T has a user-provided constructor. */ + +bool +type_has_user_provided_constructor (tree t) +{ + tree fns; + + if (!CLASS_TYPE_P (t)) + return false; + + if (!TYPE_HAS_USER_CONSTRUCTOR (t)) + return false; + + /* This can happen in error cases; avoid crashing. */ + if (!CLASSTYPE_METHOD_VEC (t)) + return false; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + if (user_provided_p (OVL_CURRENT (fns))) + return true; + + return false; +} + +/* Returns true iff class T has a user-provided default constructor. */ + +bool +type_has_user_provided_default_constructor (tree t) +{ + tree fns; + + if (!TYPE_HAS_USER_CONSTRUCTOR (t)) + return false; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + if (TREE_CODE (fn) == FUNCTION_DECL + && user_provided_p (fn) + && sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (fn))) + return true; + } + + return false; +} + +/* If default-initialization leaves part of TYPE uninitialized, returns + a DECL for the field or TYPE itself (DR 253). */ + +tree +default_init_uninitialized_part (tree type) +{ + tree t, r, binfo; + int i; + + type = strip_array_types (type); + if (!CLASS_TYPE_P (type)) + return type; + if (type_has_user_provided_default_constructor (type)) + return NULL_TREE; + for (binfo = TYPE_BINFO (type), i = 0; + BINFO_BASE_ITERATE (binfo, i, t); ++i) + { + r = default_init_uninitialized_part (BINFO_TYPE (t)); + if (r) + return r; + } + for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t)) + if (TREE_CODE (t) == FIELD_DECL + && !DECL_ARTIFICIAL (t) + && !DECL_INITIAL (t)) + { + r = default_init_uninitialized_part (TREE_TYPE (t)); + if (r) + return DECL_P (r) ? r : t; + } + + return NULL_TREE; +} + +/* Returns true iff for class T, a synthesized default constructor + would be constexpr. */ + +bool +synthesized_default_constructor_is_constexpr (tree t) +{ + /* A defaulted default constructor is constexpr + if there is nothing to initialize. */ + /* FIXME adjust for non-static data member initializers. */ + return is_really_empty_class (t); +} + +/* Returns true iff class T has a constexpr default constructor. */ + +bool +type_has_constexpr_default_constructor (tree t) +{ + tree fns; + + if (!CLASS_TYPE_P (t)) + { + /* The caller should have stripped an enclosing array. */ + gcc_assert (TREE_CODE (t) != ARRAY_TYPE); + return false; + } + if (CLASSTYPE_LAZY_DEFAULT_CTOR (t)) + return synthesized_default_constructor_is_constexpr (t); + fns = locate_ctor (t); + return (fns && DECL_DECLARED_CONSTEXPR_P (fns)); +} + +/* Returns true iff class TYPE has a virtual destructor. */ + +bool +type_has_virtual_destructor (tree type) +{ + tree dtor; + + if (!CLASS_TYPE_P (type)) + return false; + + gcc_assert (COMPLETE_TYPE_P (type)); + dtor = CLASSTYPE_DESTRUCTORS (type); + return (dtor && DECL_VIRTUAL_P (dtor)); +} + +/* Returns true iff class T has a move constructor. */ + +bool +type_has_move_constructor (tree t) +{ + tree fns; + + if (CLASSTYPE_LAZY_MOVE_CTOR (t)) + { + gcc_assert (COMPLETE_TYPE_P (t)); + lazily_declare_fn (sfk_move_constructor, t); + } + + if (!CLASSTYPE_METHOD_VEC (t)) + return false; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + if (move_fn_p (OVL_CURRENT (fns))) + return true; + + return false; +} + +/* Returns true iff class T has a move assignment operator. */ + +bool +type_has_move_assign (tree t) +{ + tree fns; + + if (CLASSTYPE_LAZY_MOVE_ASSIGN (t)) + { + gcc_assert (COMPLETE_TYPE_P (t)); + lazily_declare_fn (sfk_move_assignment, t); + } + + for (fns = lookup_fnfields_slot (t, ansi_assopname (NOP_EXPR)); + fns; fns = OVL_NEXT (fns)) + if (move_fn_p (OVL_CURRENT (fns))) + return true; + + return false; +} + +/* Remove all zero-width bit-fields from T. */ + +static void +remove_zero_width_bit_fields (tree t) +{ + tree *fieldsp; + + fieldsp = &TYPE_FIELDS (t); + while (*fieldsp) + { + if (TREE_CODE (*fieldsp) == FIELD_DECL + && DECL_C_BIT_FIELD (*fieldsp) + /* We should not be confused by the fact that grokbitfield + temporarily sets the width of the bit field into + DECL_INITIAL (*fieldsp). + check_bitfield_decl eventually sets DECL_SIZE (*fieldsp) + to that width. */ + && integer_zerop (DECL_SIZE (*fieldsp))) + *fieldsp = DECL_CHAIN (*fieldsp); + else + fieldsp = &DECL_CHAIN (*fieldsp); + } +} + +/* Returns TRUE iff we need a cookie when dynamically allocating an + 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; + + gcc_assert (CLASS_TYPE_P (type)); + + /* If there's a non-trivial destructor, we need a cookie. In order + to iterate through the array calling the destructor for each + element, we'll have to know how many elements there are. */ + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + return true; + + /* If the usual deallocation function is a two-argument whose second + argument is of type `size_t', then we have to pass the size of + the array to the deallocation function, so we will need to store + a cookie. */ + fns = lookup_fnfields (TYPE_BINFO (type), + ansi_opname (VEC_DELETE_EXPR), + /*protect=*/0); + /* If there are no `operator []' members, or the lookup is + ambiguous, then we don't need a cookie. */ + if (!fns || fns == error_mark_node) + return false; + /* Loop through all of the functions. */ + for (fns = BASELINK_FUNCTIONS (fns); fns; fns = OVL_NEXT (fns)) + { + tree fn; + tree second_parm; + + /* Select the current function. */ + fn = OVL_CURRENT (fns); + /* See if this function is a one-argument delete function. If + it is, then it will be the usual deallocation function. */ + second_parm = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn))); + if (second_parm == void_list_node) + return false; + /* Do not consider this function if its second argument is an + ellipsis. */ + if (!second_parm) + continue; + /* Otherwise, if we have a two-argument function and the second + argument is `size_t', it will be the usual deallocation + function -- unless there is one-argument function, too. */ + if (TREE_CHAIN (second_parm) == void_list_node + && same_type_p (TREE_VALUE (second_parm), size_type_node)) + has_two_argument_delete_p = true; + } + + return has_two_argument_delete_p; +} + +/* Finish computing the `literal type' property of class type T. + + At this point, we have already processed base classes and + non-static data members. We need to check whether the copy + constructor is trivial, the destructor is trivial, and there + is a trivial default constructor or at least one constexpr + constructor other than the copy constructor. */ + +static void +finalize_literal_type_property (tree t) +{ + tree fn; + + if (cxx_dialect < cxx0x + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) + /* FIXME These constraints seem unnecessary; remove from standard. + || !TYPE_HAS_TRIVIAL_COPY_CTOR (t) + || TYPE_HAS_COMPLEX_MOVE_CTOR (t)*/ ) + CLASSTYPE_LITERAL_P (t) = false; + else if (CLASSTYPE_LITERAL_P (t) && !TYPE_HAS_TRIVIAL_DFLT (t) + && !TYPE_HAS_CONSTEXPR_CTOR (t)) + CLASSTYPE_LITERAL_P (t) = false; + + if (!CLASSTYPE_LITERAL_P (t)) + for (fn = TYPE_METHODS (t); fn; fn = DECL_CHAIN (fn)) + if (DECL_DECLARED_CONSTEXPR_P (fn) + && TREE_CODE (fn) != TEMPLATE_DECL + && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) + && !DECL_CONSTRUCTOR_P (fn)) + { + DECL_DECLARED_CONSTEXPR_P (fn) = false; + if (!DECL_TEMPLATE_INFO (fn)) + error ("enclosing class of %q+#D is not a literal type", fn); + } +} + +/* Check the validity of the bases and members declared in T. Add any + implicitly-generated functions (like copy-constructors and + assignment operators). Compute various flag bits (like + CLASSTYPE_NON_LAYOUT_POD_T) for T. This routine works purely at the C++ + level: i.e., independently of the ABI in use. */ + +static void +check_bases_and_members (tree t) +{ + /* Nonzero if the implicitly generated copy constructor should take + a non-const reference argument. */ + int cant_have_const_ctor; + /* Nonzero if the implicitly generated assignment operator + should take a non-const reference argument. */ + int no_const_asn_ref; + tree access_decls; + bool saved_complex_asn_ref; + bool saved_nontrivial_dtor; + tree fn; + + /* By default, we use const reference arguments and generate default + constructors. */ + cant_have_const_ctor = 0; + no_const_asn_ref = 0; + + /* Check all the base-classes. */ + check_bases (t, &cant_have_const_ctor, + &no_const_asn_ref); + + /* Check all the method declarations. */ + check_methods (t); + + /* Save the initial values of these flags which only indicate whether + or not the class has user-provided functions. As we analyze the + bases and members we can set these flags for other reasons. */ + saved_complex_asn_ref = TYPE_HAS_COMPLEX_COPY_ASSIGN (t); + saved_nontrivial_dtor = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t); + + /* Check all the data member declarations. We cannot call + check_field_decls until we have called check_bases check_methods, + as check_field_decls depends on TYPE_HAS_NONTRIVIAL_DESTRUCTOR + being set appropriately. */ + check_field_decls (t, &access_decls, + &cant_have_const_ctor, + &no_const_asn_ref); + + /* A nearly-empty class has to be vptr-containing; a nearly empty + class contains just a vptr. */ + if (!TYPE_CONTAINS_VPTR_P (t)) + CLASSTYPE_NEARLY_EMPTY_P (t) = 0; + + /* Do some bookkeeping that will guide the generation of implicitly + declared member functions. */ + TYPE_HAS_COMPLEX_COPY_CTOR (t) |= TYPE_CONTAINS_VPTR_P (t); + TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_CONTAINS_VPTR_P (t); + /* We need to call a constructor for this class if it has a + user-provided constructor, or if the default constructor is going + to initialize the vptr. (This is not an if-and-only-if; + TYPE_NEEDS_CONSTRUCTING is set elsewhere if bases or members + themselves need constructing.) */ + TYPE_NEEDS_CONSTRUCTING (t) + |= (type_has_user_provided_constructor (t) || TYPE_CONTAINS_VPTR_P (t)); + /* [dcl.init.aggr] + + An aggregate is an array or a class with no user-provided + constructors ... and no virtual functions. + + Again, other conditions for being an aggregate are checked + elsewhere. */ + CLASSTYPE_NON_AGGREGATE (t) + |= (type_has_user_provided_constructor (t) || TYPE_POLYMORPHIC_P (t)); + /* This is the C++98/03 definition of POD; it changed in C++0x, but we + retain the old definition internally for ABI reasons. */ + CLASSTYPE_NON_LAYOUT_POD_P (t) + |= (CLASSTYPE_NON_AGGREGATE (t) + || saved_nontrivial_dtor || saved_complex_asn_ref); + CLASSTYPE_NON_STD_LAYOUT (t) |= TYPE_CONTAINS_VPTR_P (t); + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) |= TYPE_CONTAINS_VPTR_P (t); + TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) |= TYPE_CONTAINS_VPTR_P (t); + TYPE_HAS_COMPLEX_DFLT (t) |= TYPE_CONTAINS_VPTR_P (t); + + /* If the class has no user-declared constructor, but does have + non-static const or reference data members that can never be + initialized, issue a warning. */ + if (warn_uninitialized + /* Classes with user-declared constructors are presumed to + initialize these members. */ + && !TYPE_HAS_USER_CONSTRUCTOR (t) + /* Aggregates can be initialized with brace-enclosed + initializers. */ + && CLASSTYPE_NON_AGGREGATE (t)) + { + tree field; + + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + { + tree type; + + if (TREE_CODE (field) != FIELD_DECL) + continue; + + type = TREE_TYPE (field); + if (TREE_CODE (type) == REFERENCE_TYPE) + warning (OPT_Wuninitialized, "non-static reference %q+#D " + "in class without a constructor", field); + else if (CP_TYPE_CONST_P (type) + && (!CLASS_TYPE_P (type) + || !TYPE_HAS_DEFAULT_CONSTRUCTOR (type))) + warning (OPT_Wuninitialized, "non-static const member %q+#D " + "in class without a constructor", field); + } + } + + /* Synthesize any needed methods. */ + add_implicitly_declared_members (t, + cant_have_const_ctor, + no_const_asn_ref); + + /* Check defaulted declarations here so we have cant_have_const_ctor + and don't need to worry about clones. */ + for (fn = TYPE_METHODS (t); fn; fn = DECL_CHAIN (fn)) + if (DECL_DEFAULTED_IN_CLASS_P (fn)) + { + int copy = copy_fn_p (fn); + if (copy > 0) + { + bool imp_const_p + = (DECL_CONSTRUCTOR_P (fn) ? !cant_have_const_ctor + : !no_const_asn_ref); + bool fn_const_p = (copy == 2); + + if (fn_const_p && !imp_const_p) + /* If the function is defaulted outside the class, we just + give the synthesis error. */ + error ("%q+D declared to take const reference, but implicit " + "declaration would take non-const", fn); + else if (imp_const_p && !fn_const_p) + error ("%q+D declared to take non-const reference cannot be " + "defaulted in the class body", fn); + } + defaulted_late_check (fn); + } + + if (LAMBDA_TYPE_P (t)) + { + /* "The closure type associated with a lambda-expression has a deleted + default constructor and a deleted copy assignment operator." */ + TYPE_NEEDS_CONSTRUCTING (t) = 1; + TYPE_HAS_COMPLEX_DFLT (t) = 1; + TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1; + CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 0; + + /* "This class type is not an aggregate." */ + CLASSTYPE_NON_AGGREGATE (t) = 1; + } + + /* Compute the 'literal type' property before we + do anything with non-static member functions. */ + finalize_literal_type_property (t); + + /* Create the in-charge and not-in-charge variants of constructors + and destructors. */ + clone_constructors_and_destructors (t); + + /* Process the using-declarations. */ + for (; access_decls; access_decls = TREE_CHAIN (access_decls)) + handle_using_decl (TREE_VALUE (access_decls), t); + + /* Build and sort the CLASSTYPE_METHOD_VEC. */ + finish_struct_methods (t); + + /* Figure out whether or not we will need a cookie when dynamically + allocating an array of this type. */ + TYPE_LANG_SPECIFIC (t)->u.c.vec_new_uses_cookie + = type_requires_array_cookie (t); +} + +/* If T needs a pointer to its virtual function table, set TYPE_VFIELD + accordingly. If a new vfield was created (because T doesn't have a + primary base class), then the newly created field is returned. It + is not added to the TYPE_FIELDS list; it is the caller's + responsibility to do that. Accumulate declared virtual functions + on VIRTUALS_P. */ + +static tree +create_vtable_ptr (tree t, tree* virtuals_p) +{ + tree fn; + + /* Collect the virtual functions declared in T. */ + for (fn = TYPE_METHODS (t); fn; fn = DECL_CHAIN (fn)) + if (DECL_VINDEX (fn) && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn) + && TREE_CODE (DECL_VINDEX (fn)) != INTEGER_CST) + { + tree new_virtual = make_node (TREE_LIST); + + BV_FN (new_virtual) = fn; + BV_DELTA (new_virtual) = integer_zero_node; + BV_VCALL_INDEX (new_virtual) = NULL_TREE; + + TREE_CHAIN (new_virtual) = *virtuals_p; + *virtuals_p = new_virtual; + } + + /* If we couldn't find an appropriate base class, create a new field + here. Even if there weren't any new virtual functions, we might need a + new virtual function table if we're supposed to include vptrs in + all classes that need them. */ + if (!TYPE_VFIELD (t) && (*virtuals_p || TYPE_CONTAINS_VPTR_P (t))) + { + /* We build this decl with vtbl_ptr_type_node, which is a + `vtable_entry_type*'. It might seem more precise to use + `vtable_entry_type (*)[N]' where N is the number of virtual + functions. However, that would require the vtable pointer in + base classes to have a different type than the vtable pointer + in derived classes. We could make that happen, but that + still wouldn't solve all the problems. In particular, the + 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. + + Therefore, we use one type for all vtable pointers. We still + use a type-correct type; it's just doesn't indicate the array + bounds. That's better than using `void*' or some such; it's + cleaner, and it let's the alias analysis code know that these + stores cannot alias stores to void*! */ + tree field; + + field = build_decl (input_location, + FIELD_DECL, get_vfield_name (t), vtbl_ptr_type_node); + DECL_VIRTUAL_P (field) = 1; + DECL_ARTIFICIAL (field) = 1; + DECL_FIELD_CONTEXT (field) = t; + DECL_FCONTEXT (field) = t; + if (TYPE_PACKED (t)) + DECL_PACKED (field) = 1; + + TYPE_VFIELD (t) = field; + + /* This class is non-empty. */ + CLASSTYPE_EMPTY_P (t) = 0; + + return field; + } + + return NULL_TREE; +} + +/* Add OFFSET to all base types of BINFO which is a base in the + hierarchy dominated by T. + + OFFSET, which is a type offset, is number of bytes. */ + +static void +propagate_binfo_offsets (tree binfo, tree offset) +{ + int i; + tree primary_binfo; + tree base_binfo; + + /* Update BINFO's offset. */ + BINFO_OFFSET (binfo) + = convert (sizetype, + size_binop (PLUS_EXPR, + convert (ssizetype, BINFO_OFFSET (binfo)), + offset)); + + /* Find the primary base class. */ + primary_binfo = get_primary_binfo (binfo); + + if (primary_binfo && BINFO_INHERITANCE_CHAIN (primary_binfo) == binfo) + propagate_binfo_offsets (primary_binfo, offset); + + /* Scan all of the bases, pushing the BINFO_OFFSET adjust + downwards. */ + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + { + /* Don't do the primary base twice. */ + if (base_binfo == primary_binfo) + continue; + + if (BINFO_VIRTUAL_P (base_binfo)) + continue; + + propagate_binfo_offsets (base_binfo, offset); + } +} + +/* Set BINFO_OFFSET for all of the virtual bases for RLI->T. Update + TYPE_ALIGN and TYPE_SIZE for T. OFFSETS gives the location of + empty subobjects of T. */ + +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; + + if (BINFO_N_BASE_BINFOS (TYPE_BINFO (t)) == 0) + return; + + if (!abi_version_at_least(2)) + { + /* In G++ 3.2, we incorrectly rounded the size before laying out + the virtual bases. */ + finish_record_layout (rli, /*free_p=*/false); +#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; + rli->record_align = TYPE_ALIGN (t); + } + + /* Find the last field. The artificial fields created for virtual + bases will go after the last extant field to date. */ + next_field = &TYPE_FIELDS (t); + while (*next_field) + next_field = &DECL_CHAIN (*next_field); + + /* 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 (!BINFO_VIRTUAL_P (vbase)) + continue; + + if (!BINFO_PRIMARY_P (vbase)) + { + tree basetype = TREE_TYPE (vbase); + + /* This virtual base is not a primary base of any class in the + hierarchy, so we have to add space for it. */ + next_field = build_base_field (rli, vbase, + offsets, next_field); + + /* If the first virtual base might have been placed at a + lower address, had we started from CLASSTYPE_SIZE, rather + than TYPE_SIZE, issue a warning. There can be both false + positives and false negatives from this warning in rare + cases; to deal with all the possibilities would probably + require performing both layout algorithms and comparing + the results which is not particularly tractable. */ + if (warn_abi + && first_vbase + && (tree_int_cst_lt + (size_binop (CEIL_DIV_EXPR, + round_up_loc (input_location, + CLASSTYPE_SIZE (t), + CLASSTYPE_ALIGN (basetype)), + bitsize_unit_node), + BINFO_OFFSET (vbase)))) + warning (OPT_Wabi, + "offset of virtual base %qT is not ABI-compliant and " + "may change in a future version of GCC", + basetype); + + first_vbase = false; + } + } +} + +/* Returns the offset of the byte just past the end of the base class + BINFO. */ + +static tree +end_of_base (tree binfo) +{ + tree size; + + if (!CLASSTYPE_AS_BASE (BINFO_TYPE (binfo))) + size = TYPE_SIZE_UNIT (char_type_node); + else if (is_empty_class (BINFO_TYPE (binfo))) + /* An empty class has zero CLASSTYPE_SIZE_UNIT, but we need to + allocate some space for it. It cannot have virtual bases, so + TYPE_SIZE_UNIT is fine. */ + size = TYPE_SIZE_UNIT (BINFO_TYPE (binfo)); + else + size = CLASSTYPE_SIZE_UNIT (BINFO_TYPE (binfo)); + + return size_binop (PLUS_EXPR, BINFO_OFFSET (binfo), size); +} + +/* Returns the offset of the byte just past the end of the base class + with the highest offset in T. If INCLUDE_VIRTUALS_P is zero, then + only non-virtual bases are included. */ + +static tree +end_of_class (tree t, int include_virtuals_p) +{ + tree result = size_zero_node; + VEC(tree,gc) *vbases; + tree binfo; + tree base_binfo; + tree offset; + int i; + + for (binfo = TYPE_BINFO (t), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + { + if (!include_virtuals_p + && BINFO_VIRTUAL_P (base_binfo) + && (!BINFO_PRIMARY_P (base_binfo) + || BINFO_INHERITANCE_CHAIN (base_binfo) != TYPE_BINFO (t))) + continue; + + offset = end_of_base (base_binfo); + if (INT_CST_LT_UNSIGNED (result, offset)) + result = offset; + } + + /* G++ 3.2 did not check indirect virtual bases. */ + if (abi_version_at_least (2) && include_virtuals_p) + for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0; + VEC_iterate (tree, vbases, i, base_binfo); i++) + { + offset = end_of_base (base_binfo); + if (INT_CST_LT_UNSIGNED (result, offset)) + result = offset; + } + + return result; +} + +/* Warn about bases of T that are inaccessible because they are + ambiguous. For example: + + struct S {}; + struct T : public S {}; + struct U : public S, public T {}; + + Here, `(S*) new U' is not allowed because there are two `S' + subobjects of U. */ + +static void +warn_about_ambiguous_bases (tree t) +{ + int i; + VEC(tree,gc) *vbases; + tree basetype; + tree binfo; + tree base_binfo; + + /* If there are no repeated bases, nothing can be ambiguous. */ + if (!CLASSTYPE_REPEATED_BASE_P (t)) + return; + + /* Check direct bases. */ + for (binfo = TYPE_BINFO (t), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + { + basetype = BINFO_TYPE (base_binfo); + + if (!lookup_base (t, basetype, ba_unique | ba_quiet, NULL)) + warning (0, "direct base %qT inaccessible in %qT due to ambiguity", + basetype, t); + } + + /* Check for ambiguous virtual bases. */ + if (extra_warnings) + for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0; + VEC_iterate (tree, vbases, i, binfo); i++) + { + basetype = BINFO_TYPE (binfo); + + if (!lookup_base (t, basetype, ba_unique | ba_quiet, NULL)) + warning (OPT_Wextra, "virtual base %qT inaccessible in %qT due to ambiguity", + basetype, t); + } +} + +/* 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); +} + +/* Increase the size indicated in RLI to account for empty classes + that are "off the end" of the class. */ + +static void +include_empty_classes (record_layout_info rli) +{ + tree eoc; + tree rli_size; + + /* It might be the case that we grew the class to allocate a + zero-sized base class. That won't be reflected in RLI, yet, + because we are willing to overlay multiple bases at the same + offset. However, now we need to make sure that RLI is big enough + to reflect the entire class. */ + eoc = end_of_class (rli->t, + CLASSTYPE_AS_BASE (rli->t) != NULL_TREE); + rli_size = rli_size_unit_so_far (rli); + 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. */ + gcc_assert (tree_int_cst_equal + (rli->bitpos, round_down (rli->bitpos, BITS_PER_UNIT))); + rli->bitpos + = size_binop (PLUS_EXPR, + rli->bitpos, + size_binop (MULT_EXPR, + convert (bitsizetype, + size_binop (MINUS_EXPR, + eoc, rli_size)), + bitsize_int (BITS_PER_UNIT))); + normalize_rli (rli); + } +} + +/* Calculate the TYPE_SIZE, TYPE_ALIGN, etc for T. Calculate + BINFO_OFFSETs for all of the base-classes. Position the vtable + pointer. Accumulate declared virtual functions on VIRTUALS_P. */ + +static void +layout_class_type (tree t, tree *virtuals_p) +{ + tree non_static_data_members; + tree field; + tree vptr; + record_layout_info rli; + /* Maps offsets (represented as INTEGER_CSTs) to a TREE_LIST of + types that appear at that offset. */ + splay_tree empty_base_offsets; + /* True if the last field layed out was a bit-field. */ + bool last_field_was_bitfield = false; + /* The location at which the next field should be inserted. */ + tree *next_field; + /* T, as a base class. */ + tree base_t; + + /* Keep track of the first non-static data member. */ + non_static_data_members = TYPE_FIELDS (t); + + /* Start laying out the record. */ + rli = start_record_layout (t); + + /* Mark all the primary bases in the hierarchy. */ + determine_primary_bases (t); + + /* Create a pointer to our virtual function table. */ + vptr = create_vtable_ptr (t, virtuals_p); + + /* The vptr is always the first thing in the class. */ + if (vptr) + { + DECL_CHAIN (vptr) = TYPE_FIELDS (t); + TYPE_FIELDS (t) = vptr; + next_field = &DECL_CHAIN (vptr); + place_field (rli, vptr); + } + else + next_field = &TYPE_FIELDS (t); + + /* Build FIELD_DECLs for all of the non-virtual base-types. */ + empty_base_offsets = splay_tree_new (splay_tree_compare_integer_csts, + NULL, NULL); + build_base_fields (rli, empty_base_offsets, next_field); + + /* Layout the non-static data members. */ + for (field = non_static_data_members; field; field = DECL_CHAIN (field)) + { + tree type; + tree padding; + + /* We still pass things that aren't non-static data members to + the back end, in case it wants to do something with them. */ + if (TREE_CODE (field) != FIELD_DECL) + { + place_field (rli, field); + /* If the static data member has incomplete type, keep track + of it so that it can be completed later. (The handling + of pending statics in finish_record_layout is + insufficient; consider: + + struct S1; + struct S2 { static S1 s1; }; + + At this point, finish_record_layout will be called, but + S1 is still incomplete.) */ + if (TREE_CODE (field) == VAR_DECL) + { + maybe_register_incomplete_var (field); + /* The visibility of static data members is determined + at their point of declaration, not their point of + definition. */ + determine_visibility (field); + } + continue; + } + + type = TREE_TYPE (field); + if (type == error_mark_node) + continue; + + 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 + it. */ + if (DECL_C_BIT_FIELD (field) + && INT_CST_LT (TYPE_SIZE (type), DECL_SIZE (field))) + { + unsigned int 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 + bits as additional padding. */ + for (itk = itk_char; itk != itk_none; ++itk) + if (integer_types[itk] != NULL_TREE + && (INT_CST_LT (size_int (MAX_FIXED_MODE_SIZE), + TYPE_SIZE (integer_types[itk])) + || INT_CST_LT (DECL_SIZE (field), + TYPE_SIZE (integer_types[itk])))) + break; + + /* ITK now indicates a type that is too large for the + field. We have to back up by one to find the largest + type that fits. */ + do + { + --itk; + integer_type = integer_types[itk]; + } while (itk > 0 && integer_type == NULL_TREE); + + /* 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 (TREE_CODE (t) == UNION_TYPE) + warning (OPT_Wabi, "size assigned to %qT 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. */ + DECL_SIZE (field) = TYPE_SIZE (type); + /* We must also reset the DECL_MODE of the field. */ + if (abi_version_at_least (2)) + DECL_MODE (field) = TYPE_MODE (type); + else if (warn_abi + && DECL_MODE (field) != TYPE_MODE (type)) + /* Versions of G++ before G++ 3.4 did not reset the + DECL_MODE. */ + warning (OPT_Wabi, + "the offset of %qD may not be ABI-compliant and may " + "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)) + record_subobject_offsets (TREE_TYPE (field), + byte_position(field), + empty_base_offsets, + /*is_data_member=*/true); + + /* If a bit-field does not immediately follow another bit-field, + and yet it starts in the middle of a byte, we have failed to + comply with the ABI. */ + if (warn_abi + && DECL_C_BIT_FIELD (field) + /* The TREE_NO_WARNING flag gets set by Objective-C when + laying out an Objective-C class. The ObjC ABI differs + from the C++ ABI, and so we do not want a warning + here. */ + && !TREE_NO_WARNING (field) + && !last_field_was_bitfield + && !integer_zerop (size_binop (TRUNC_MOD_EXPR, + DECL_FIELD_BIT_OFFSET (field), + bitsize_unit_node))) + warning (OPT_Wabi, "offset of %q+D is not ABI-compliant and may " + "change in a future version of GCC", field); + + /* G++ used to use DECL_FIELD_OFFSET as if it were the byte + offset of the field. */ + if (warn_abi + && !abi_version_at_least (2) + && !tree_int_cst_equal (DECL_FIELD_OFFSET (field), + byte_position (field)) + && contains_empty_class_p (TREE_TYPE (field))) + warning (OPT_Wabi, "%q+D contains empty classes which may cause base " + "classes to be placed at different locations in a " + "future version of GCC", field); + + /* The middle end uses the type of expressions to determine the + possible range of expression values. In order to optimize + "x.i > 7" to "false" for a 2-bit bitfield "i", the middle end + must be made aware of the width of "i", via its type. + + Because C++ does not have integer types of arbitrary width, + we must (for the purposes of the front end) convert from the + type assigned here to the declared type of the bitfield + whenever a bitfield expression is used as an rvalue. + Similarly, when assigning a value to a bitfield, the value + must be converted to the type given the bitfield here. */ + if (DECL_C_BIT_FIELD (field)) + { + unsigned HOST_WIDE_INT width; + tree ftype = TREE_TYPE (field); + width = tree_low_cst (DECL_SIZE (field), /*unsignedp=*/1); + if (width != TYPE_PRECISION (ftype)) + { + TREE_TYPE (field) + = c_build_bitfield_integer_type (width, + TYPE_UNSIGNED (ftype)); + TREE_TYPE (field) + = cp_build_qualified_type (TREE_TYPE (field), + cp_type_quals (ftype)); + } + } + + /* If we needed additional padding after this field, add it + now. */ + if (padding) + { + tree padding_field; + + padding_field = build_decl (input_location, + FIELD_DECL, + NULL_TREE, + char_type_node); + DECL_BIT_FIELD (padding_field) = 1; + DECL_SIZE (padding_field) = padding; + DECL_CONTEXT (padding_field) = t; + DECL_ARTIFICIAL (padding_field) = 1; + DECL_IGNORED_P (padding_field) = 1; + layout_nonempty_base_or_field (rli, padding_field, + NULL_TREE, + empty_base_offsets); + } + + last_field_was_bitfield = DECL_C_BIT_FIELD (field); + } + + if (abi_version_at_least (2) && !integer_zerop (rli->bitpos)) + { + /* Make sure that we are on a byte boundary so that the size of + the class without virtual bases will always be a round number + of bytes. */ + rli->bitpos = round_up_loc (input_location, rli->bitpos, BITS_PER_UNIT); + normalize_rli (rli); + } + + /* G++ 3.2 does not allow virtual bases to be overlaid with tail + padding. */ + if (!abi_version_at_least (2)) + include_empty_classes(rli); + + /* Delete all zero-width bit-fields from the list of fields. Now + that the type is laid out they are no longer important. */ + remove_zero_width_bit_fields (t); + + /* Create the version of T used for virtual bases. We do not use + make_class_type for this version; this is an artificial type. For + a POD type, we just reuse T. */ + if (CLASSTYPE_NON_LAYOUT_POD_P (t) || CLASSTYPE_EMPTY_P (t)) + { + base_t = make_node (TREE_CODE (t)); + + /* Set the size and alignment for the new type. In G++ 3.2, all + empty classes were considered to have size zero when used as + base classes. */ + if (!abi_version_at_least (2) && CLASSTYPE_EMPTY_P (t)) + { + TYPE_SIZE (base_t) = bitsize_zero_node; + TYPE_SIZE_UNIT (base_t) = size_zero_node; + if (warn_abi && !integer_zerop (rli_size_unit_so_far (rli))) + warning (OPT_Wabi, + "layout of classes derived from empty class %qT " + "may change in a future version of GCC", + t); + } + else + { + tree eoc; + + /* If the ABI version is not at least two, and the last + field was a bit-field, RLI may not be on a byte + boundary. In particular, rli_size_unit_so_far might + indicate the last complete byte, while rli_size_so_far + indicates the total number of bits used. Therefore, + rli_size_so_far, rather than rli_size_unit_so_far, is + used to compute TYPE_SIZE_UNIT. */ + eoc = end_of_class (t, /*include_virtuals_p=*/0); + TYPE_SIZE_UNIT (base_t) + = size_binop (MAX_EXPR, + convert (sizetype, + size_binop (CEIL_DIV_EXPR, + rli_size_so_far (rli), + bitsize_int (BITS_PER_UNIT))), + eoc); + TYPE_SIZE (base_t) + = size_binop (MAX_EXPR, + rli_size_so_far (rli), + size_binop (MULT_EXPR, + convert (bitsizetype, eoc), + bitsize_int (BITS_PER_UNIT))); + } + TYPE_ALIGN (base_t) = rli->record_align; + TYPE_USER_ALIGN (base_t) = TYPE_USER_ALIGN (t); + + /* Copy the fields from T. */ + next_field = &TYPE_FIELDS (base_t); + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL) + { + *next_field = build_decl (input_location, + FIELD_DECL, + DECL_NAME (field), + TREE_TYPE (field)); + DECL_CONTEXT (*next_field) = base_t; + 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 = &DECL_CHAIN (*next_field); + } + + /* Record the base version of the type. */ + CLASSTYPE_AS_BASE (t) = base_t; + TYPE_CONTEXT (base_t) = t; + } + else + CLASSTYPE_AS_BASE (t) = t; + + /* Every empty class contains an empty class. */ + if (CLASSTYPE_EMPTY_P (t)) + CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) = 1; + + /* Set the TYPE_DECL for this type to contain the right + value for DECL_OFFSET, so that we can use it as part + of a COMPONENT_REF for multiple inheritance. */ + layout_decl (TYPE_MAIN_DECL (t), 0); + + /* Now fix up any virtual base class types that we left lying + around. We must get these done before we try to lay out the + virtual function table. As a side-effect, this will remove the + base subobject fields. */ + layout_virtual_bases (rli, empty_base_offsets); + + /* Make sure that empty classes are reflected in RLI at this + point. */ + include_empty_classes(rli); + + /* Make sure not to create any structures with zero size. */ + if (integer_zerop (rli_size_unit_so_far (rli)) && CLASSTYPE_EMPTY_P (t)) + place_field (rli, + build_decl (input_location, + FIELD_DECL, NULL_TREE, char_type_node)); + + /* If this is a non-POD, declaring it packed makes a difference to how it + can be used as a field; don't let finalize_record_size undo it. */ + if (TYPE_PACKED (t) && !layout_pod_type_p (t)) + rli->packed_maybe_necessary = true; + + /* Let the back end lay out the type. */ + finish_record_layout (rli, /*free_p=*/true); + + /* Warn about bases that can't be talked about due to ambiguity. */ + warn_about_ambiguous_bases (t); + + /* Now that we're done with layout, give the base fields the real types. */ + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + if (DECL_ARTIFICIAL (field) && IS_FAKE_BASE_TYPE (TREE_TYPE (field))) + TREE_TYPE (field) = TYPE_CONTEXT (TREE_TYPE (field)); + + /* Clean up. */ + splay_tree_delete (empty_base_offsets); + + if (CLASSTYPE_EMPTY_P (t) + && tree_int_cst_lt (sizeof_biggest_empty_class, + TYPE_SIZE_UNIT (t))) + sizeof_biggest_empty_class = TYPE_SIZE_UNIT (t); +} + +/* Determine the "key method" for the class type indicated by TYPE, + and set CLASSTYPE_KEY_METHOD accordingly. */ + +void +determine_key_method (tree type) +{ + tree method; + + if (TYPE_FOR_JAVA (type) + || processing_template_decl + || CLASSTYPE_TEMPLATE_INSTANTIATION (type) + || CLASSTYPE_INTERFACE_KNOWN (type)) + return; + + /* The key method is the first non-pure virtual function that is not + inline at the point of class definition. On some targets the + key function may not be inline; those targets should not call + this function until the end of the translation unit. */ + for (method = TYPE_METHODS (type); method != NULL_TREE; + method = DECL_CHAIN (method)) + if (DECL_VINDEX (method) != NULL_TREE + && ! DECL_DECLARED_INLINE_P (method) + && ! DECL_PURE_VIRTUAL_P (method)) + { + CLASSTYPE_KEY_METHOD (type) = method; + break; + } + + return; +} + +/* Perform processing required when the definition of T (a class type) + is complete. */ + +void +finish_struct_1 (tree t) +{ + tree x; + /* A TREE_LIST. The TREE_VALUE of each node is a FUNCTION_DECL. */ + tree virtuals = NULL_TREE; + int n_fields = 0; + + if (COMPLETE_TYPE_P (t)) + { + gcc_assert (MAYBE_CLASS_TYPE_P (t)); + error ("redefinition of %q#T", t); + popclass (); + return; + } + + /* If this type was previously laid out as a forward reference, + make sure we lay it out again. */ + TYPE_SIZE (t) = NULL_TREE; + CLASSTYPE_PRIMARY_BINFO (t) = NULL_TREE; + + /* Make assumptions about the class; we'll reset the flags if + necessary. */ + CLASSTYPE_EMPTY_P (t) = 1; + CLASSTYPE_NEARLY_EMPTY_P (t) = 1; + CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) = 0; + CLASSTYPE_LITERAL_P (t) = true; + + /* Do end-of-class semantic processing: checking the validity of the + bases and members and add implicitly generated methods. */ + check_bases_and_members (t); + + /* Find the key method. */ + if (TYPE_CONTAINS_VPTR_P (t)) + { + /* The Itanium C++ ABI permits the key method to be chosen when + the class is defined -- even though the key method so + selected may later turn out to be an inline function. On + some systems (such as ARM Symbian OS) the key method cannot + be determined until the end of the translation unit. On such + systems, we leave CLASSTYPE_KEY_METHOD set to NULL, which + will cause the class to be added to KEYED_CLASSES. Then, in + finish_file we will determine the key method. */ + if (targetm.cxx.key_method_may_be_inline ()) + determine_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)); + + virtuals = modify_all_vtables (t, nreverse (virtuals)); + + /* If necessary, create the primary vtable for this class. */ + if (virtuals || TYPE_CONTAINS_VPTR_P (t)) + { + /* 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); + } + + if (TYPE_CONTAINS_VPTR_P (t)) + { + int vindex; + tree fn; + + if (BINFO_VTABLE (TYPE_BINFO (t))) + gcc_assert (DECL_VIRTUAL_P (BINFO_VTABLE (TYPE_BINFO (t)))); + if (!CLASSTYPE_HAS_PRIMARY_BASE_P (t)) + gcc_assert (BINFO_VIRTUALS (TYPE_BINFO (t)) == NULL_TREE); + + /* Add entries for virtual functions introduced by this class. */ + BINFO_VIRTUALS (TYPE_BINFO (t)) + = chainon (BINFO_VIRTUALS (TYPE_BINFO (t)), virtuals); + + /* Set DECL_VINDEX for all functions declared in this class. */ + for (vindex = 0, fn = BINFO_VIRTUALS (TYPE_BINFO (t)); + fn; + 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_int_cst (NULL_TREE, vindex); + } + } + + finish_struct_bits (t); + + /* Complete the rtl for any static member objects of the type we're + working on. */ + for (x = TYPE_FIELDS (t); x; x = DECL_CHAIN (x)) + if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x) + && TREE_TYPE (x) != error_mark_node + && same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (x)), t)) + DECL_MODE (x) = TYPE_MODE (t); + + /* Done with FIELDS...now decide whether to sort these for + faster lookups later. + + We use a small number because most searches fail (succeeding + ultimately as the search bores through the inheritance + hierarchy), and we want this failure to occur quickly. */ + + n_fields = count_fields (TYPE_FIELDS (t)); + if (n_fields > 7) + { + struct sorted_fields_type *field_vec = ggc_alloc_sorted_fields_type + (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); + CLASSTYPE_SORTED_FIELDS (t) = field_vec; + } + + /* Complain if one of the field types requires lower visibility. */ + constrain_class_visibility (t); + + /* Make the rtl for any new vtables we have created, and unmark + the base types we marked. */ + finish_vtbls (t); + + /* Build the VTT for T. */ + build_vtt (t); + + /* This warning does not make sense for Java classes, since they + cannot have destructors. */ + if (!TYPE_FOR_JAVA (t) && warn_nonvdtor && TYPE_POLYMORPHIC_P (t)) + { + tree dtor; + + dtor = CLASSTYPE_DESTRUCTORS (t); + if (/* An implicitly declared destructor is always public. And, + if it were virtual, we would have created it by now. */ + !dtor + || (!DECL_VINDEX (dtor) + && (/* public non-virtual */ + (!TREE_PRIVATE (dtor) && !TREE_PROTECTED (dtor)) + || (/* non-public non-virtual with friends */ + (TREE_PRIVATE (dtor) || TREE_PROTECTED (dtor)) + && (CLASSTYPE_FRIEND_CLASSES (t) + || DECL_FRIENDLIST (TYPE_MAIN_DECL (t))))))) + warning (OPT_Wnon_virtual_dtor, + "%q#T has virtual functions and accessible" + " non-virtual destructor", t); + } + + complete_vars (t); + + if (warn_overloaded_virtual) + warn_hidden (t); + + /* Class layout, assignment of virtual table slots, etc., is now + complete. Give the back end a chance to tweak the visibility of + the class or perform any other required target modifications. */ + targetm.cxx.adjust_class_at_definition (t); + + maybe_suppress_debug_info (t); + + dump_class_hierarchy (t); + + /* Finish debugging output for this type. */ + rest_of_type_compilation (t, ! LOCAL_CLASS_P (t)); + + if (TYPE_TRANSPARENT_AGGR (t)) + { + tree field = first_field (t); + if (field == NULL_TREE || error_operand_p (field)) + { + error ("type transparent class %qT does not have any fields", t); + TYPE_TRANSPARENT_AGGR (t) = 0; + } + else if (DECL_ARTIFICIAL (field)) + { + if (DECL_FIELD_IS_BASE (field)) + error ("type transparent class %qT has base classes", t); + else + { + gcc_checking_assert (DECL_VIRTUAL_P (field)); + error ("type transparent class %qT has virtual functions", t); + } + TYPE_TRANSPARENT_AGGR (t) = 0; + } + } +} + +/* When T was built up, the member declarations were added in reverse + order. Rearrange them to declaration order. */ + +void +unreverse_member_declarations (tree t) +{ + tree next; + tree prev; + tree x; + + /* The following lists are all in reverse order. Put them in + declaration order now. */ + TYPE_METHODS (t) = nreverse (TYPE_METHODS (t)); + CLASSTYPE_DECL_LIST (t) = nreverse (CLASSTYPE_DECL_LIST (t)); + + /* Actually, for the TYPE_FIELDS, only the non TYPE_DECLs are in + reverse order, so we can't just use nreverse. */ + prev = NULL_TREE; + for (x = TYPE_FIELDS (t); + x && TREE_CODE (x) != TYPE_DECL; + x = next) + { + next = DECL_CHAIN (x); + DECL_CHAIN (x) = prev; + prev = x; + } + if (prev) + { + DECL_CHAIN (TYPE_FIELDS (t)) = x; + if (prev) + TYPE_FIELDS (t) = prev; + } +} + +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. */ + unreverse_member_declarations (t); + + cplus_decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); + + /* 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) + { + tree x; + + finish_struct_methods (t); + TYPE_SIZE (t) = bitsize_zero_node; + TYPE_SIZE_UNIT (t) = size_zero_node; + + /* We need to emit an error message if this type was used as a parameter + and it is an abstract type, even if it is a template. We construct + a simple CLASSTYPE_PURE_VIRTUALS list without taking bases into + account and we call complete_vars with this type, which will check + the PARM_DECLS. Note that while the type is being defined, + CLASSTYPE_PURE_VIRTUALS contains the list of the inline friends + (see CLASSTYPE_INLINE_FRIENDS) so we need to clear it. */ + CLASSTYPE_PURE_VIRTUALS (t) = NULL; + for (x = TYPE_METHODS (t); x; x = DECL_CHAIN (x)) + if (DECL_PURE_VIRTUAL_P (x)) + VEC_safe_push (tree, gc, CLASSTYPE_PURE_VIRTUALS (t), x); + complete_vars (t); + + /* Remember current #pragma pack value. */ + TYPE_PRECISION (t) = maximum_field_alignment; + } + else + finish_struct_1 (t); + + input_location = saved_loc; + + TYPE_BEING_DEFINED (t) = 0; + + if (current_class_type) + popclass (); + else + error ("trying to finish struct, but kicked out due to previous parse errors"); + + if (processing_template_decl && at_function_scope_p ()) + add_stmt (build_min (TAG_DEFN, t)); + + return t; +} + +/* Return the dynamic type of INSTANCE, if known. + Used to determine whether the virtual function table is needed + or not. + + *NONNULL is set iff INSTANCE can be known to be nonnull, regardless + of our knowledge of its type. *NONNULL should be initialized + before this function is called. */ + +static tree +fixed_type_or_null (tree instance, int *nonnull, int *cdtorp) +{ +#define RECUR(T) fixed_type_or_null((T), nonnull, cdtorp) + + switch (TREE_CODE (instance)) + { + case INDIRECT_REF: + if (POINTER_TYPE_P (TREE_TYPE (instance))) + return NULL_TREE; + else + return RECUR (TREE_OPERAND (instance, 0)); + + case CALL_EXPR: + /* This is a call to a constructor, hence it's never zero. */ + if (TREE_HAS_CONSTRUCTOR (instance)) + { + if (nonnull) + *nonnull = 1; + return TREE_TYPE (instance); + } + return NULL_TREE; + + case SAVE_EXPR: + /* This is a call to a constructor, hence it's never zero. */ + if (TREE_HAS_CONSTRUCTOR (instance)) + { + if (nonnull) + *nonnull = 1; + return TREE_TYPE (instance); + } + return RECUR (TREE_OPERAND (instance, 0)); + + case POINTER_PLUS_EXPR: + case PLUS_EXPR: + case MINUS_EXPR: + if (TREE_CODE (TREE_OPERAND (instance, 0)) == ADDR_EXPR) + return RECUR (TREE_OPERAND (instance, 0)); + if (TREE_CODE (TREE_OPERAND (instance, 1)) == INTEGER_CST) + /* Propagate nonnull. */ + return RECUR (TREE_OPERAND (instance, 0)); + + return NULL_TREE; + + CASE_CONVERT: + return RECUR (TREE_OPERAND (instance, 0)); + + case ADDR_EXPR: + instance = TREE_OPERAND (instance, 0); + if (nonnull) + { + /* Just because we see an ADDR_EXPR doesn't mean we're dealing + with a real object -- given &p->f, p can still be null. */ + tree t = get_base_address (instance); + /* ??? Probably should check DECL_WEAK here. */ + if (t && DECL_P (t)) + *nonnull = 1; + } + return RECUR (instance); + + case COMPONENT_REF: + /* If this component is really a base class reference, then the field + itself isn't definitive. */ + if (DECL_FIELD_IS_BASE (TREE_OPERAND (instance, 1))) + return RECUR (TREE_OPERAND (instance, 0)); + return RECUR (TREE_OPERAND (instance, 1)); + + case VAR_DECL: + case FIELD_DECL: + if (TREE_CODE (TREE_TYPE (instance)) == ARRAY_TYPE + && MAYBE_CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (instance)))) + { + if (nonnull) + *nonnull = 1; + return TREE_TYPE (TREE_TYPE (instance)); + } + /* fall through... */ + case TARGET_EXPR: + case PARM_DECL: + case RESULT_DECL: + if (MAYBE_CLASS_TYPE_P (TREE_TYPE (instance))) + { + if (nonnull) + *nonnull = 1; + return TREE_TYPE (instance); + } + else if (instance == current_class_ptr) + { + if (nonnull) + *nonnull = 1; + + /* if we're in a ctor or dtor, we know our type. */ + if (DECL_LANG_SPECIFIC (current_function_decl) + && (DECL_CONSTRUCTOR_P (current_function_decl) + || DECL_DESTRUCTOR_P (current_function_decl))) + { + if (cdtorp) + *cdtorp = 1; + return TREE_TYPE (TREE_TYPE (instance)); + } + } + else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE) + { + /* We only need one hash table because it is always left empty. */ + static htab_t ht; + if (!ht) + ht = htab_create (37, + htab_hash_pointer, + htab_eq_pointer, + /*htab_del=*/NULL); + + /* Reference variables should be references to objects. */ + if (nonnull) + *nonnull = 1; + + /* Enter the INSTANCE in a table to prevent recursion; a + variable's initializer may refer to the variable + itself. */ + if (TREE_CODE (instance) == VAR_DECL + && DECL_INITIAL (instance) + && !type_dependent_expression_p_push (DECL_INITIAL (instance)) + && !htab_find (ht, instance)) + { + tree type; + void **slot; + + slot = htab_find_slot (ht, instance, INSERT); + *slot = instance; + type = RECUR (DECL_INITIAL (instance)); + htab_remove_elt (ht, instance); + + return type; + } + } + return NULL_TREE; + + default: + return NULL_TREE; + } +#undef RECUR +} + +/* Return nonzero if the dynamic type of INSTANCE is known, and + equivalent to the static type. We also handle the case where + INSTANCE is really a pointer. Return negative if this is a + ctor/dtor. There the dynamic type is known, but this might not be + the most derived base of the original object, and hence virtual + bases may not be layed out according to this type. + + Used to determine whether the virtual function table is needed + or not. + + *NONNULL is set iff INSTANCE can be known to be nonnull, regardless + of our knowledge of its type. *NONNULL should be initialized + before this function is called. */ + +int +resolves_to_fixed_type_p (tree instance, int* nonnull) +{ + tree t = TREE_TYPE (instance); + int cdtorp = 0; + tree fixed; + + if (processing_template_decl) + { + /* In a template we only care about the type of the result. */ + if (nonnull) + *nonnull = true; + return true; + } + + fixed = fixed_type_or_null (instance, nonnull, &cdtorp); + if (fixed == NULL_TREE) + return 0; + if (POINTER_TYPE_P (t)) + t = TREE_TYPE (t); + if (!same_type_ignoring_top_level_qualifiers_p (t, fixed)) + return 0; + return cdtorp ? -1 : 1; +} + + +void +init_class_processing (void) +{ + current_class_depth = 0; + current_class_stack_size = 10; + current_class_stack + = XNEWVEC (struct class_stack_node, current_class_stack_size); + local_classes = VEC_alloc (tree, gc, 8); + sizeof_biggest_empty_class = size_zero_node; + + ridpointers[(int) RID_PUBLIC] = access_public_node; + ridpointers[(int) RID_PRIVATE] = access_private_node; + ridpointers[(int) RID_PROTECTED] = access_protected_node; +} + +/* Restore the cached PREVIOUS_CLASS_LEVEL. */ + +static void +restore_class_cache (void) +{ + tree type; + + /* 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. */ + push_binding_level (previous_class_level); + class_binding_level = previous_class_level; + /* Restore IDENTIFIER_TYPE_VALUE. */ + for (type = class_binding_level->type_shadowed; + type; + type = TREE_CHAIN (type)) + SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (type), TREE_TYPE (type)); +} + +/* 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. + + For multiple inheritance, we perform a two-pass depth-first search + of the type lattice. */ + +void +pushclass (tree type) +{ + class_stack_node_t csn; + + type = TYPE_MAIN_VARIANT (type); + + /* Make sure there is enough room for the new entry on the stack. */ + if (current_class_depth + 1 >= current_class_stack_size) + { + current_class_stack_size *= 2; + current_class_stack + = XRESIZEVEC (struct class_stack_node, current_class_stack, + current_class_stack_size); + } + + /* Insert a new entry on the class stack. */ + csn = current_class_stack + current_class_depth; + csn->name = current_class_name; + csn->type = current_class_type; + csn->access = current_access_specifier; + csn->names_used = 0; + csn->hidden = 0; + current_class_depth++; + + /* Now set up the new type. */ + current_class_name = TYPE_NAME (type); + if (TREE_CODE (current_class_name) == TYPE_DECL) + current_class_name = DECL_NAME (current_class_name); + current_class_type = type; + + /* By default, things in classes are private, while things in + structures or unions are public. */ + current_access_specifier = (CLASSTYPE_DECLARED_CLASS (type) + ? access_private_node + : access_public_node); + + if (previous_class_level + && type != previous_class_level->this_entity + && current_class_depth == 1) + { + /* Forcibly remove any old class remnants. */ + invalidate_class_lookup_cache (); + } + + if (!previous_class_level + || type != previous_class_level->this_entity + || current_class_depth > 1) + pushlevel_class (); + else + restore_class_cache (); +} + +/* When we exit a toplevel class scope, we save its binding level so + that we can restore it quickly. Here, we've entered some other + class, so we must invalidate our cache. */ + +void +invalidate_class_lookup_cache (void) +{ + previous_class_level = NULL; +} + +/* Get out of the current class scope. If we were in a class scope + previously, that is the one popped to. */ + +void +popclass (void) +{ + poplevel_class (); + + current_class_depth--; + current_class_name = current_class_stack[current_class_depth].name; + current_class_type = current_class_stack[current_class_depth].type; + current_access_specifier = current_class_stack[current_class_depth].access; + if (current_class_stack[current_class_depth].names_used) + splay_tree_delete (current_class_stack[current_class_depth].names_used); +} + +/* Mark the top of the class stack as hidden. */ + +void +push_class_stack (void) +{ + if (current_class_depth) + ++current_class_stack[current_class_depth - 1].hidden; +} + +/* Mark the top of the class stack as un-hidden. */ + +void +pop_class_stack (void) +{ + if (current_class_depth) + --current_class_stack[current_class_depth - 1].hidden; +} + +/* Returns 1 if the class type currently being defined is either T or + a nested type of T. */ + +bool +currently_open_class (tree t) +{ + int i; + + if (!CLASS_TYPE_P (t)) + return false; + + t = TYPE_MAIN_VARIANT (t); + + /* We start looking from 1 because entry 0 is from global scope, + and has no type. */ + for (i = current_class_depth; i > 0; --i) + { + tree c; + if (i == current_class_depth) + c = current_class_type; + else + { + if (current_class_stack[i].hidden) + break; + c = current_class_stack[i].type; + } + if (!c) + continue; + if (same_type_p (c, t)) + return true; + } + return false; +} + +/* If either current_class_type or one of its enclosing classes are derived + from T, return the appropriate type. Used to determine how we found + 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; + + for (i = current_class_depth - 1; i > 0; --i) + { + if (current_class_stack[i].hidden) + break; + if (DERIVED_FROM_P (t, current_class_stack[i].type)) + return current_class_stack[i].type; + } + + return NULL_TREE; +} + +/* Returns the innermost class type which is not a lambda closure type. */ + +tree +current_nonlambda_class_type (void) +{ + int i; + + /* We start looking from 1 because entry 0 is from global scope, + and has no type. */ + for (i = current_class_depth; i > 0; --i) + { + tree c; + if (i == current_class_depth) + c = current_class_type; + else + { + if (current_class_stack[i].hidden) + break; + c = current_class_stack[i].type; + } + if (!c) + continue; + if (!LAMBDA_TYPE_P (c)) + return c; + } + return NULL_TREE; +} + +/* 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) +{ + /* A namespace might be passed in error cases, like A::B:C. */ + if (type == NULL_TREE + || !CLASS_TYPE_P (type)) + return; + + push_nested_class (DECL_CONTEXT (TYPE_MAIN_DECL (type))); + + pushclass (type); +} + +/* Undoes a push_nested_class call. */ + +void +pop_nested_class (void) +{ + tree context = DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type)); + + popclass (); + if (context && CLASS_TYPE_P (context)) + pop_nested_class (); +} + +/* Returns the number of extern "LANG" blocks we are nested within. */ + +int +current_lang_depth (void) +{ + return VEC_length (tree, current_lang_base); +} + +/* Set global variables CURRENT_LANG_NAME to appropriate value + so that behavior of name-mangling machinery is correct. */ + +void +push_lang_context (tree name) +{ + VEC_safe_push (tree, gc, current_lang_base, current_lang_name); + + if (name == lang_name_cplusplus) + { + current_lang_name = name; + } + else if (name == lang_name_java) + { + current_lang_name = name; + /* DECL_IGNORED_P is initially set for these types, to avoid clutter. + (See record_builtin_java_type in decl.c.) However, that causes + incorrect debug entries if these types are actually used. + So we re-enable debug output after extern "Java". */ + DECL_IGNORED_P (TYPE_NAME (java_byte_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_short_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_int_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_long_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_float_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_double_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_char_type_node)) = 0; + DECL_IGNORED_P (TYPE_NAME (java_boolean_type_node)) = 0; + } + else if (name == lang_name_c) + { + current_lang_name = name; + } + else + error ("language string %<\"%E\"%> not recognized", name); +} + +/* Get out of the current language scope. */ + +void +pop_lang_context (void) +{ + current_lang_name = VEC_pop (tree, current_lang_base); +} + +/* Type instantiation routines. */ + +/* 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 & 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. + + If OVERLOAD is for one or more member functions, then ACCESS_PATH + is the base path used to reference those member functions. If + TF_NO_ACCESS_CONTROL is not set in FLAGS, and the address is + resolved to a member function, access checks will be performed and + errors issued if appropriate. */ + +static tree +resolve_address_of_overloaded_function (tree target_type, + tree overload, + tsubst_flags_t flags, + bool template_only, + tree explicit_targs, + tree access_path) +{ + /* Here's what the standard says: + + [over.over] + + If the name is a function template, template argument deduction + is done, and if the argument deduction succeeds, the deduced + arguments are used to generate a single template function, which + is added to the set of overloaded functions considered. + + Non-member functions and static member functions match targets of + type "pointer-to-function" or "reference-to-function." Nonstatic + member functions match targets of type "pointer-to-member + function;" the function type of the pointer to member is used to + select the member function from the set of overloaded member + functions. If a nonstatic member function is selected, the + reference to the overloaded function name is required to have the + form of a pointer to member as described in 5.3.1. + + If more than one function is selected, any template functions in + the set are eliminated if the set also contains a non-template + function, and any given template function is eliminated if the + set contains a second template function that is more specialized + than the first according to the partial ordering rules 14.5.5.2. + After such eliminations, if any, there shall remain exactly one + selected function. */ + + int is_ptrmem = 0; + /* We store the matches in a TREE_LIST rooted here. The functions + are the TREE_PURPOSE, not the TREE_VALUE, in this list, for easy + interoperability with most_specialized_instantiation. */ + tree matches = NULL_TREE; + tree fn; + tree target_fn_type; + + /* By the time we get here, we should be seeing only real + pointer-to-member types, not the internal POINTER_TYPE to + METHOD_TYPE representation. */ + gcc_assert (TREE_CODE (target_type) != POINTER_TYPE + || TREE_CODE (TREE_TYPE (target_type)) != METHOD_TYPE); + + gcc_assert (is_overloaded_fn (overload)); + + /* Check that the TARGET_TYPE is reasonable. */ + if (TYPE_PTRFN_P (target_type)) + /* This is OK. */; + else if (TYPE_PTRMEMFUNC_P (target_type)) + /* This is OK, too. */ + is_ptrmem = 1; + else if (TREE_CODE (target_type) == FUNCTION_TYPE) + /* This is OK, too. This comes from a conversion to reference + type. */ + target_type = build_reference_type (target_type); + else + { + if (flags & tf_error) + error ("cannot resolve overloaded function %qD based on" + " conversion to type %qT", + DECL_NAME (OVL_FUNCTION (overload)), target_type); + return error_mark_node; + } + + /* Non-member functions and static member functions match targets of type + "pointer-to-function" or "reference-to-function." Nonstatic member + functions match targets of type "pointer-to-member-function;" the + function type of the pointer to member is used to select the member + function from the set of overloaded member functions. + + So figure out the FUNCTION_TYPE that we want to match against. */ + target_fn_type = static_fn_type (target_type); + + /* If we can find a non-template function that matches, we can just + use it. There's no point in generating template instantiations + if we're just going to throw them out anyhow. But, of course, we + can only do this when we don't *need* a template function. */ + if (!template_only) + { + tree fns; + + for (fns = overload; fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + + if (TREE_CODE (fn) == TEMPLATE_DECL) + /* We're not looking for templates just yet. */ + continue; + + if ((TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) + != is_ptrmem) + /* We're looking for a non-static member, and this isn't + one, or vice versa. */ + continue; + + /* Ignore functions which haven't been explicitly + declared. */ + if (DECL_ANTICIPATED (fn)) + continue; + + /* See if there's a match. */ + if (same_type_p (target_fn_type, static_fn_type (fn))) + matches = tree_cons (fn, NULL_TREE, matches); + } + } + + /* Now, if we've already got a match (or matches), there's no need + to proceed to the template functions. But, if we don't have a + match we need to look at them, too. */ + if (!matches) + { + tree target_arg_types; + tree target_ret_type; + tree fns; + tree *args; + unsigned int nargs, ia; + tree arg; + + target_arg_types = TYPE_ARG_TYPES (target_fn_type); + target_ret_type = TREE_TYPE (target_fn_type); + + nargs = list_length (target_arg_types); + args = XALLOCAVEC (tree, nargs); + for (arg = target_arg_types, ia = 0; + arg != NULL_TREE && arg != void_list_node; + arg = TREE_CHAIN (arg), ++ia) + args[ia] = TREE_VALUE (arg); + nargs = ia; + + for (fns = overload; fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + tree instantiation; + tree targs; + + if (TREE_CODE (fn) != TEMPLATE_DECL) + /* We're only looking for templates. */ + continue; + + if ((TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) + != is_ptrmem) + /* We're not looking for a non-static member, and this is + one, or vice versa. */ + continue; + + /* Try to do argument deduction. */ + targs = make_tree_vec (DECL_NTPARMS (fn)); + if (fn_type_unification (fn, explicit_targs, targs, args, nargs, + target_ret_type, DEDUCE_EXACT, + LOOKUP_NORMAL)) + /* Argument deduction failed. */ + continue; + + /* Instantiate the template. */ + instantiation = instantiate_template (fn, targs, flags); + if (instantiation == error_mark_node) + /* Instantiation failed. */ + continue; + + /* See if there's a match. */ + if (same_type_p (target_fn_type, static_fn_type (instantiation))) + matches = tree_cons (instantiation, fn, matches); + } + + /* Now, remove all but the most specialized of the matches. */ + if (matches) + { + tree match = most_specialized_instantiation (matches); + + if (match != error_mark_node) + matches = tree_cons (TREE_PURPOSE (match), + NULL_TREE, + NULL_TREE); + } + } + + /* Now we should have exactly one function in MATCHES. */ + if (matches == NULL_TREE) + { + /* There were *no* matches. */ + if (flags & tf_error) + { + error ("no matches converting function %qD to type %q#T", + DECL_NAME (OVL_CURRENT (overload)), + target_type); + + /* print_candidates expects a chain with the functions in + TREE_VALUE slots, so we cons one up here (we're losing anyway, + so why be clever?). */ + for (; overload; overload = OVL_NEXT (overload)) + matches = tree_cons (NULL_TREE, OVL_CURRENT (overload), + matches); + + print_candidates (matches); + } + return error_mark_node; + } + else if (TREE_CHAIN (matches)) + { + /* There were too many matches. First check if they're all + the same function. */ + tree match; + + fn = TREE_PURPOSE (matches); + for (match = TREE_CHAIN (matches); match; match = TREE_CHAIN (match)) + if (!decls_match (fn, TREE_PURPOSE (match))) + break; + + if (match) + { + if (flags & tf_error) + { + error ("converting overloaded function %qD to type %q#T is ambiguous", + DECL_NAME (OVL_FUNCTION (overload)), + target_type); + + /* Since print_candidates expects the functions in the + TREE_VALUE slot, we flip them here. */ + for (match = matches; match; match = TREE_CHAIN (match)) + TREE_VALUE (match) = TREE_PURPOSE (match); + + print_candidates (matches); + } + + return error_mark_node; + } + } + + /* Good, exactly one match. Now, convert it to the correct type. */ + fn = TREE_PURPOSE (matches); + + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) + && !(flags & tf_ptrmem_ok) && !flag_ms_extensions) + { + static int explained; + + if (!(flags & tf_error)) + return error_mark_node; + + permerror (input_location, "assuming pointer to member %qD", fn); + if (!explained) + { + inform (input_location, "(a pointer to member can only be formed with %<&%E%>)", fn); + explained = 1; + } + } + + /* If we're doing overload resolution purely for the purpose of + determining conversion sequences, we should not consider the + function used. If this conversion sequence is selected, the + function will be marked as used at this point. */ + if (!(flags & tf_conv)) + { + /* Make =delete work with SFINAE. */ + if (DECL_DELETED_FN (fn) && !(flags & tf_error)) + return error_mark_node; + + mark_used (fn); + } + + /* We could not check access to member functions when this + expression was originally created since we did not know at that + time to which function the expression referred. */ + if (!(flags & tf_no_access_control) + && DECL_FUNCTION_MEMBER_P (fn)) + { + gcc_assert (access_path); + perform_or_defer_access_check (access_path, fn, fn); + } + + if (TYPE_PTRFN_P (target_type) || TYPE_PTRMEMFUNC_P (target_type)) + return cp_build_addr_expr (fn, flags); + else + { + /* The target must be a REFERENCE_TYPE. Above, cp_build_unary_op + will mark the function as addressed, but here we must do it + explicitly. */ + cxx_mark_addressable (fn); + + return fn; + } +} + +/* 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. + + For non-recursive calls, LHSTYPE should be a function, pointer to + function, or a pointer to member function. */ + +tree +instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags) +{ + tsubst_flags_t flags_in = flags; + tree access_path = NULL_TREE; + + flags &= ~tf_ptrmem_ok; + + if (lhstype == unknown_type_node) + { + 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 %qT does not match %qT", + TREE_TYPE (rhs), lhstype); + return error_mark_node; + } + } + + if (TREE_CODE (rhs) == BASELINK) + { + access_path = BASELINK_ACCESS_BINFO (rhs); + rhs = BASELINK_FUNCTIONS (rhs); + } + + /* If we are in a template, and have a NON_DEPENDENT_EXPR, we cannot + deduce any type information. */ + if (TREE_CODE (rhs) == NON_DEPENDENT_EXPR) + { + if (flags & tf_error) + error ("not enough type information"); + return error_mark_node; + } + + /* There only a few kinds of expressions that may have a type + dependent on overload resolution. */ + gcc_assert (TREE_CODE (rhs) == ADDR_EXPR + || TREE_CODE (rhs) == COMPONENT_REF + || really_overloaded_fn (rhs) + || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL)); + + /* This should really only be used when attempting to distinguish + what sort of a pointer to function we have. For now, any + arithmetic operation which is not supported on pointers + is rejected as an error. */ + + switch (TREE_CODE (rhs)) + { + case COMPONENT_REF: + { + tree member = TREE_OPERAND (rhs, 1); + + member = instantiate_type (lhstype, member, flags); + if (member != error_mark_node + && TREE_SIDE_EFFECTS (TREE_OPERAND (rhs, 0))) + /* Do not lose object's side effects. */ + return build2 (COMPOUND_EXPR, TREE_TYPE (member), + TREE_OPERAND (rhs, 0), member); + return member; + } + + case OFFSET_REF: + rhs = TREE_OPERAND (rhs, 1); + if (BASELINK_P (rhs)) + return instantiate_type (lhstype, rhs, flags_in); + + /* This can happen if we are forming a pointer-to-member for a + member template. */ + gcc_assert (TREE_CODE (rhs) == TEMPLATE_ID_EXPR); + + /* Fall through. */ + + case TEMPLATE_ID_EXPR: + { + tree fns = TREE_OPERAND (rhs, 0); + tree args = TREE_OPERAND (rhs, 1); + + return + resolve_address_of_overloaded_function (lhstype, fns, flags_in, + /*template_only=*/true, + args, access_path); + } + + case OVERLOAD: + case FUNCTION_DECL: + return + resolve_address_of_overloaded_function (lhstype, rhs, flags_in, + /*template_only=*/false, + /*explicit_targs=*/NULL_TREE, + access_path); + + case ADDR_EXPR: + { + if (PTRMEM_OK_P (rhs)) + flags |= tf_ptrmem_ok; + + return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags); + } + + case ERROR_MARK: + return error_mark_node; + + default: + gcc_unreachable (); + } + return error_mark_node; +} + +/* Return the name of the virtual function pointer field + (as an IDENTIFIER_NODE) for the given TYPE. Note that + this may have to look back through base types to find the + ultimate field name. (For single inheritance, these could + all be the same name. Who knows for multiple inheritance). */ + +static tree +get_vfield_name (tree type) +{ + tree binfo, base_binfo; + char *buf; + + for (binfo = TYPE_BINFO (type); + BINFO_N_BASE_BINFOS (binfo); + binfo = base_binfo) + { + base_binfo = BINFO_BASE_BINFO (binfo, 0); + + if (BINFO_VIRTUAL_P (base_binfo) + || !TYPE_CONTAINS_VPTR_P (BINFO_TYPE (base_binfo))) + break; + } + + 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 (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", + n_vtables, n_vtable_searches); + fprintf (stderr, "vtable entries = %d; vtable elems = %d\n", + n_vtable_entries, n_vtable_elems); + } +#endif +} + +/* Build a dummy reference to ourselves so Derived::Base (and A::A) works, + according to [class]: + The class-name is also inserted + into the scope of the class itself. For purposes of access checking, + 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); + tree saved_cas; + + DECL_NONLOCAL (value) = 1; + DECL_CONTEXT (value) = current_class_type; + DECL_ARTIFICIAL (value) = 1; + SET_DECL_SELF_REFERENCE_P (value); + set_underlying_type (value); + + if (processing_template_decl) + value = push_template_decl (value); + + saved_cas = current_access_specifier; + current_access_specifier = access_public_node; + finish_member_declaration (value); + current_access_specifier = saved_cas; +} + +/* Returns 1 if TYPE contains only padding bytes. */ + +int +is_empty_class (tree type) +{ + if (type == error_mark_node) + return 0; + + if (! CLASS_TYPE_P (type)) + return 0; + + /* In G++ 3.2, whether or not a class was empty was determined by + looking at its size. */ + if (abi_version_at_least (2)) + return CLASSTYPE_EMPTY_P (type); + else + return integer_zerop (CLASSTYPE_SIZE (type)); +} + +/* Returns true if TYPE contains an empty class. */ + +static bool +contains_empty_class_p (tree type) +{ + if (is_empty_class (type)) + return true; + if (CLASS_TYPE_P (type)) + { + tree field; + tree binfo; + tree base_binfo; + int i; + + for (binfo = TYPE_BINFO (type), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + if (contains_empty_class_p (BINFO_TYPE (base_binfo))) + return true; + for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL + && !DECL_ARTIFICIAL (field) + && is_empty_class (TREE_TYPE (field))) + return true; + } + else if (TREE_CODE (type) == ARRAY_TYPE) + return contains_empty_class_p (TREE_TYPE (type)); + return false; +} + +/* Returns true if TYPE contains no actual data, just various + possible combinations of empty classes and possibly a vptr. */ + +bool +is_really_empty_class (tree type) +{ + if (CLASS_TYPE_P (type)) + { + tree field; + tree binfo; + tree base_binfo; + int i; + + /* CLASSTYPE_EMPTY_P isn't set properly until the class is actually laid + out, but we'd like to be able to check this before then. */ + if (COMPLETE_TYPE_P (type) && is_empty_class (type)) + return true; + + for (binfo = TYPE_BINFO (type), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + if (!is_really_empty_class (BINFO_TYPE (base_binfo))) + return false; + for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL + && !DECL_ARTIFICIAL (field) + && !is_really_empty_class (TREE_TYPE (field))) + return false; + return true; + } + else if (TREE_CODE (type) == ARRAY_TYPE) + return is_really_empty_class (TREE_TYPE (type)); + return false; +} + +/* 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 + && TYPE_BEING_DEFINED (current_class_type) + && !LAMBDA_TYPE_P (current_class_type))) + return; + + /* If there's already a binding for this NAME, then we don't have + anything to worry about. */ + if (lookup_member (current_class_type, name, + /*protect=*/0, /*want_type=*/false)) + return; + + if (!current_class_stack[current_class_depth - 1].names_used) + current_class_stack[current_class_depth - 1].names_used + = splay_tree_new (splay_tree_compare_pointers, 0, 0); + names_used = current_class_stack[current_class_depth - 1].names_used; + + splay_tree_insert (names_used, + (splay_tree_key) name, + (splay_tree_value) decl); +} + +/* Note that NAME was declared (as DECL) in the current class. Check + 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; + + /* Look to see if we ever used this name. */ + names_used + = current_class_stack[current_class_depth - 1].names_used; + if (!names_used) + return; + /* The C language allows members to be declared with a type of the same + name, and the C++ standard says this diagnostic is not required. So + allow it in extern "C" blocks unless predantic is specified. + Allow it in all cases if -ms-extensions is specified. */ + if ((!pedantic && current_lang_name == lang_name_c) + || flag_ms_extensions) + return; + n = splay_tree_lookup (names_used, (splay_tree_key) name); + if (n) + { + /* [basic.scope.class] + + A name N used in a class S shall refer to the same declaration + in its context and when re-evaluated in the completed scope of + S. */ + permerror (input_location, "declaration of %q#D", decl); + permerror (input_location, "changes meaning of %qD from %q+#D", + DECL_NAME (OVL_CURRENT (decl)), (tree) n->value); + } +} + +/* Returns the VAR_DECL for the complete vtable associated with BINFO. + Secondary vtables are merged with primary vtables; this function + will return the VAR_DECL for the primary vtable. */ + +tree +get_vtbl_decl_for_binfo (tree binfo) +{ + tree decl; + + decl = BINFO_VTABLE (binfo); + if (decl && TREE_CODE (decl) == POINTER_PLUS_EXPR) + { + gcc_assert (TREE_CODE (TREE_OPERAND (decl, 0)) == ADDR_EXPR); + decl = TREE_OPERAND (TREE_OPERAND (decl, 0), 0); + } + if (decl) + gcc_assert (TREE_CODE (decl) == VAR_DECL); + 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. */ + +static tree +get_primary_binfo (tree binfo) +{ + tree primary_base; + + primary_base = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (binfo)); + if (!primary_base) + return NULL_TREE; + + return copied_binfo (primary_base, binfo); +} + +/* 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_binfo; + int i; + + indented = maybe_indent_hierarchy (stream, indent, 0); + fprintf (stream, "%s (0x" HOST_WIDE_INT_PRINT_HEX ") ", + type_as_string (BINFO_TYPE (binfo), TFF_PLAIN_IDENTIFIER), + (HOST_WIDE_INT) (uintptr_t) 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))) + fprintf (stream, " empty"); + else if (CLASSTYPE_NEARLY_EMPTY_P (BINFO_TYPE (binfo))) + fprintf (stream, " nearly-empty"); + if (BINFO_VIRTUAL_P (binfo)) + fprintf (stream, " virtual"); + fprintf (stream, "\n"); + + indented = 0; + if (BINFO_PRIMARY_P (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " primary-for %s (0x" HOST_WIDE_INT_PRINT_HEX ")", + type_as_string (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo)), + TFF_PLAIN_IDENTIFIER), + (HOST_WIDE_INT) (uintptr_t) BINFO_INHERITANCE_CHAIN (binfo)); + } + if (BINFO_LOST_PRIMARY_P (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " lost-primary"); + } + if (indented) + fprintf (stream, "\n"); + + if (!(flags & TDF_SLIM)) + { + int indented = 0; + + if (BINFO_SUBVTT_INDEX (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " subvttidx=%s", + expr_as_string (BINFO_SUBVTT_INDEX (binfo), + TFF_PLAIN_IDENTIFIER)); + } + if (BINFO_VPTR_INDEX (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " vptridx=%s", + expr_as_string (BINFO_VPTR_INDEX (binfo), + TFF_PLAIN_IDENTIFIER)); + } + if (BINFO_VPTR_FIELD (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " vbaseoffset=%s", + expr_as_string (BINFO_VPTR_FIELD (binfo), + TFF_PLAIN_IDENTIFIER)); + } + if (BINFO_VTABLE (binfo)) + { + indented = maybe_indent_hierarchy (stream, indent + 3, indented); + fprintf (stream, " vptr=%s", + expr_as_string (BINFO_VTABLE (binfo), + TFF_PLAIN_IDENTIFIER)); + } + + if (indented) + fprintf (stream, "\n"); + } + + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) + 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. */ + +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 value; + unsigned HOST_WIDE_INT ix; + HOST_WIDE_INT elt; + tree size = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (decl))); + + elt = (tree_low_cst (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl))), 0) + / BITS_PER_UNIT); + fprintf (stream, "%s:", decl_as_string (decl, TFF_PLAIN_IDENTIFIER)); + fprintf (stream, " %s entries", + expr_as_string (size_binop (PLUS_EXPR, size, size_one_node), + TFF_PLAIN_IDENTIFIER)); + fprintf (stream, "\n"); + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (DECL_INITIAL (decl)), + ix, value) + fprintf (stream, "%-4ld %s\n", (long)(ix * elt), + expr_as_string (value, TFF_PLAIN_IDENTIFIER)); +} + +static void +dump_vtable (tree t, tree binfo, tree vtable) +{ + int flags; + FILE *stream = dump_begin (TDI_class, &flags); + + if (!stream) + return; + + if (!(flags & TDF_SLIM)) + { + int ctor_vtbl_p = TYPE_BINFO (t) != binfo; + + fprintf (stream, "%s for %s", + ctor_vtbl_p ? "Construction vtable" : "Vtable", + type_as_string (BINFO_TYPE (binfo), TFF_PLAIN_IDENTIFIER)); + if (ctor_vtbl_p) + { + if (!BINFO_VIRTUAL_P (binfo)) + fprintf (stream, " (0x" HOST_WIDE_INT_PRINT_HEX " instance)", + (HOST_WIDE_INT) (uintptr_t) binfo); + fprintf (stream, " in %s", type_as_string (t, TFF_PLAIN_IDENTIFIER)); + } + fprintf (stream, "\n"); + dump_array (stream, vtable); + fprintf (stream, "\n"); + } + + dump_end (TDI_class, stream); +} + +static void +dump_vtt (tree t, tree vtt) +{ + int flags; + FILE *stream = dump_begin (TDI_class, &flags); + + if (!stream) + return; + + if (!(flags & TDF_SLIM)) + { + fprintf (stream, "VTT for %s\n", + type_as_string (t, TFF_PLAIN_IDENTIFIER)); + dump_array (stream, vtt); + fprintf (stream, "\n"); + } + + 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. */ + +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 vbase; + VEC(constructor_elt,gc) *v = NULL; + tree vtable = BINFO_VTABLE (TYPE_BINFO (t)); + + /* We lay out the primary and secondary vtables in one contiguous + vtable. The primary vtable is first, followed by the non-virtual + secondary vtables in inheritance graph order. */ + accumulate_vtbl_inits (TYPE_BINFO (t), TYPE_BINFO (t), TYPE_BINFO (t), + vtable, t, &v); + + /* Then come the virtual bases, also in inheritance graph order. */ + for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase)) + { + if (!BINFO_VIRTUAL_P (vbase)) + continue; + accumulate_vtbl_inits (vbase, vbase, TYPE_BINFO (t), vtable, t, &v); + } + + if (BINFO_VTABLE (TYPE_BINFO (t))) + initialize_vtable (TYPE_BINFO (t), v); +} + +/* Initialize the vtable for BINFO with the INITS. */ + +static void +initialize_vtable (tree binfo, VEC(constructor_elt,gc) *inits) +{ + tree decl; + + layout_vtable_decl (binfo, VEC_length (constructor_elt, inits)); + decl = get_vtbl_decl_for_binfo (binfo); + initialize_artificial_var (decl, inits); + dump_vtable (BINFO_TYPE (binfo), binfo, decl); +} + +/* Build the VTT (virtual table table) for T. + A class requires a VTT if it has virtual bases. + + This holds + 1 - primary virtual pointer for complete object T + 2 - secondary VTTs for each direct non-virtual base of T which requires a + VTT + 3 - secondary virtual pointers for each direct or indirect base of T which + has virtual bases or is reachable via a virtual path from T. + 4 - secondary VTTs for each direct or indirect virtual base of T. + + Secondary VTTs look like complete object VTTs without part 4. */ + +static void +build_vtt (tree t) +{ + tree type; + tree vtt; + tree index; + VEC(constructor_elt,gc) *inits; + + /* Build up the initializers for the VTT. */ + inits = NULL; + index = size_zero_node; + build_vtt_inits (TYPE_BINFO (t), t, &inits, &index); + + /* If we didn't need a VTT, we're done. */ + if (!inits) + return; + + /* Figure out the type of the VTT. */ + type = build_array_of_n_type (const_ptr_type_node, + VEC_length (constructor_elt, inits)); + + /* Now, build the VTT object itself. */ + vtt = build_vtable (t, mangle_vtt_for_type (t), type); + initialize_artificial_var (vtt, inits); + /* Add the VTT to the vtables list. */ + DECL_CHAIN (vtt) = DECL_CHAIN (CLASSTYPE_VTABLES (t)); + DECL_CHAIN (CLASSTYPE_VTABLES (t)) = vtt; + + 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; + + while (1) + { + vt = BINFO_VTABLE (binfo); + if (TREE_CODE (vt) == TREE_LIST) + vt = TREE_VALUE (vt); + if (TREE_CODE (vt) == TREE_BINFO) + binfo = vt; + else + break; + } + + return vt; +} + +/* Data for secondary VTT initialization. */ +typedef struct secondary_vptr_vtt_init_data_s +{ + /* Is this the primary VTT? */ + bool top_level_p; + + /* Current index into the VTT. */ + tree index; + + /* Vector of initializers built up. */ + VEC(constructor_elt,gc) *inits; + + /* The type being constructed by this secondary VTT. */ + tree type_being_constructed; +} secondary_vptr_vtt_init_data; + +/* Recursively build the VTT-initializer for BINFO (which is in the + hierarchy dominated by T). INITS points to the end of the initializer + list to date. INDEX is the VTT index where the next element will be + replaced. Iff BINFO is the binfo for T, this is the top level VTT (i.e. + not a subvtt for some base of T). When that is so, we emit the sub-VTTs + for virtual bases of T. When it is not so, we build the constructor + vtables for the BINFO-in-T variant. */ + +static void +build_vtt_inits (tree binfo, tree t, VEC(constructor_elt,gc) **inits, tree *index) +{ + int i; + tree b; + tree init; + secondary_vptr_vtt_init_data data; + int top_level_p = SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), t); + + /* We only need VTTs for subobjects with virtual bases. */ + if (!CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo))) + return; + + /* We need to use a construction vtable if this is not the primary + VTT. */ + if (!top_level_p) + { + build_ctor_vtbl_group (binfo, t); + + /* Record the offset in the VTT where this sub-VTT can be found. */ + BINFO_SUBVTT_INDEX (binfo) = *index; + } + + /* Add the address of the primary vtable for the complete object. */ + init = binfo_ctor_vtable (binfo); + CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, init); + if (top_level_p) + { + gcc_assert (!BINFO_VPTR_INDEX (binfo)); + BINFO_VPTR_INDEX (binfo) = *index; + } + *index = size_binop (PLUS_EXPR, *index, TYPE_SIZE_UNIT (ptr_type_node)); + + /* Recursively add the secondary VTTs for non-virtual bases. */ + for (i = 0; BINFO_BASE_ITERATE (binfo, i, b); ++i) + if (!BINFO_VIRTUAL_P (b)) + build_vtt_inits (b, t, inits, index); + + /* Add secondary virtual pointers for all subobjects of BINFO with + either virtual bases or reachable along a virtual path, except + subobjects that are non-virtual primary bases. */ + data.top_level_p = top_level_p; + data.index = *index; + data.inits = *inits; + data.type_being_constructed = BINFO_TYPE (binfo); + + dfs_walk_once (binfo, dfs_build_secondary_vptr_vtt_inits, NULL, &data); + + *index = data.index; + + /* data.inits might have grown as we added secondary virtual pointers. + Make sure our caller knows about the new vector. */ + *inits = data.inits; + + if (top_level_p) + /* Add the secondary VTTs for virtual bases in inheritance graph + order. */ + for (b = TYPE_BINFO (BINFO_TYPE (binfo)); b; b = TREE_CHAIN (b)) + { + if (!BINFO_VIRTUAL_P (b)) + continue; + + build_vtt_inits (b, t, inits, index); + } + else + /* Remove the ctor vtables we created. */ + dfs_walk_all (binfo, dfs_fixup_binfo_vtbls, NULL, binfo); +} + +/* Called from build_vtt_inits via dfs_walk. BINFO is the binfo for the base + in most derived. DATA is a SECONDARY_VPTR_VTT_INIT_DATA structure. */ + +static tree +dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data_) +{ + secondary_vptr_vtt_init_data *data = (secondary_vptr_vtt_init_data *)data_; + + /* We don't care about bases that don't have vtables. */ + if (!TYPE_VFIELD (BINFO_TYPE (binfo))) + return dfs_skip_bases; + + /* We're only interested in proper subobjects of the type being + constructed. */ + if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->type_being_constructed)) + return NULL_TREE; + + /* We're only interested in bases with virtual bases or reachable + via a virtual path from the type being constructed. */ + if (!(CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)) + || binfo_via_virtual (binfo, data->type_being_constructed))) + return dfs_skip_bases; + + /* We're not interested in non-virtual primary bases. */ + if (!BINFO_VIRTUAL_P (binfo) && BINFO_PRIMARY_P (binfo)) + return NULL_TREE; + + /* Record the index where this secondary vptr can be found. */ + if (data->top_level_p) + { + gcc_assert (!BINFO_VPTR_INDEX (binfo)); + BINFO_VPTR_INDEX (binfo) = data->index; + + if (BINFO_VIRTUAL_P (binfo)) + { + /* It's a primary virtual base, and this is not a + construction vtable. Find the base this is primary of in + the inheritance graph, and use that base's vtable + now. */ + while (BINFO_PRIMARY_P (binfo)) + binfo = BINFO_INHERITANCE_CHAIN (binfo); + } + } + + /* Add the initializer for the secondary vptr itself. */ + CONSTRUCTOR_APPEND_ELT (data->inits, NULL_TREE, binfo_ctor_vtable (binfo)); + + /* Advance the vtt index. */ + data->index = size_binop (PLUS_EXPR, data->index, + TYPE_SIZE_UNIT (ptr_type_node)); + + return NULL_TREE; +} + +/* Called from build_vtt_inits via dfs_walk. After building + constructor vtables and generating the sub-vtt from them, we need + to restore the BINFO_VTABLES that were scribbled on. DATA is the + binfo of the base whose sub vtt was generated. */ + +static tree +dfs_fixup_binfo_vtbls (tree binfo, void* data) +{ + tree vtable = BINFO_VTABLE (binfo); + + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + /* If this class has no vtable, none of its bases do. */ + return dfs_skip_bases; + + if (!vtable) + /* This might be a primary base, so have no vtable in this + hierarchy. */ + return NULL_TREE; + + /* If we scribbled the construction vtable vptr into BINFO, clear it + out now. */ + if (TREE_CODE (vtable) == TREE_LIST + && (TREE_PURPOSE (vtable) == (tree) data)) + BINFO_VTABLE (binfo) = TREE_CHAIN (vtable); + + return NULL_TREE; +} + +/* Build the construction vtable group for BINFO which is in the + hierarchy dominated by T. */ + +static void +build_ctor_vtbl_group (tree binfo, tree t) +{ + tree type; + tree vtbl; + tree id; + tree vbase; + VEC(constructor_elt,gc) *v; + + /* See if we've already created this construction vtable group. */ + id = mangle_ctor_vtbl_for_type (t, binfo); + if (IDENTIFIER_GLOBAL_VALUE (id)) + return; + + gcc_assert (!SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), t)); + /* Build a version of VTBL (with the wrong type) for use in + constructing the addresses of secondary vtables in the + construction vtable group. */ + vtbl = build_vtable (t, id, ptr_type_node); + DECL_CONSTRUCTION_VTABLE_P (vtbl) = 1; + + v = NULL; + accumulate_vtbl_inits (binfo, TYPE_BINFO (TREE_TYPE (binfo)), + binfo, vtbl, t, &v); + + /* Add the vtables for each of our virtual bases using the vbase in T + binfo. */ + for (vbase = TYPE_BINFO (BINFO_TYPE (binfo)); + vbase; + vbase = TREE_CHAIN (vbase)) + { + tree b; + + if (!BINFO_VIRTUAL_P (vbase)) + continue; + b = copied_binfo (vbase, binfo); + + accumulate_vtbl_inits (b, vbase, binfo, vtbl, t, &v); + } + + /* Figure out the type of the construction vtable. */ + type = build_array_of_n_type (vtable_entry_type, + VEC_length (constructor_elt, v)); + layout_type (type); + TREE_TYPE (vtbl) = type; + DECL_SIZE (vtbl) = DECL_SIZE_UNIT (vtbl) = NULL_TREE; + layout_decl (vtbl, 0); + + /* Initialize the construction vtable. */ + CLASSTYPE_VTABLES (t) = chainon (CLASSTYPE_VTABLES (t), vtbl); + initialize_artificial_var (vtbl, v); + dump_vtable (t, binfo, vtbl); +} + +/* Add the vtbl initializers for BINFO (and its bases other than + non-virtual primaries) to the list of INITS. BINFO is in the + hierarchy dominated by T. RTTI_BINFO is the binfo within T of + the constructor the vtbl inits should be accumulated for. (If this + is the complete object vtbl then RTTI_BINFO will be TYPE_BINFO (T).) + ORIG_BINFO is the binfo for this object within BINFO_TYPE (RTTI_BINFO). + BINFO is the active base equivalent of ORIG_BINFO in the inheritance + graph of T. Both BINFO and ORIG_BINFO will have the same BINFO_TYPE, + but are not necessarily the same in terms of layout. */ + +static void +accumulate_vtbl_inits (tree binfo, + tree orig_binfo, + tree rtti_binfo, + tree vtbl, + tree t, + VEC(constructor_elt,gc) **inits) +{ + int i; + tree base_binfo; + int ctor_vtbl_p = !SAME_BINFO_TYPE_P (BINFO_TYPE (rtti_binfo), t); + + gcc_assert (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), BINFO_TYPE (orig_binfo))); + + /* If it doesn't have a vptr, we don't do anything. */ + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + return; + + /* If we're building a construction vtable, we're not interested in + subobjects that don't require construction vtables. */ + if (ctor_vtbl_p + && !CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)) + && !binfo_via_virtual (orig_binfo, BINFO_TYPE (rtti_binfo))) + return; + + /* Build the initializers for the BINFO-in-T vtable. */ + dfs_accumulate_vtbl_inits (binfo, orig_binfo, rtti_binfo, vtbl, t, inits); + + /* Walk the BINFO and its bases. We walk in preorder so that as we + initialize each vtable we can figure out at what offset the + secondary vtable lies from the primary vtable. We can't use + dfs_walk here because we need to iterate through bases of BINFO + and RTTI_BINFO simultaneously. */ + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + { + /* Skip virtual bases. */ + if (BINFO_VIRTUAL_P (base_binfo)) + continue; + accumulate_vtbl_inits (base_binfo, + BINFO_BASE_BINFO (orig_binfo, i), + rtti_binfo, vtbl, t, + inits); + } +} + +/* Called from accumulate_vtbl_inits. Adds the initializers for the + BINFO vtable to L. */ + +static void +dfs_accumulate_vtbl_inits (tree binfo, + tree orig_binfo, + tree rtti_binfo, + tree orig_vtbl, + tree t, + VEC(constructor_elt,gc) **l) +{ + tree vtbl = NULL_TREE; + int ctor_vtbl_p = !SAME_BINFO_TYPE_P (BINFO_TYPE (rtti_binfo), t); + int n_inits; + + if (ctor_vtbl_p + && BINFO_VIRTUAL_P (orig_binfo) && BINFO_PRIMARY_P (orig_binfo)) + { + /* In the hierarchy of BINFO_TYPE (RTTI_BINFO), this is a + primary virtual base. If it is not the same primary in + the hierarchy of T, we'll need to generate a ctor vtable + for it, to place at its location in T. If it is the same + primary, we still need a VTT entry for the vtable, but it + should point to the ctor vtable for the base it is a + primary for within the sub-hierarchy of RTTI_BINFO. + + There are three possible cases: + + 1) We are in the same place. + 2) We are a primary base within a lost primary virtual base of + RTTI_BINFO. + 3) We are primary to something not a base of RTTI_BINFO. */ + + tree b; + tree last = NULL_TREE; + + /* First, look through the bases we are primary to for RTTI_BINFO + or a virtual base. */ + b = binfo; + while (BINFO_PRIMARY_P (b)) + { + b = BINFO_INHERITANCE_CHAIN (b); + last = b; + if (BINFO_VIRTUAL_P (b) || b == rtti_binfo) + goto found; + } + /* If we run out of primary links, keep looking down our + inheritance chain; we might be an indirect primary. */ + for (b = last; b; b = BINFO_INHERITANCE_CHAIN (b)) + if (BINFO_VIRTUAL_P (b) || b == rtti_binfo) + break; + found: + + /* If we found RTTI_BINFO, this is case 1. If we found a virtual + base B and it is a base of RTTI_BINFO, this is case 2. In + 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. */ + vtbl = last; + + /* Otherwise, this is case 3 and we get our own. */ + } + else if (!BINFO_NEW_VTABLE_MARKED (orig_binfo)) + return; + + n_inits = VEC_length (constructor_elt, *l); + + if (!vtbl) + { + tree index; + int non_fn_entries; + + /* Add the initializer for this vtable. */ + build_vtbl_initializer (binfo, orig_binfo, t, rtti_binfo, + &non_fn_entries, l); + + /* Figure out the position to which the VPTR should point. */ + vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, orig_vtbl); + index = size_binop (PLUS_EXPR, + size_int (non_fn_entries), + size_int (n_inits)); + index = size_binop (MULT_EXPR, + TYPE_SIZE_UNIT (vtable_entry_type), + index); + vtbl = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl, index); + } + + if (ctor_vtbl_p) + /* For a construction vtable, we can't overwrite BINFO_VTABLE. + So, we make a TREE_LIST. Later, dfs_fixup_binfo_vtbls will + straighten this out. */ + BINFO_VTABLE (binfo) = tree_cons (rtti_binfo, vtbl, BINFO_VTABLE (binfo)); + else if (BINFO_PRIMARY_P (binfo) && BINFO_VIRTUAL_P (binfo)) + /* Throw away any unneeded intializers. */ + VEC_truncate (constructor_elt, *l, n_inits); + else + /* For an ordinary vtable, set BINFO_VTABLE. */ + BINFO_VTABLE (binfo) = vtbl; +} + +static GTY(()) tree abort_fndecl_addr; + +/* Construct the initializer for BINFO's virtual function table. BINFO + is part of the hierarchy dominated by T. If we're building a + construction vtable, the ORIG_BINFO is the binfo we should use to + find the actual function pointers to put in the vtable - but they + can be overridden on the path to most-derived in the graph that + ORIG_BINFO belongs. Otherwise, + ORIG_BINFO should be the same as BINFO. The RTTI_BINFO is the + BINFO that should be indicated by the RTTI information in the + vtable; it will be a base class of T, rather than T itself, if we + are building a construction vtable. + + The value returned is a TREE_LIST suitable for wrapping in a + CONSTRUCTOR to use as the DECL_INITIAL for a vtable. If + NON_FN_ENTRIES_P is not NULL, *NON_FN_ENTRIES_P is set to the + number of non-function entries in the vtable. + + It might seem that this function should never be called with a + BINFO for which BINFO_PRIMARY_P holds, the vtable for such a + base is always subsumed by a derived class vtable. However, when + we are building construction vtables, we do build vtables for + primary bases; we need these while the primary base is being + constructed. */ + +static void +build_vtbl_initializer (tree binfo, + tree orig_binfo, + tree t, + tree rtti_binfo, + int* non_fn_entries_p, + VEC(constructor_elt,gc) **inits) +{ + tree v; + vtbl_init_data vid; + unsigned ix, jx; + tree vbinfo; + VEC(tree,gc) *vbases; + constructor_elt *e; + + /* Initialize VID. */ + memset (&vid, 0, sizeof (vid)); + vid.binfo = binfo; + vid.derived = t; + vid.rtti_binfo = rtti_binfo; + vid.primary_vtbl_p = SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), t); + vid.ctor_vtbl_p = !SAME_BINFO_TYPE_P (BINFO_TYPE (rtti_binfo), t); + vid.generate_vcall_entries = true; + /* The first vbase or vcall offset is at index -3 in the vtable. */ + vid.index = ssize_int(-3 * TARGET_VTABLE_DATA_ENTRY_DISTANCE); + + /* Add entries to the vtable for RTTI. */ + build_rtti_vtbl_entries (binfo, &vid); + + /* Create an array for keeping track of the functions we've + processed. When we see multiple functions with the same + signature, we share the vcall offsets. */ + vid.fns = VEC_alloc (tree, gc, 32); + /* Add the vcall and vbase offset entries. */ + build_vcall_and_vbase_vtbl_entries (binfo, &vid); + + /* Clear BINFO_VTABLE_PATH_MARKED; it's set by + build_vbase_offset_vtbl_entries. */ + for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0; + VEC_iterate (tree, vbases, ix, vbinfo); ix++) + BINFO_VTABLE_PATH_MARKED (vbinfo) = 0; + + /* If the target requires padding between data entries, add that now. */ + if (TARGET_VTABLE_DATA_ENTRY_DISTANCE > 1) + { + int n_entries = VEC_length (constructor_elt, vid.inits); + + VEC_safe_grow (constructor_elt, gc, vid.inits, + TARGET_VTABLE_DATA_ENTRY_DISTANCE * n_entries); + + /* Move data entries into their new positions and add padding + after the new positions. Iterate backwards so we don't + overwrite entries that we would need to process later. */ + for (ix = n_entries - 1; + VEC_iterate (constructor_elt, vid.inits, ix, e); + ix--) + { + int j; + int new_position = (TARGET_VTABLE_DATA_ENTRY_DISTANCE * ix + + (TARGET_VTABLE_DATA_ENTRY_DISTANCE - 1)); + + VEC_replace (constructor_elt, vid.inits, new_position, e); + + for (j = 1; j < TARGET_VTABLE_DATA_ENTRY_DISTANCE; ++j) + { + constructor_elt *f = VEC_index (constructor_elt, vid.inits, + new_position - j); + f->index = NULL_TREE; + f->value = build1 (NOP_EXPR, vtable_entry_type, + null_pointer_node); + } + } + } + + if (non_fn_entries_p) + *non_fn_entries_p = VEC_length (constructor_elt, vid.inits); + + /* The initializers for virtual functions were built up in reverse + order. Straighten them out and add them to the running list in one + step. */ + jx = VEC_length (constructor_elt, *inits); + VEC_safe_grow (constructor_elt, gc, *inits, + (jx + VEC_length (constructor_elt, vid.inits))); + + for (ix = VEC_length (constructor_elt, vid.inits) - 1; + VEC_iterate (constructor_elt, vid.inits, ix, e); + ix--, jx++) + VEC_replace (constructor_elt, *inits, jx, e); + + /* Go through all the ordinary virtual functions, building up + initializers. */ + for (v = BINFO_VIRTUALS (orig_binfo); v; v = TREE_CHAIN (v)) + { + 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 + requiring extra thunks which cannot be generated with the function. + + We first check this in update_vtable_entry_for_fn, so we handle + restored primary bases properly; we also need to do it here so we + zero out unused slots in ctor vtables, rather than filling them + with erroneous values (though harmless, apart from relocation + costs). */ + if (BV_LOST_PRIMARY (v)) + init = size_zero_node; + + if (! init) + { + /* Pull the offset for `this', and the function to call, out of + the list. */ + delta = BV_DELTA (v); + vcall_index = BV_VCALL_INDEX (v); + + gcc_assert (TREE_CODE (delta) == INTEGER_CST); + gcc_assert (TREE_CODE (fn) == FUNCTION_DECL); + + /* 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; + if (!TARGET_VTABLE_USES_DESCRIPTORS) + { + if (abort_fndecl_addr == NULL) + abort_fndecl_addr + = fold_convert (vfunc_ptr_type_node, + build_fold_addr_expr (fn)); + init = abort_fndecl_addr; + } + } + 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. */ + if (!TARGET_VTABLE_USES_DESCRIPTORS) + init = fold_convert (vfunc_ptr_type_node, + build_fold_addr_expr (fn)); + } + } + + /* And add it to the chain of initializers. */ + if (TARGET_VTABLE_USES_DESCRIPTORS) + { + int i; + if (init == size_zero_node) + for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i) + CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, init); + else + for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i) + { + tree fdesc = build2 (FDESC_EXPR, vfunc_ptr_type_node, + fn, build_int_cst (NULL_TREE, i)); + TREE_CONSTANT (fdesc) = 1; + + CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, fdesc); + } + } + else + CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, init); + } +} + +/* Adds to vid->inits the initializers for the vbase and vcall + 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; + + /* If this is a derived class, we must first create entries + corresponding to the primary base class. */ + b = get_primary_binfo (binfo); + if (b) + build_vcall_and_vbase_vtbl_entries (b, vid); + + /* Add the vbase entries for this base. */ + build_vbase_offset_vtbl_entries (binfo, vid); + /* Add the vcall entries for this base. */ + build_vcall_offset_vtbl_entries (binfo, vid); +} + +/* Returns the initializers for the vbase offset entries in the vtable + for BINFO (which is part of the class hierarchy dominated by T), in + reverse order. VBASE_OFFSET_INDEX gives the vtable index + where the next vbase offset will go. */ + +static void +build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid) +{ + tree vbase; + tree t; + tree non_primary_binfo; + + /* If there are no virtual baseclasses, then there is nothing to + do. */ + if (!CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo))) + return; + + t = vid->derived; + + /* We might be a primary base class. Go up the inheritance hierarchy + until we find the most derived class of which we are a primary base: + it is the offset of that which we need to use. */ + non_primary_binfo = binfo; + while (BINFO_INHERITANCE_CHAIN (non_primary_binfo)) + { + tree b; + + /* If we have reached a virtual base, then it must be a primary + base (possibly multi-level) of vid->binfo, or we wouldn't + have called build_vcall_and_vbase_vtbl_entries for it. But it + might be a lost primary, so just skip down to vid->binfo. */ + if (BINFO_VIRTUAL_P (non_primary_binfo)) + { + non_primary_binfo = vid->binfo; + break; + } + + b = BINFO_INHERITANCE_CHAIN (non_primary_binfo); + if (get_primary_binfo (b) != non_primary_binfo) + break; + non_primary_binfo = b; + } + + /* Go through the virtual bases, adding the offsets. */ + for (vbase = TYPE_BINFO (BINFO_TYPE (binfo)); + vbase; + vbase = TREE_CHAIN (vbase)) + { + tree b; + tree delta; + + if (!BINFO_VIRTUAL_P (vbase)) + continue; + + /* 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, + vid->index, + convert (ssizetype, + TYPE_SIZE_UNIT (vtable_entry_type))); + if (vid->primary_vtbl_p) + BINFO_VPTR_FIELD (b) = delta; + + if (binfo != TYPE_BINFO (t)) + /* The vbase offset had better be the same. */ + gcc_assert (tree_int_cst_equal (delta, BINFO_VPTR_FIELD (vbase))); + + /* The next vbase will come at a more negative offset. */ + vid->index = size_binop (MINUS_EXPR, vid->index, + ssize_int (TARGET_VTABLE_DATA_ENTRY_DISTANCE)); + + /* The initializer is the delta from BINFO to this virtual base. + The vbase offsets go in reverse inheritance-graph order, and + we are walking in inheritance graph order so these end up in + the right order. */ + delta = size_diffop_loc (input_location, + BINFO_OFFSET (b), BINFO_OFFSET (non_primary_binfo)); + + CONSTRUCTOR_APPEND_ELT (vid->inits, NULL_TREE, + fold_build1_loc (input_location, NOP_EXPR, + vtable_entry_type, delta)); + } +} + +/* Adds the initializers for the vcall offset entries in the vtable + for BINFO (which is part of the class hierarchy dominated by VID->DERIVED) + 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 + building the main vtable for a class. */ + if (binfo == TYPE_BINFO (vid->derived) + || (BINFO_VIRTUAL_P (binfo) + /* If BINFO is RTTI_BINFO, then (since BINFO does not + correspond to VID->DERIVED), we are building a primary + construction virtual table. Since this is a primary + virtual table, we do not need the vcall offsets for + BINFO. */ + && binfo != vid->rtti_binfo)) + { + /* We need a vcall offset for each of the virtual functions in this + vtable. For example: + + class A { virtual void f (); }; + class B1 : virtual public A { virtual void f (); }; + class B2 : virtual public A { virtual void f (); }; + class C: public B1, public B2 { virtual void f (); }; + + A C object has a primary base of B1, which has a primary base of A. A + C also has a secondary base of B2, which no longer has a primary base + of A. So the B2-in-C construction vtable needs a secondary vtable for + A, which will adjust the A* to a B2* to call f. We have no way of + knowing what (or even whether) this offset will be when we define B2, + so we store this "vcall offset" in the A sub-vtable and look it up in + a "virtual thunk" for B2::f. + + We need entries for all the functions in our primary vtable and + in our non-virtual bases' secondary vtables. */ + vid->vbase = binfo; + /* If we are just computing the vcall indices -- but do not need + the actual entries -- not that. */ + if (!BINFO_VIRTUAL_P (binfo)) + vid->generate_vcall_entries = false; + /* Now, walk through the non-virtual bases, adding vcall offsets. */ + add_vcall_offset_vtbl_entries_r (binfo, vid); + } +} + +/* 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; + tree base_binfo; + + /* Don't walk into virtual bases -- except, of course, for the + virtual base for which we are building vcall offsets. Any + primary virtual base will have already had its offsets generated + through the recursion in build_vcall_and_vbase_vtbl_entries. */ + if (BINFO_VIRTUAL_P (binfo) && vid->vbase != binfo) + return; + + /* If BINFO has a primary base, process it first. */ + primary_binfo = get_primary_binfo (binfo); + if (primary_binfo) + add_vcall_offset_vtbl_entries_r (primary_binfo, vid); + + /* Add BINFO itself to the list. */ + add_vcall_offset_vtbl_entries_1 (binfo, vid); + + /* Scan the non-primary bases of BINFO. */ + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + if (base_binfo != primary_binfo) + add_vcall_offset_vtbl_entries_r (base_binfo, vid); +} + +/* 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)) + { + tree orig_fn; + + /* The ABI requires that the methods be processed in declaration + order. G++ 3.2 used the order in the vtable. */ + for (orig_fn = TYPE_METHODS (BINFO_TYPE (binfo)); + orig_fn; + orig_fn = DECL_CHAIN (orig_fn)) + if (DECL_VINDEX (orig_fn)) + add_vcall_offset (orig_fn, binfo, vid); + } + else + { + tree derived_virtuals; + tree base_virtuals; + tree orig_virtuals; + /* If BINFO is a primary base, the most derived class which has + BINFO as a primary base; otherwise, just BINFO. */ + tree non_primary_binfo; + + /* We might be a primary base class. Go up the inheritance hierarchy + until we find the most derived class of which we are a primary base: + it is the BINFO_VIRTUALS there that we need to consider. */ + non_primary_binfo = binfo; + while (BINFO_INHERITANCE_CHAIN (non_primary_binfo)) + { + tree b; + + /* If we have reached a virtual base, then it must be vid->vbase, + because we ignore other virtual bases in + add_vcall_offset_vtbl_entries_r. In turn, it must be a primary + base (possibly multi-level) of vid->binfo, or we wouldn't + have called build_vcall_and_vbase_vtbl_entries for it. But it + might be a lost primary, so just skip down to vid->binfo. */ + if (BINFO_VIRTUAL_P (non_primary_binfo)) + { + gcc_assert (non_primary_binfo == vid->vbase); + non_primary_binfo = vid->binfo; + break; + } + + b = BINFO_INHERITANCE_CHAIN (non_primary_binfo); + if (get_primary_binfo (b) != non_primary_binfo) + break; + non_primary_binfo = b; + } + + 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), + orig_virtuals = BINFO_VIRTUALS (TYPE_BINFO (BINFO_TYPE (binfo))); + base_virtuals; + base_virtuals = TREE_CHAIN (base_virtuals), + derived_virtuals = TREE_CHAIN (derived_virtuals), + orig_virtuals = TREE_CHAIN (orig_virtuals)) + { + tree orig_fn; + + /* Find the declaration that originally caused this function to + be present in BINFO_TYPE (binfo). */ + orig_fn = BV_FN (orig_virtuals); + + /* When processing BINFO, we only want to generate vcall slots for + function slots introduced in BINFO. So don't try to generate + one if the function isn't even defined in BINFO. */ + if (!SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), DECL_CONTEXT (orig_fn))) + continue; + + add_vcall_offset (orig_fn, binfo, vid); + } + } +} + +/* Add a vcall offset entry for ORIG_FN to the vtable. */ + +static void +add_vcall_offset (tree orig_fn, tree binfo, vtbl_init_data *vid) +{ + size_t i; + tree vcall_offset; + tree derived_entry; + + /* If there is already an entry for a function with the same + signature as FN, then we do not need a second vcall offset. + Check the list of functions already present in the derived + class vtable. */ + FOR_EACH_VEC_ELT (tree, vid->fns, i, derived_entry) + { + if (same_signature_p (derived_entry, orig_fn) + /* We only use one vcall offset for virtual destructors, + even though there are two virtual table entries. */ + || (DECL_DESTRUCTOR_P (derived_entry) + && DECL_DESTRUCTOR_P (orig_fn))) + return; + } + + /* If we are building these vcall offsets as part of building + the vtable for the most derived class, remember the vcall + offset. */ + if (vid->binfo == TYPE_BINFO (vid->derived)) + { + tree_pair_p elt = VEC_safe_push (tree_pair_s, gc, + CLASSTYPE_VCALL_INDICES (vid->derived), + NULL); + elt->purpose = orig_fn; + elt->value = vid->index; + } + + /* The next vcall offset will be found at a more negative + offset. */ + vid->index = size_binop (MINUS_EXPR, vid->index, + ssize_int (TARGET_VTABLE_DATA_ENTRY_DISTANCE)); + + /* Keep track of this function. */ + VEC_safe_push (tree, gc, vid->fns, orig_fn); + + if (vid->generate_vcall_entries) + { + tree base; + tree fn; + + /* Find the overriding function. */ + fn = find_final_overrider (vid->rtti_binfo, binfo, orig_fn); + if (fn == error_mark_node) + vcall_offset = build_zero_cst (vtable_entry_type); + else + { + base = TREE_VALUE (fn); + + /* The vbase we're working on is a primary base of + vid->binfo. But it might be a lost primary, so its + BINFO_OFFSET might be wrong, so we just use the + BINFO_OFFSET from vid->binfo. */ + vcall_offset = size_diffop_loc (input_location, + BINFO_OFFSET (base), + BINFO_OFFSET (vid->binfo)); + vcall_offset = fold_build1_loc (input_location, + NOP_EXPR, vtable_entry_type, + vcall_offset); + } + /* Add the initializer to the vtable. */ + CONSTRUCTOR_APPEND_ELT (vid->inits, NULL_TREE, vcall_offset); + } +} + +/* 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; + tree offset; + tree decl; + tree init; + + t = BINFO_TYPE (vid->rtti_binfo); + + /* To find the complete object, we will first convert to our most + primary base, and then add the offset in the vtbl to that value. */ + b = binfo; + while (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (b)) + && !BINFO_LOST_PRIMARY_P (b)) + { + tree primary_base; + + primary_base = get_primary_binfo (b); + gcc_assert (BINFO_PRIMARY_P (primary_base) + && BINFO_INHERITANCE_CHAIN (primary_base) == b); + b = primary_base; + } + offset = size_diffop_loc (input_location, + BINFO_OFFSET (vid->rtti_binfo), BINFO_OFFSET (b)); + + /* The second entry is the address of the typeinfo object. */ + if (flag_rtti) + decl = build_address (get_tinfo_decl (t)); + else + decl = integer_zero_node; + + /* Convert the declaration to a type that can be stored in the + vtable. */ + init = build_nop (vfunc_ptr_type_node, decl); + CONSTRUCTOR_APPEND_ELT (vid->inits, NULL_TREE, init); + + /* Add the offset-to-top entry. It comes earlier in the vtable than + the typeinfo entry. Convert the offset to look like a + function pointer, so that we can put it in the vtable. */ + init = build_nop (vfunc_ptr_type_node, offset); + CONSTRUCTOR_APPEND_ELT (vid->inits, NULL_TREE, init); +} + +/* Fold a OBJ_TYPE_REF expression to the address of a function. + KNOWN_TYPE carries the true type of OBJ_TYPE_REF_OBJECT(REF). */ + +tree +cp_fold_obj_type_ref (tree ref, tree known_type) +{ + HOST_WIDE_INT index = tree_low_cst (OBJ_TYPE_REF_TOKEN (ref), 1); + HOST_WIDE_INT i = 0; + tree v = BINFO_VIRTUALS (TYPE_BINFO (known_type)); + tree fndecl; + + while (i != index) + { + i += (TARGET_VTABLE_USES_DESCRIPTORS + ? TARGET_VTABLE_USES_DESCRIPTORS : 1); + v = TREE_CHAIN (v); + } + + fndecl = BV_FN (v); + +#ifdef ENABLE_CHECKING + gcc_assert (tree_int_cst_equal (OBJ_TYPE_REF_TOKEN (ref), + DECL_VINDEX (fndecl))); +#endif + + cgraph_node (fndecl)->local.vtable_method = true; + + return build_address (fndecl); +} + +#include "gt-cp-class.h" diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in new file mode 100644 index 000000000..0a3847b86 --- /dev/null +++ b/gcc/cp/config-lang.in @@ -0,0 +1,33 @@ +# Top level configure fragment for GNU C++. +# Copyright (C) 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2007, 2010 +# 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 3, 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 COPYING3. If not see +# . + +# Configure looks for the existence of this file to auto-config each language. +# We define several parameters used by configure: +# +# language - name of language as it would appear in $(LANGUAGES) +# compilers - value to add to $(COMPILERS) + +language="c++" + +compilers="cc1plus\$(exeext)" + +target_libs="target-libstdc++-v3" + +gtfiles="\$(srcdir)/cp/rtti.c \$(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/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)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-objcp-common.c \$(srcdir)/cp/cp-lang.c" diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c new file mode 100644 index 000000000..d26c0e0ca --- /dev/null +++ b/gcc/cp/cp-gimplify.c @@ -0,0 +1,1465 @@ +/* C++-specific tree lowering bits; see also c-gimplify.c and tree-gimple.c. + + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. + Contributed by Jason Merrill + +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 3, 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 COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "c-family/c-common.h" +#include "tree-iterator.h" +#include "gimple.h" +#include "hashtab.h" +#include "pointer-set.h" +#include "flags.h" +#include "splay-tree.h" + +/* Local declarations. */ + +enum bc_t { bc_break = 0, bc_continue = 1 }; + +/* Stack of labels which are targets for "break" or "continue", + linked through TREE_CHAIN. */ +static tree bc_label[2]; + +/* Begin a scope which can be exited by a break or continue statement. BC + indicates which. + + Just creates a label and pushes it into the current context. */ + +static tree +begin_bc_block (enum bc_t bc) +{ + tree label = create_artificial_label (input_location); + DECL_CHAIN (label) = bc_label[bc]; + bc_label[bc] = label; + return label; +} + +/* Finish a scope which can be exited by a break or continue statement. + LABEL was returned from the most recent call to begin_bc_block. BODY is + an expression for the contents of the scope. + + If we saw a break (or continue) in the scope, append a LABEL_EXPR to + body. Otherwise, just forget the label. */ + +static gimple_seq +finish_bc_block (enum bc_t bc, tree label, gimple_seq body) +{ + gcc_assert (label == bc_label[bc]); + + if (TREE_USED (label)) + { + gimple_seq_add_stmt (&body, gimple_build_label (label)); + } + + bc_label[bc] = DECL_CHAIN (label); + DECL_CHAIN (label) = NULL_TREE; + return body; +} + +/* Get the LABEL_EXPR to represent a break or continue statement + in the current block scope. BC indicates which. */ + +static tree +get_bc_label (enum bc_t bc) +{ + tree label = bc_label[bc]; + + if (label == NULL_TREE) + { + if (bc == bc_break) + error ("break statement not within loop or switch"); + else + error ("continue statement not within loop or switch"); + + return NULL_TREE; + } + + /* Mark the label used for finish_bc_block. */ + TREE_USED (label) = 1; + return label; +} + +/* Genericize a TRY_BLOCK. */ + +static void +genericize_try_block (tree *stmt_p) +{ + tree body = TRY_STMTS (*stmt_p); + tree cleanup = TRY_HANDLERS (*stmt_p); + + *stmt_p = build2 (TRY_CATCH_EXPR, void_type_node, body, cleanup); +} + +/* Genericize a HANDLER by converting to a CATCH_EXPR. */ + +static void +genericize_catch_block (tree *stmt_p) +{ + tree type = HANDLER_TYPE (*stmt_p); + tree body = HANDLER_BODY (*stmt_p); + + /* FIXME should the caught type go in TREE_TYPE? */ + *stmt_p = build2 (CATCH_EXPR, void_type_node, type, body); +} + +/* A terser interface for building a representation of an exception + specification. */ + +static tree +build_gimple_eh_filter_tree (tree body, tree allowed, tree failure) +{ + tree t; + + /* FIXME should the allowed types go in TREE_TYPE? */ + t = build2 (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE); + append_to_statement_list (failure, &EH_FILTER_FAILURE (t)); + + t = build2 (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t); + append_to_statement_list (body, &TREE_OPERAND (t, 0)); + + return t; +} + +/* Genericize an EH_SPEC_BLOCK by converting it to a + TRY_CATCH_EXPR/EH_FILTER_EXPR pair. */ + +static void +genericize_eh_spec_block (tree *stmt_p) +{ + tree body = EH_SPEC_STMTS (*stmt_p); + tree allowed = EH_SPEC_RAISES (*stmt_p); + tree failure = build_call_n (call_unexpected_node, 1, build_exc_ptr ()); + + *stmt_p = build_gimple_eh_filter_tree (body, allowed, failure); + TREE_NO_WARNING (*stmt_p) = true; + TREE_NO_WARNING (TREE_OPERAND (*stmt_p, 1)) = true; +} + +/* Genericize an IF_STMT by turning it into a COND_EXPR. */ + +static void +genericize_if_stmt (tree *stmt_p) +{ + tree stmt, cond, then_, else_; + location_t locus = EXPR_LOCATION (*stmt_p); + + stmt = *stmt_p; + cond = IF_COND (stmt); + then_ = THEN_CLAUSE (stmt); + else_ = ELSE_CLAUSE (stmt); + + if (!then_) + then_ = build_empty_stmt (locus); + if (!else_) + else_ = build_empty_stmt (locus); + + if (integer_nonzerop (cond) && !TREE_SIDE_EFFECTS (else_)) + stmt = then_; + else if (integer_zerop (cond) && !TREE_SIDE_EFFECTS (then_)) + stmt = else_; + else + stmt = build3 (COND_EXPR, void_type_node, cond, then_, else_); + if (CAN_HAVE_LOCATION_P (stmt) && !EXPR_HAS_LOCATION (stmt)) + SET_EXPR_LOCATION (stmt, locus); + *stmt_p = stmt; +} + +/* Build a generic representation of one of the C loop forms. COND is the + loop condition or NULL_TREE. BODY is the (possibly compound) statement + controlled by the loop. INCR is the increment expression of a for-loop, + or NULL_TREE. COND_IS_FIRST indicates whether the condition is + evaluated before the loop body as in while and for loops, or after the + loop body as in do-while loops. */ + +static gimple_seq +gimplify_cp_loop (tree cond, tree body, tree incr, bool cond_is_first) +{ + gimple top, entry, stmt; + gimple_seq stmt_list, body_seq, incr_seq, exit_seq; + tree cont_block, break_block; + location_t stmt_locus; + + stmt_locus = input_location; + stmt_list = NULL; + body_seq = NULL; + incr_seq = NULL; + exit_seq = NULL; + entry = NULL; + + break_block = begin_bc_block (bc_break); + cont_block = begin_bc_block (bc_continue); + + /* If condition is zero don't generate a loop construct. */ + if (cond && integer_zerop (cond)) + { + top = NULL; + if (cond_is_first) + { + stmt = gimple_build_goto (get_bc_label (bc_break)); + gimple_set_location (stmt, stmt_locus); + gimple_seq_add_stmt (&stmt_list, stmt); + } + } + else + { + /* If we use a LOOP_EXPR here, we have to feed the whole thing + back through the main gimplifier to lower it. Given that we + have to gimplify the loop body NOW so that we can resolve + break/continue stmts, seems easier to just expand to gotos. */ + top = gimple_build_label (create_artificial_label (stmt_locus)); + + /* If we have an exit condition, then we build an IF with gotos either + out of the loop, or to the top of it. If there's no exit condition, + then we just build a jump back to the top. */ + if (cond && !integer_nonzerop (cond)) + { + if (cond != error_mark_node) + { + gimplify_expr (&cond, &exit_seq, NULL, is_gimple_val, fb_rvalue); + stmt = gimple_build_cond (NE_EXPR, cond, + build_int_cst (TREE_TYPE (cond), 0), + gimple_label_label (top), + get_bc_label (bc_break)); + gimple_seq_add_stmt (&exit_seq, stmt); + } + + if (cond_is_first) + { + if (incr) + { + entry = gimple_build_label + (create_artificial_label (stmt_locus)); + stmt = gimple_build_goto (gimple_label_label (entry)); + } + else + stmt = gimple_build_goto (get_bc_label (bc_continue)); + gimple_set_location (stmt, stmt_locus); + gimple_seq_add_stmt (&stmt_list, stmt); + } + } + else + { + stmt = gimple_build_goto (gimple_label_label (top)); + gimple_seq_add_stmt (&exit_seq, stmt); + } + } + + gimplify_stmt (&body, &body_seq); + gimplify_stmt (&incr, &incr_seq); + + body_seq = finish_bc_block (bc_continue, cont_block, body_seq); + + gimple_seq_add_stmt (&stmt_list, top); + gimple_seq_add_seq (&stmt_list, body_seq); + gimple_seq_add_seq (&stmt_list, incr_seq); + gimple_seq_add_stmt (&stmt_list, entry); + gimple_seq_add_seq (&stmt_list, exit_seq); + + annotate_all_with_location (stmt_list, stmt_locus); + + return finish_bc_block (bc_break, break_block, stmt_list); +} + +/* Gimplify a FOR_STMT node. Move the stuff in the for-init-stmt into the + prequeue and hand off to gimplify_cp_loop. */ + +static void +gimplify_for_stmt (tree *stmt_p, gimple_seq *pre_p) +{ + tree stmt = *stmt_p; + + if (FOR_INIT_STMT (stmt)) + gimplify_and_add (FOR_INIT_STMT (stmt), pre_p); + + gimple_seq_add_seq (pre_p, + gimplify_cp_loop (FOR_COND (stmt), FOR_BODY (stmt), + FOR_EXPR (stmt), 1)); + *stmt_p = NULL_TREE; +} + +/* Gimplify a WHILE_STMT node. */ + +static void +gimplify_while_stmt (tree *stmt_p, gimple_seq *pre_p) +{ + tree stmt = *stmt_p; + gimple_seq_add_seq (pre_p, + gimplify_cp_loop (WHILE_COND (stmt), WHILE_BODY (stmt), + NULL_TREE, 1)); + *stmt_p = NULL_TREE; +} + +/* Gimplify a DO_STMT node. */ + +static void +gimplify_do_stmt (tree *stmt_p, gimple_seq *pre_p) +{ + tree stmt = *stmt_p; + gimple_seq_add_seq (pre_p, + gimplify_cp_loop (DO_COND (stmt), DO_BODY (stmt), + NULL_TREE, 0)); + *stmt_p = NULL_TREE; +} + +/* Genericize a SWITCH_STMT by turning it into a SWITCH_EXPR. */ + +static void +gimplify_switch_stmt (tree *stmt_p, gimple_seq *pre_p) +{ + tree stmt = *stmt_p; + tree break_block, body, t; + location_t stmt_locus = input_location; + gimple_seq seq = NULL; + + break_block = begin_bc_block (bc_break); + + body = SWITCH_STMT_BODY (stmt); + if (!body) + body = build_empty_stmt (stmt_locus); + + t = build3 (SWITCH_EXPR, SWITCH_STMT_TYPE (stmt), + SWITCH_STMT_COND (stmt), body, NULL_TREE); + SET_EXPR_LOCATION (t, stmt_locus); + gimplify_and_add (t, &seq); + + seq = finish_bc_block (bc_break, break_block, seq); + gimple_seq_add_seq (pre_p, seq); + *stmt_p = NULL_TREE; +} + +/* Hook into the middle of gimplifying an OMP_FOR node. This is required + in order to properly gimplify CONTINUE statements. Here we merely + manage the continue stack; the rest of the job is performed by the + regular gimplifier. */ + +static enum gimplify_status +cp_gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) +{ + tree for_stmt = *expr_p; + tree cont_block; + gimple stmt; + gimple_seq seq = NULL; + + /* Protect ourselves from recursion. */ + if (OMP_FOR_GIMPLIFYING_P (for_stmt)) + return GS_UNHANDLED; + OMP_FOR_GIMPLIFYING_P (for_stmt) = 1; + + /* Note that while technically the continue label is enabled too soon + here, we should have already diagnosed invalid continues nested within + statement expressions within the INIT, COND, or INCR expressions. */ + cont_block = begin_bc_block (bc_continue); + + gimplify_and_add (for_stmt, &seq); + stmt = gimple_seq_last_stmt (seq); + if (gimple_code (stmt) == GIMPLE_OMP_FOR) + gimple_omp_set_body (stmt, finish_bc_block (bc_continue, cont_block, + gimple_omp_body (stmt))); + else + seq = finish_bc_block (bc_continue, cont_block, seq); + gimple_seq_add_seq (pre_p, seq); + + OMP_FOR_GIMPLIFYING_P (for_stmt) = 0; + + return GS_ALL_DONE; +} + +/* Gimplify an EXPR_STMT node. */ + +static void +gimplify_expr_stmt (tree *stmt_p) +{ + tree stmt = EXPR_STMT_EXPR (*stmt_p); + + if (stmt == error_mark_node) + stmt = NULL; + + /* Gimplification of a statement expression will nullify the + statement if all its side effects are moved to *PRE_P and *POST_P. + + In this case we will not want to emit the gimplified statement. + However, we may still want to emit a warning, so we do that before + gimplification. */ + if (stmt && warn_unused_value) + { + if (!TREE_SIDE_EFFECTS (stmt)) + { + if (!IS_EMPTY_STMT (stmt) + && !VOID_TYPE_P (TREE_TYPE (stmt)) + && !TREE_NO_WARNING (stmt)) + warning (OPT_Wunused_value, "statement with no effect"); + } + else + warn_if_unused_value (stmt, input_location); + } + + if (stmt == NULL_TREE) + stmt = alloc_stmt_list (); + + *stmt_p = stmt; +} + +/* Gimplify initialization from an AGGR_INIT_EXPR. */ + +static void +cp_gimplify_init_expr (tree *expr_p) +{ + tree from = TREE_OPERAND (*expr_p, 1); + tree to = TREE_OPERAND (*expr_p, 0); + tree t; + + /* What about code that pulls out the temp and uses it elsewhere? I + think that such code never uses the TARGET_EXPR as an initializer. If + I'm wrong, we'll abort because the temp won't have any RTL. In that + case, I guess we'll need to replace references somehow. */ + if (TREE_CODE (from) == TARGET_EXPR) + from = TARGET_EXPR_INITIAL (from); + + /* Look through any COMPOUND_EXPRs, since build_compound_expr pushes them + inside the TARGET_EXPR. */ + for (t = from; t; ) + { + tree sub = TREE_CODE (t) == COMPOUND_EXPR ? TREE_OPERAND (t, 0) : t; + + /* If we are initializing from an AGGR_INIT_EXPR, drop the INIT_EXPR and + replace the slot operand with our target. + + Should we add a target parm to gimplify_expr instead? No, as in this + case we want to replace the INIT_EXPR. */ + if (TREE_CODE (sub) == AGGR_INIT_EXPR + || TREE_CODE (sub) == VEC_INIT_EXPR) + { + if (TREE_CODE (sub) == AGGR_INIT_EXPR) + AGGR_INIT_EXPR_SLOT (sub) = to; + else + VEC_INIT_EXPR_SLOT (sub) = to; + *expr_p = from; + + /* The initialization is now a side-effect, so the container can + become void. */ + if (from != sub) + TREE_TYPE (from) = void_type_node; + } + + if (t == sub) + break; + else + t = TREE_OPERAND (t, 1); + } + +} + +/* Gimplify a MUST_NOT_THROW_EXPR. */ + +static enum gimplify_status +gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p) +{ + tree stmt = *expr_p; + tree temp = voidify_wrapper_expr (stmt, NULL); + tree body = TREE_OPERAND (stmt, 0); + gimple_seq try_ = NULL; + gimple_seq catch_ = NULL; + gimple mnt; + + gimplify_and_add (body, &try_); + mnt = gimple_build_eh_must_not_throw (terminate_node); + gimplify_seq_add_stmt (&catch_, mnt); + mnt = gimple_build_try (try_, catch_, GIMPLE_TRY_CATCH); + + gimplify_seq_add_stmt (pre_p, mnt); + if (temp) + { + *expr_p = temp; + return GS_OK; + } + + *expr_p = NULL; + return GS_ALL_DONE; +} + +/* Do C++-specific gimplification. Args are as for gimplify_expr. */ + +int +cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) +{ + int saved_stmts_are_full_exprs_p = 0; + enum tree_code code = TREE_CODE (*expr_p); + enum gimplify_status ret; + + if (STATEMENT_CODE_P (code)) + { + saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); + current_stmt_tree ()->stmts_are_full_exprs_p + = STMT_IS_FULL_EXPR_P (*expr_p); + } + + switch (code) + { + case PTRMEM_CST: + *expr_p = cplus_expand_constant (*expr_p); + ret = GS_OK; + break; + + case AGGR_INIT_EXPR: + simplify_aggr_init_expr (expr_p); + ret = GS_OK; + break; + + case VEC_INIT_EXPR: + { + location_t loc = input_location; + tree init = VEC_INIT_EXPR_INIT (*expr_p); + int from_array = (init && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE); + gcc_assert (EXPR_HAS_LOCATION (*expr_p)); + input_location = EXPR_LOCATION (*expr_p); + *expr_p = build_vec_init (VEC_INIT_EXPR_SLOT (*expr_p), NULL_TREE, + init, VEC_INIT_EXPR_VALUE_INIT (*expr_p), + from_array, + tf_warning_or_error); + ret = GS_OK; + input_location = loc; + } + break; + + case THROW_EXPR: + /* FIXME communicate throw type to back end, probably by moving + THROW_EXPR into ../tree.def. */ + *expr_p = TREE_OPERAND (*expr_p, 0); + ret = GS_OK; + break; + + case MUST_NOT_THROW_EXPR: + ret = gimplify_must_not_throw_expr (expr_p, pre_p); + break; + + /* We used to do this for MODIFY_EXPR as well, but that's unsafe; the + LHS of an assignment might also be involved in the RHS, as in bug + 25979. */ + case INIT_EXPR: + cp_gimplify_init_expr (expr_p); + if (TREE_CODE (*expr_p) != INIT_EXPR) + return GS_OK; + /* Otherwise fall through. */ + case MODIFY_EXPR: + { + /* If the back end isn't clever enough to know that the lhs and rhs + types are the same, add an explicit conversion. */ + tree op0 = TREE_OPERAND (*expr_p, 0); + tree op1 = TREE_OPERAND (*expr_p, 1); + + if (!error_operand_p (op0) + && !error_operand_p (op1) + && (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (op0)) + || TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (op1))) + && !useless_type_conversion_p (TREE_TYPE (op1), TREE_TYPE (op0))) + TREE_OPERAND (*expr_p, 1) = build1 (VIEW_CONVERT_EXPR, + TREE_TYPE (op0), op1); + + else if ((is_gimple_lvalue (op1) || INDIRECT_REF_P (op1) + || (TREE_CODE (op1) == CONSTRUCTOR + && CONSTRUCTOR_NELTS (op1) == 0) + || (TREE_CODE (op1) == CALL_EXPR + && !CALL_EXPR_RETURN_SLOT_OPT (op1))) + && is_really_empty_class (TREE_TYPE (op0))) + { + /* Remove any copies of empty classes. We check that the RHS + has a simple form so that TARGET_EXPRs and non-empty + CONSTRUCTORs get reduced properly, and we leave the return + slot optimization alone because it isn't a copy (FIXME so it + shouldn't be represented as one). + + Also drop volatile variables on the RHS to avoid infinite + recursion from gimplify_expr trying to load the value. */ + if (!TREE_SIDE_EFFECTS (op1) + || (DECL_P (op1) && TREE_THIS_VOLATILE (op1))) + *expr_p = op0; + else if (TREE_CODE (op1) == MEM_REF + && TREE_THIS_VOLATILE (op1)) + { + /* Similarly for volatile MEM_REFs on the RHS. */ + if (!TREE_SIDE_EFFECTS (TREE_OPERAND (op1, 0))) + *expr_p = op0; + else + *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p), + TREE_OPERAND (op1, 0), op0); + } + else + *expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p), + op0, op1); + } + } + ret = GS_OK; + break; + + case EMPTY_CLASS_EXPR: + /* We create an empty CONSTRUCTOR with RECORD_TYPE. */ + *expr_p = build_constructor (TREE_TYPE (*expr_p), NULL); + ret = GS_OK; + break; + + case BASELINK: + *expr_p = BASELINK_FUNCTIONS (*expr_p); + ret = GS_OK; + break; + + case TRY_BLOCK: + genericize_try_block (expr_p); + ret = GS_OK; + break; + + case HANDLER: + genericize_catch_block (expr_p); + ret = GS_OK; + break; + + case EH_SPEC_BLOCK: + genericize_eh_spec_block (expr_p); + ret = GS_OK; + break; + + case USING_STMT: + gcc_unreachable (); + + case FOR_STMT: + gimplify_for_stmt (expr_p, pre_p); + ret = GS_OK; + break; + + case WHILE_STMT: + gimplify_while_stmt (expr_p, pre_p); + ret = GS_OK; + break; + + case DO_STMT: + gimplify_do_stmt (expr_p, pre_p); + ret = GS_OK; + break; + + case SWITCH_STMT: + gimplify_switch_stmt (expr_p, pre_p); + ret = GS_OK; + break; + + case OMP_FOR: + ret = cp_gimplify_omp_for (expr_p, pre_p); + break; + + case CONTINUE_STMT: + gimple_seq_add_stmt (pre_p, gimple_build_predict (PRED_CONTINUE, NOT_TAKEN)); + gimple_seq_add_stmt (pre_p, gimple_build_goto (get_bc_label (bc_continue))); + *expr_p = NULL_TREE; + ret = GS_ALL_DONE; + break; + + case BREAK_STMT: + gimple_seq_add_stmt (pre_p, gimple_build_goto (get_bc_label (bc_break))); + *expr_p = NULL_TREE; + ret = GS_ALL_DONE; + break; + + case EXPR_STMT: + gimplify_expr_stmt (expr_p); + ret = GS_OK; + break; + + case UNARY_PLUS_EXPR: + { + tree arg = TREE_OPERAND (*expr_p, 0); + tree type = TREE_TYPE (*expr_p); + *expr_p = (TREE_TYPE (arg) != type) ? fold_convert (type, arg) + : arg; + ret = GS_OK; + } + break; + + default: + ret = (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p); + break; + } + + /* Restore saved state. */ + if (STATEMENT_CODE_P (code)) + current_stmt_tree ()->stmts_are_full_exprs_p + = saved_stmts_are_full_exprs_p; + + return ret; +} + +static inline bool +is_invisiref_parm (const_tree t) +{ + return ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL) + && DECL_BY_REFERENCE (t)); +} + +/* Return true if the uid in both int tree maps are equal. */ + +int +cxx_int_tree_map_eq (const void *va, const void *vb) +{ + const struct cxx_int_tree_map *a = (const struct cxx_int_tree_map *) va; + const struct cxx_int_tree_map *b = (const struct cxx_int_tree_map *) vb; + return (a->uid == b->uid); +} + +/* Hash a UID in a cxx_int_tree_map. */ + +unsigned int +cxx_int_tree_map_hash (const void *item) +{ + return ((const struct cxx_int_tree_map *)item)->uid; +} + +/* A stable comparison routine for use with splay trees and DECLs. */ + +static int +splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb) +{ + tree a = (tree) xa; + tree b = (tree) xb; + + return DECL_UID (a) - DECL_UID (b); +} + +/* OpenMP context during genericization. */ + +struct cp_genericize_omp_taskreg +{ + bool is_parallel; + bool default_shared; + struct cp_genericize_omp_taskreg *outer; + splay_tree variables; +}; + +/* Return true if genericization should try to determine if + DECL is firstprivate or shared within task regions. */ + +static bool +omp_var_to_track (tree decl) +{ + tree type = TREE_TYPE (decl); + if (is_invisiref_parm (decl)) + type = TREE_TYPE (type); + while (TREE_CODE (type) == ARRAY_TYPE) + type = TREE_TYPE (type); + if (type == error_mark_node || !CLASS_TYPE_P (type)) + return false; + if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl)) + return false; + if (cxx_omp_predetermined_sharing (decl) != OMP_CLAUSE_DEFAULT_UNSPECIFIED) + return false; + return true; +} + +/* Note DECL use in OpenMP region OMP_CTX during genericization. */ + +static void +omp_cxx_notice_variable (struct cp_genericize_omp_taskreg *omp_ctx, tree decl) +{ + splay_tree_node n = splay_tree_lookup (omp_ctx->variables, + (splay_tree_key) decl); + if (n == NULL) + { + int flags = OMP_CLAUSE_DEFAULT_SHARED; + if (omp_ctx->outer) + omp_cxx_notice_variable (omp_ctx->outer, decl); + if (!omp_ctx->default_shared) + { + struct cp_genericize_omp_taskreg *octx; + + for (octx = omp_ctx->outer; octx; octx = octx->outer) + { + n = splay_tree_lookup (octx->variables, (splay_tree_key) decl); + if (n && n->value != OMP_CLAUSE_DEFAULT_SHARED) + { + flags = OMP_CLAUSE_DEFAULT_FIRSTPRIVATE; + break; + } + if (octx->is_parallel) + break; + } + if (octx == NULL + && (TREE_CODE (decl) == PARM_DECL + || (!(TREE_STATIC (decl) || DECL_EXTERNAL (decl)) + && DECL_CONTEXT (decl) == current_function_decl))) + flags = OMP_CLAUSE_DEFAULT_FIRSTPRIVATE; + if (flags == OMP_CLAUSE_DEFAULT_FIRSTPRIVATE) + { + /* DECL is implicitly determined firstprivate in + the current task construct. Ensure copy ctor and + dtor are instantiated, because during gimplification + it will be already too late. */ + tree type = TREE_TYPE (decl); + if (is_invisiref_parm (decl)) + type = TREE_TYPE (type); + while (TREE_CODE (type) == ARRAY_TYPE) + type = TREE_TYPE (type); + get_copy_ctor (type, tf_none); + get_dtor (type, tf_none); + } + } + splay_tree_insert (omp_ctx->variables, (splay_tree_key) decl, flags); + } +} + +/* Genericization context. */ + +struct cp_genericize_data +{ + struct pointer_set_t *p_set; + VEC (tree, heap) *bind_expr_stack; + struct cp_genericize_omp_taskreg *omp_ctx; +}; + +/* Perform any pre-gimplification lowering of C++ front end trees to + GENERIC. */ + +static tree +cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) +{ + tree stmt = *stmt_p; + struct cp_genericize_data *wtd = (struct cp_genericize_data *) data; + struct pointer_set_t *p_set = wtd->p_set; + + /* If in an OpenMP context, note var uses. */ + if (__builtin_expect (wtd->omp_ctx != NULL, 0) + && (TREE_CODE (stmt) == VAR_DECL + || TREE_CODE (stmt) == PARM_DECL + || TREE_CODE (stmt) == RESULT_DECL) + && omp_var_to_track (stmt)) + omp_cxx_notice_variable (wtd->omp_ctx, stmt); + + if (is_invisiref_parm (stmt) + /* Don't dereference parms in a thunk, pass the references through. */ + && !(DECL_THUNK_P (current_function_decl) + && TREE_CODE (stmt) == PARM_DECL)) + { + *stmt_p = convert_from_reference (stmt); + *walk_subtrees = 0; + return NULL; + } + + /* Map block scope extern declarations to visible declarations with the + same name and type in outer scopes if any. */ + if (cp_function_chain->extern_decl_map + && (TREE_CODE (stmt) == FUNCTION_DECL || TREE_CODE (stmt) == VAR_DECL) + && DECL_EXTERNAL (stmt)) + { + struct cxx_int_tree_map *h, in; + in.uid = DECL_UID (stmt); + h = (struct cxx_int_tree_map *) + htab_find_with_hash (cp_function_chain->extern_decl_map, + &in, in.uid); + if (h) + { + *stmt_p = h->to; + *walk_subtrees = 0; + return NULL; + } + } + + /* Other than invisiref parms, don't walk the same tree twice. */ + if (pointer_set_contains (p_set, stmt)) + { + *walk_subtrees = 0; + return NULL_TREE; + } + + if (TREE_CODE (stmt) == ADDR_EXPR + && is_invisiref_parm (TREE_OPERAND (stmt, 0))) + { + /* If in an OpenMP context, note var uses. */ + if (__builtin_expect (wtd->omp_ctx != NULL, 0) + && omp_var_to_track (TREE_OPERAND (stmt, 0))) + omp_cxx_notice_variable (wtd->omp_ctx, TREE_OPERAND (stmt, 0)); + *stmt_p = convert (TREE_TYPE (stmt), TREE_OPERAND (stmt, 0)); + *walk_subtrees = 0; + } + else if (TREE_CODE (stmt) == RETURN_EXPR + && TREE_OPERAND (stmt, 0) + && is_invisiref_parm (TREE_OPERAND (stmt, 0))) + /* Don't dereference an invisiref RESULT_DECL inside a RETURN_EXPR. */ + *walk_subtrees = 0; + else if (TREE_CODE (stmt) == OMP_CLAUSE) + switch (OMP_CLAUSE_CODE (stmt)) + { + case OMP_CLAUSE_LASTPRIVATE: + /* Don't dereference an invisiref in OpenMP clauses. */ + if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt))) + { + *walk_subtrees = 0; + if (OMP_CLAUSE_LASTPRIVATE_STMT (stmt)) + cp_walk_tree (&OMP_CLAUSE_LASTPRIVATE_STMT (stmt), + cp_genericize_r, data, NULL); + } + break; + case OMP_CLAUSE_PRIVATE: + /* Don't dereference an invisiref in OpenMP clauses. */ + if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt))) + *walk_subtrees = 0; + else if (wtd->omp_ctx != NULL) + { + /* Private clause doesn't cause any references to the + var in outer contexts, avoid calling + omp_cxx_notice_variable for it. */ + struct cp_genericize_omp_taskreg *old = wtd->omp_ctx; + wtd->omp_ctx = NULL; + cp_walk_tree (&OMP_CLAUSE_DECL (stmt), cp_genericize_r, + data, NULL); + wtd->omp_ctx = old; + *walk_subtrees = 0; + } + break; + case OMP_CLAUSE_SHARED: + case OMP_CLAUSE_FIRSTPRIVATE: + case OMP_CLAUSE_COPYIN: + case OMP_CLAUSE_COPYPRIVATE: + /* Don't dereference an invisiref in OpenMP clauses. */ + if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt))) + *walk_subtrees = 0; + break; + case OMP_CLAUSE_REDUCTION: + gcc_assert (!is_invisiref_parm (OMP_CLAUSE_DECL (stmt))); + break; + default: + break; + } + else if (IS_TYPE_OR_DECL_P (stmt)) + *walk_subtrees = 0; + + /* Due to the way voidify_wrapper_expr is written, we don't get a chance + to lower this construct before scanning it, so we need to lower these + before doing anything else. */ + else if (TREE_CODE (stmt) == CLEANUP_STMT) + *stmt_p = build2 (CLEANUP_EH_ONLY (stmt) ? TRY_CATCH_EXPR + : TRY_FINALLY_EXPR, + void_type_node, + CLEANUP_BODY (stmt), + CLEANUP_EXPR (stmt)); + + else if (TREE_CODE (stmt) == IF_STMT) + { + genericize_if_stmt (stmt_p); + /* *stmt_p has changed, tail recurse to handle it again. */ + return cp_genericize_r (stmt_p, walk_subtrees, data); + } + + /* COND_EXPR might have incompatible types in branches if one or both + arms are bitfields. Fix it up now. */ + else if (TREE_CODE (stmt) == COND_EXPR) + { + tree type_left + = (TREE_OPERAND (stmt, 1) + ? is_bitfield_expr_with_lowered_type (TREE_OPERAND (stmt, 1)) + : NULL_TREE); + tree type_right + = (TREE_OPERAND (stmt, 2) + ? is_bitfield_expr_with_lowered_type (TREE_OPERAND (stmt, 2)) + : NULL_TREE); + if (type_left + && !useless_type_conversion_p (TREE_TYPE (stmt), + TREE_TYPE (TREE_OPERAND (stmt, 1)))) + { + TREE_OPERAND (stmt, 1) + = fold_convert (type_left, TREE_OPERAND (stmt, 1)); + gcc_assert (useless_type_conversion_p (TREE_TYPE (stmt), + type_left)); + } + if (type_right + && !useless_type_conversion_p (TREE_TYPE (stmt), + TREE_TYPE (TREE_OPERAND (stmt, 2)))) + { + TREE_OPERAND (stmt, 2) + = fold_convert (type_right, TREE_OPERAND (stmt, 2)); + gcc_assert (useless_type_conversion_p (TREE_TYPE (stmt), + type_right)); + } + } + + else if (TREE_CODE (stmt) == BIND_EXPR) + { + if (__builtin_expect (wtd->omp_ctx != NULL, 0)) + { + tree decl; + for (decl = BIND_EXPR_VARS (stmt); decl; decl = DECL_CHAIN (decl)) + if (TREE_CODE (decl) == VAR_DECL + && !DECL_EXTERNAL (decl) + && omp_var_to_track (decl)) + { + splay_tree_node n + = splay_tree_lookup (wtd->omp_ctx->variables, + (splay_tree_key) decl); + if (n == NULL) + splay_tree_insert (wtd->omp_ctx->variables, + (splay_tree_key) decl, + TREE_STATIC (decl) + ? OMP_CLAUSE_DEFAULT_SHARED + : OMP_CLAUSE_DEFAULT_PRIVATE); + } + } + VEC_safe_push (tree, heap, wtd->bind_expr_stack, stmt); + cp_walk_tree (&BIND_EXPR_BODY (stmt), + cp_genericize_r, data, NULL); + VEC_pop (tree, wtd->bind_expr_stack); + } + + else if (TREE_CODE (stmt) == USING_STMT) + { + tree block = NULL_TREE; + + /* Get the innermost inclosing GIMPLE_BIND that has a non NULL + BLOCK, and append an IMPORTED_DECL to its + BLOCK_VARS chained list. */ + if (wtd->bind_expr_stack) + { + int i; + for (i = VEC_length (tree, wtd->bind_expr_stack) - 1; i >= 0; i--) + if ((block = BIND_EXPR_BLOCK (VEC_index (tree, + wtd->bind_expr_stack, i)))) + break; + } + if (block) + { + tree using_directive; + gcc_assert (TREE_OPERAND (stmt, 0)); + + using_directive = make_node (IMPORTED_DECL); + TREE_TYPE (using_directive) = void_type_node; + + IMPORTED_DECL_ASSOCIATED_DECL (using_directive) + = TREE_OPERAND (stmt, 0); + DECL_CHAIN (using_directive) = BLOCK_VARS (block); + BLOCK_VARS (block) = using_directive; + } + /* The USING_STMT won't appear in GENERIC. */ + *stmt_p = build1 (NOP_EXPR, void_type_node, integer_zero_node); + *walk_subtrees = 0; + } + + else if (TREE_CODE (stmt) == DECL_EXPR + && TREE_CODE (DECL_EXPR_DECL (stmt)) == USING_DECL) + { + /* Using decls inside DECL_EXPRs are just dropped on the floor. */ + *stmt_p = build1 (NOP_EXPR, void_type_node, integer_zero_node); + *walk_subtrees = 0; + } + else if (TREE_CODE (stmt) == OMP_PARALLEL || TREE_CODE (stmt) == OMP_TASK) + { + struct cp_genericize_omp_taskreg omp_ctx; + tree c, decl; + splay_tree_node n; + + *walk_subtrees = 0; + cp_walk_tree (&OMP_CLAUSES (stmt), cp_genericize_r, data, NULL); + omp_ctx.is_parallel = TREE_CODE (stmt) == OMP_PARALLEL; + omp_ctx.default_shared = omp_ctx.is_parallel; + omp_ctx.outer = wtd->omp_ctx; + omp_ctx.variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0); + wtd->omp_ctx = &omp_ctx; + for (c = OMP_CLAUSES (stmt); c; c = OMP_CLAUSE_CHAIN (c)) + switch (OMP_CLAUSE_CODE (c)) + { + case OMP_CLAUSE_SHARED: + case OMP_CLAUSE_PRIVATE: + case OMP_CLAUSE_FIRSTPRIVATE: + case OMP_CLAUSE_LASTPRIVATE: + decl = OMP_CLAUSE_DECL (c); + if (decl == error_mark_node || !omp_var_to_track (decl)) + break; + n = splay_tree_lookup (omp_ctx.variables, (splay_tree_key) decl); + if (n != NULL) + break; + splay_tree_insert (omp_ctx.variables, (splay_tree_key) decl, + OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED + ? OMP_CLAUSE_DEFAULT_SHARED + : OMP_CLAUSE_DEFAULT_PRIVATE); + if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_PRIVATE + && omp_ctx.outer) + omp_cxx_notice_variable (omp_ctx.outer, decl); + break; + case OMP_CLAUSE_DEFAULT: + if (OMP_CLAUSE_DEFAULT_KIND (c) == OMP_CLAUSE_DEFAULT_SHARED) + omp_ctx.default_shared = true; + default: + break; + } + cp_walk_tree (&OMP_BODY (stmt), cp_genericize_r, data, NULL); + wtd->omp_ctx = omp_ctx.outer; + splay_tree_delete (omp_ctx.variables); + } + + pointer_set_insert (p_set, *stmt_p); + + return NULL; +} + +void +cp_genericize (tree fndecl) +{ + tree t; + struct cp_genericize_data wtd; + + /* Fix up the types of parms passed by invisible reference. */ + for (t = DECL_ARGUMENTS (fndecl); t; t = DECL_CHAIN (t)) + if (TREE_ADDRESSABLE (TREE_TYPE (t))) + { + /* If a function's arguments are copied to create a thunk, + then DECL_BY_REFERENCE will be set -- but the type of the + argument will be a pointer type, so we will never get + here. */ + gcc_assert (!DECL_BY_REFERENCE (t)); + gcc_assert (DECL_ARG_TYPE (t) != TREE_TYPE (t)); + TREE_TYPE (t) = DECL_ARG_TYPE (t); + DECL_BY_REFERENCE (t) = 1; + TREE_ADDRESSABLE (t) = 0; + relayout_decl (t); + } + + /* Do the same for the return value. */ + if (TREE_ADDRESSABLE (TREE_TYPE (DECL_RESULT (fndecl)))) + { + t = DECL_RESULT (fndecl); + TREE_TYPE (t) = build_reference_type (TREE_TYPE (t)); + DECL_BY_REFERENCE (t) = 1; + TREE_ADDRESSABLE (t) = 0; + relayout_decl (t); + if (DECL_NAME (t)) + { + /* Adjust DECL_VALUE_EXPR of the original var. */ + tree outer = outer_curly_brace_block (current_function_decl); + tree var; + + if (outer) + for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var)) + if (DECL_NAME (t) == DECL_NAME (var) + && DECL_HAS_VALUE_EXPR_P (var) + && DECL_VALUE_EXPR (var) == t) + { + tree val = convert_from_reference (t); + SET_DECL_VALUE_EXPR (var, val); + break; + } + } + } + + /* If we're a clone, the body is already GIMPLE. */ + if (DECL_CLONED_FUNCTION_P (fndecl)) + return; + + /* We do want to see every occurrence of the parms, so we can't just use + walk_tree's hash functionality. */ + wtd.p_set = pointer_set_create (); + wtd.bind_expr_stack = NULL; + wtd.omp_ctx = NULL; + cp_walk_tree (&DECL_SAVED_TREE (fndecl), cp_genericize_r, &wtd, NULL); + pointer_set_destroy (wtd.p_set); + VEC_free (tree, heap, wtd.bind_expr_stack); + + /* Do everything else. */ + c_genericize (fndecl); + + gcc_assert (bc_label[bc_break] == NULL); + gcc_assert (bc_label[bc_continue] == NULL); +} + +/* Build code to apply FN to each member of ARG1 and ARG2. FN may be + NULL if there is in fact nothing to do. ARG2 may be null if FN + actually only takes one argument. */ + +static tree +cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2) +{ + tree defparm, parm, t; + int i = 0; + int nargs; + tree *argarray; + + if (fn == NULL) + return NULL; + + nargs = list_length (DECL_ARGUMENTS (fn)); + argarray = XALLOCAVEC (tree, nargs); + + defparm = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn))); + if (arg2) + defparm = TREE_CHAIN (defparm); + + if (TREE_CODE (TREE_TYPE (arg1)) == ARRAY_TYPE) + { + tree inner_type = TREE_TYPE (arg1); + tree start1, end1, p1; + tree start2 = NULL, p2 = NULL; + tree ret = NULL, lab; + + start1 = arg1; + start2 = arg2; + do + { + inner_type = TREE_TYPE (inner_type); + start1 = build4 (ARRAY_REF, inner_type, start1, + size_zero_node, NULL, NULL); + if (arg2) + start2 = build4 (ARRAY_REF, inner_type, start2, + size_zero_node, NULL, NULL); + } + while (TREE_CODE (inner_type) == ARRAY_TYPE); + start1 = build_fold_addr_expr_loc (input_location, start1); + if (arg2) + start2 = build_fold_addr_expr_loc (input_location, start2); + + end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1)); + end1 = build2 (POINTER_PLUS_EXPR, TREE_TYPE (start1), start1, end1); + + p1 = create_tmp_var (TREE_TYPE (start1), NULL); + t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1); + append_to_statement_list (t, &ret); + + if (arg2) + { + p2 = create_tmp_var (TREE_TYPE (start2), NULL); + t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, start2); + append_to_statement_list (t, &ret); + } + + lab = create_artificial_label (input_location); + t = build1 (LABEL_EXPR, void_type_node, lab); + append_to_statement_list (t, &ret); + + argarray[i++] = p1; + if (arg2) + argarray[i++] = p2; + /* Handle default arguments. */ + for (parm = defparm; parm && parm != void_list_node; + parm = TREE_CHAIN (parm), i++) + argarray[i] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), fn, i); + t = build_call_a (fn, i, argarray); + t = fold_convert (void_type_node, t); + t = fold_build_cleanup_point_expr (TREE_TYPE (t), t); + append_to_statement_list (t, &ret); + + t = TYPE_SIZE_UNIT (inner_type); + t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p1), p1, t); + t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t); + append_to_statement_list (t, &ret); + + if (arg2) + { + t = TYPE_SIZE_UNIT (inner_type); + t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p2), p2, t); + t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t); + append_to_statement_list (t, &ret); + } + + t = build2 (NE_EXPR, boolean_type_node, p1, end1); + t = build3 (COND_EXPR, void_type_node, t, build_and_jump (&lab), NULL); + append_to_statement_list (t, &ret); + + return ret; + } + else + { + argarray[i++] = build_fold_addr_expr_loc (input_location, arg1); + if (arg2) + argarray[i++] = build_fold_addr_expr_loc (input_location, arg2); + /* Handle default arguments. */ + for (parm = defparm; parm && parm != void_list_node; + parm = TREE_CHAIN (parm), i++) + argarray[i] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), + fn, i); + t = build_call_a (fn, i, argarray); + t = fold_convert (void_type_node, t); + return fold_build_cleanup_point_expr (TREE_TYPE (t), t); + } +} + +/* Return code to initialize DECL with its default constructor, or + NULL if there's nothing to do. */ + +tree +cxx_omp_clause_default_ctor (tree clause, tree decl, + tree outer ATTRIBUTE_UNUSED) +{ + tree info = CP_OMP_CLAUSE_INFO (clause); + tree ret = NULL; + + if (info) + ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 0), decl, NULL); + + return ret; +} + +/* Return code to initialize DST with a copy constructor from SRC. */ + +tree +cxx_omp_clause_copy_ctor (tree clause, tree dst, tree src) +{ + tree info = CP_OMP_CLAUSE_INFO (clause); + tree ret = NULL; + + if (info) + ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 0), dst, src); + if (ret == NULL) + ret = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); + + return ret; +} + +/* Similarly, except use an assignment operator instead. */ + +tree +cxx_omp_clause_assign_op (tree clause, tree dst, tree src) +{ + tree info = CP_OMP_CLAUSE_INFO (clause); + tree ret = NULL; + + if (info) + ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 2), dst, src); + if (ret == NULL) + ret = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src); + + return ret; +} + +/* Return code to destroy DECL. */ + +tree +cxx_omp_clause_dtor (tree clause, tree decl) +{ + tree info = CP_OMP_CLAUSE_INFO (clause); + tree ret = NULL; + + if (info) + ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 1), decl, NULL); + + return ret; +} + +/* True if OpenMP should privatize what this DECL points to rather + than the DECL itself. */ + +bool +cxx_omp_privatize_by_reference (const_tree decl) +{ + return is_invisiref_parm (decl); +} + +/* True if OpenMP sharing attribute of DECL is predetermined. */ + +enum omp_clause_default_kind +cxx_omp_predetermined_sharing (tree decl) +{ + tree type; + + /* Static data members are predetermined as shared. */ + if (TREE_STATIC (decl)) + { + tree ctx = CP_DECL_CONTEXT (decl); + if (TYPE_P (ctx) && MAYBE_CLASS_TYPE_P (ctx)) + return OMP_CLAUSE_DEFAULT_SHARED; + } + + type = TREE_TYPE (decl); + if (TREE_CODE (type) == REFERENCE_TYPE) + { + if (!is_invisiref_parm (decl)) + return OMP_CLAUSE_DEFAULT_UNSPECIFIED; + type = TREE_TYPE (type); + + if (TREE_CODE (decl) == RESULT_DECL && DECL_NAME (decl)) + { + /* NVR doesn't preserve const qualification of the + variable's type. */ + tree outer = outer_curly_brace_block (current_function_decl); + tree var; + + if (outer) + for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var)) + if (DECL_NAME (decl) == DECL_NAME (var) + && (TYPE_MAIN_VARIANT (type) + == TYPE_MAIN_VARIANT (TREE_TYPE (var)))) + { + if (TYPE_READONLY (TREE_TYPE (var))) + type = TREE_TYPE (var); + break; + } + } + } + + if (type == error_mark_node) + return OMP_CLAUSE_DEFAULT_UNSPECIFIED; + + /* Variables with const-qualified type having no mutable member + are predetermined shared. */ + if (TYPE_READONLY (type) && !cp_has_mutable_p (type)) + return OMP_CLAUSE_DEFAULT_SHARED; + + return OMP_CLAUSE_DEFAULT_UNSPECIFIED; +} + +/* Finalize an implicitly determined clause. */ + +void +cxx_omp_finish_clause (tree c) +{ + tree decl, inner_type; + bool make_shared = false; + + if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_FIRSTPRIVATE) + return; + + decl = OMP_CLAUSE_DECL (c); + decl = require_complete_type (decl); + inner_type = TREE_TYPE (decl); + if (decl == error_mark_node) + make_shared = true; + else if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE) + { + if (is_invisiref_parm (decl)) + inner_type = TREE_TYPE (inner_type); + else + { + error ("%qE implicitly determined as % has reference type", + decl); + make_shared = true; + } + } + + /* We're interested in the base element, not arrays. */ + while (TREE_CODE (inner_type) == ARRAY_TYPE) + inner_type = TREE_TYPE (inner_type); + + /* Check for special function availability by building a call to one. + Save the results, because later we won't be in the right context + for making these queries. */ + if (!make_shared + && CLASS_TYPE_P (inner_type) + && cxx_omp_create_clause_info (c, inner_type, false, true, false)) + make_shared = true; + + if (make_shared) + OMP_CLAUSE_CODE (c) = OMP_CLAUSE_SHARED; +} diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c new file mode 100644 index 000000000..e5c1c0911 --- /dev/null +++ b/gcc/cp/cp-lang.c @@ -0,0 +1,242 @@ +/* Language-dependent hooks for C++. + Copyright 2001, 2002, 2004, 2007, 2008, 2009, 2010 + 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 3, 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 COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "c-family/c-common.h" +#include "langhooks.h" +#include "langhooks-def.h" +#include "debug.h" +#include "cp-objcp-common.h" +#include "hashtab.h" +#include "target.h" + +enum c_language_kind c_language = clk_cxx; +static void cp_init_ts (void); +static const char * cxx_dwarf_name (tree t, int verbosity); +static enum classify_record cp_classify_record (tree type); +static tree cp_eh_personality (void); +static tree get_template_innermost_arguments_folded (const_tree); +static tree get_template_argument_pack_elems_folded (const_tree); + +/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h; + consequently, there should be very few hooks below. */ + +#undef LANG_HOOKS_NAME +#define LANG_HOOKS_NAME "GNU C++" +#undef LANG_HOOKS_INIT +#define LANG_HOOKS_INIT cxx_init +#undef LANG_HOOKS_CLASSIFY_RECORD +#define LANG_HOOKS_CLASSIFY_RECORD cp_classify_record +#undef LANG_HOOKS_GENERIC_TYPE_P +#define LANG_HOOKS_GENERIC_TYPE_P class_tmpl_impl_spec_p + +#undef LANG_HOOKS_GET_INNERMOST_GENERIC_PARMS +#define LANG_HOOKS_GET_INNERMOST_GENERIC_PARMS \ + get_primary_template_innermost_parameters +#undef LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS +#define LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS \ + get_template_innermost_arguments_folded +#undef LANG_HOOKS_FUNCTION_PARAMETER_PACK_P +#define LANG_HOOKS_FUNCTION_PARAMETER_PACK_P \ + function_parameter_pack_p +#undef LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS +#define LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS \ + get_template_argument_pack_elems_folded +#undef LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P +#define LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P \ + template_template_parameter_p +#undef LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P +#define LANG_HOOKS_FUNCTION_PARM_EXPANDED_FROM_PACK_P \ + function_parameter_expanded_from_pack_p +#undef LANG_HOOKS_GET_GENERIC_FUNCTION_DECL +#define LANG_HOOKS_GET_GENERIC_FUNCTION_DECL get_function_template_decl +#undef LANG_HOOKS_DWARF_NAME +#define LANG_HOOKS_DWARF_NAME cxx_dwarf_name +#undef LANG_HOOKS_INIT_TS +#define LANG_HOOKS_INIT_TS cp_init_ts +#undef LANG_HOOKS_EH_PERSONALITY +#define LANG_HOOKS_EH_PERSONALITY cp_eh_personality +#undef LANG_HOOKS_EH_RUNTIME_TYPE +#define LANG_HOOKS_EH_RUNTIME_TYPE build_eh_type_type + +/* Each front end provides its own lang hook initializer. */ +struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; + +/* Lang hook routines common to C++ and ObjC++ appear in cp/cp-objcp-common.c; + there should be very few routines below. */ + +/* The following function does something real, but only in Objective-C++. */ + +tree +objcp_tsubst_copy_and_build (tree t ATTRIBUTE_UNUSED, + tree args ATTRIBUTE_UNUSED, + tsubst_flags_t complain ATTRIBUTE_UNUSED, + tree in_decl ATTRIBUTE_UNUSED, + bool function_p ATTRIBUTE_UNUSED) +{ + return NULL_TREE; +} + + +static void +cp_init_ts (void) +{ + tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] = 1; + tree_contains_struct[USING_DECL][TS_DECL_NON_COMMON] = 1; + tree_contains_struct[TEMPLATE_DECL][TS_DECL_NON_COMMON] = 1; + + tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] = 1; + tree_contains_struct[USING_DECL][TS_DECL_WITH_VIS] = 1; + tree_contains_struct[TEMPLATE_DECL][TS_DECL_WITH_VIS] = 1; + + tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[USING_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[TEMPLATE_DECL][TS_DECL_WRTL] = 1; + + tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[USING_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[TEMPLATE_DECL][TS_DECL_COMMON] = 1; + + tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[USING_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[TEMPLATE_DECL][TS_DECL_MINIMAL] = 1; + + init_shadowed_var_for_decl (); + +} + +static const char * +cxx_dwarf_name (tree t, int verbosity) +{ + gcc_assert (DECL_P (t)); + + if (DECL_NAME (t) + && (ANON_AGGRNAME_P (DECL_NAME (t)) || LAMBDANAME_P (DECL_NAME (t)))) + return NULL; + if (verbosity >= 2) + return decl_as_string (t, + TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME + | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS); + + return cxx_printable_name (t, verbosity); +} + +static enum classify_record +cp_classify_record (tree type) +{ + if (CLASSTYPE_DECLARED_CLASS (type)) + return RECORD_IS_CLASS; + + return RECORD_IS_STRUCT; +} + +static GTY(()) tree cp_eh_personality_decl; + +static tree +cp_eh_personality (void) +{ + if (!cp_eh_personality_decl) + { + const char *lang = (pragma_java_exceptions ? "gcj" : "gxx"); + cp_eh_personality_decl = build_personality_function (lang); + } + + return cp_eh_personality_decl; +} + +/* This is a subroutine of fold_cplus_constants. It returns TRUE if T + is a C++ specific constant that needs to be folded further before + being passed to the debug info emitter. */ + +static bool +template_arg_needs_folding (const_tree t) +{ + /* For now only PTRMEM_CST nodes are to be folded further. */ + if (TREE_CODE (t) == PTRMEM_CST) + return true; + return false; +} + +/* Fold the elements of the TREE_VEC C which are C++ specific nodes + that would need folding so that they can be processed by the debug + info emitter. This is a subroutine of + get_template_innermost_arguments_folded and + get_template_argument_pack_elems_folded. */ + +static tree +fold_cplus_constants (const_tree c) +{ + tree folded_elems, elems = CONST_CAST_TREE (c); + int vec_len, i; + + if (elems == NULL_TREE || elems == error_mark_node) + return elems; + + vec_len = TREE_VEC_LENGTH (elems); + + /* First check if there is at least one element that needs + folding. If there is none, we just return ELEMS. Otherwise create + and return a new tree vector that contains the folded versions of + ELEMS. This is to avoid allocating memory if we don't need + to. */ + for (i = 0; i < vec_len; ++i) + { + if (template_arg_needs_folding (TREE_VEC_ELT (elems, i))) + break; + } + if (i == vec_len) + return elems; + + folded_elems = make_tree_vec (vec_len); + for (i = 0; i < vec_len; ++i) + { + tree elem = TREE_VEC_ELT (elems, i); + TREE_VEC_ELT (folded_elems, i) = + (elem && !TYPE_P (elem)) ? cplus_expand_constant (elem) : elem; + + } + return folded_elems; +} + +/* The C++ implementation of the LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS + hook. It returns the innermost template arguments of type T, and + makes sure those arguments are folded enough for the debug info + emitter. */ + +static tree +get_template_innermost_arguments_folded (const_tree t) +{ + return fold_cplus_constants (get_template_innermost_arguments (t)); +} + +static tree +get_template_argument_pack_elems_folded (const_tree t) +{ + return fold_cplus_constants (get_template_argument_pack_elems (t)); +} + +#include "gt-cp-cp-lang.h" +#include "gtype-cp.h" diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c new file mode 100644 index 000000000..f045d290e --- /dev/null +++ b/gcc/cp/cp-objcp-common.c @@ -0,0 +1,226 @@ +/* Some code common to C++ and ObjC++ front ends. + Copyright (C) 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Contributed by Ziemowit Laski + +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 3, 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 COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "c-family/c-common.h" +#include "langhooks.h" +#include "langhooks-def.h" +#include "diagnostic.h" +#include "debug.h" +#include "cxx-pretty-print.h" +#include "cp-objcp-common.h" + +/* Special routine to get the alias set for C++. */ + +alias_set_type +cxx_get_alias_set (tree t) +{ + if (IS_FAKE_BASE_TYPE (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)); + + /* Punt on PMFs until we canonicalize functions properly. */ + if (TYPE_PTRMEMFUNC_P (t) + || (POINTER_TYPE_P (t) + && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))) + return 0; + + return c_common_get_alias_set (t); +} + +/* Called from check_global_declarations. */ + +bool +cxx_warn_unused_global_decl (const_tree decl) +{ + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) + return false; + if (DECL_IN_SYSTEM_HEADER (decl)) + return false; + + /* Const variables take the place of #defines in C++. */ + if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)) + return false; + + return true; +} + +/* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */ +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 STATIC_ASSERT: return sizeof (struct tree_static_assert); + case TYPE_ARGUMENT_PACK: + case TYPE_PACK_EXPANSION: + return sizeof (struct tree_common); + + case NONTYPE_ARGUMENT_PACK: + case EXPR_PACK_EXPANSION: + return sizeof (struct tree_exp); + + case ARGUMENT_PACK_SELECT: + return sizeof (struct tree_argument_pack_select); + + case TRAIT_EXPR: + return sizeof (struct tree_trait_expr); + + case LAMBDA_EXPR: return sizeof (struct tree_lambda_expr); + + case TEMPLATE_INFO: return sizeof (struct tree_template_info); + + default: + gcc_unreachable (); + } + /* NOTREACHED */ +} + +/* Returns true if T is a variably modified type, in the sense of C99. + FN is as passed to variably_modified_p. + This routine needs only check cases that cannot be handled by the + language-independent logic in tree.c. */ + +bool +cp_var_mod_type_p (tree type, tree fn) +{ + /* 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), fn) + || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type), + fn)); + + /* All other types are not variably modified. */ + return false; +} + +/* Construct a C++-aware pretty-printer for CONTEXT. It is assumed + that CONTEXT->printer is an already constructed basic pretty_printer. */ +void +cxx_initialize_diagnostics (diagnostic_context *context) +{ + pretty_printer *base; + cxx_pretty_printer *pp; + + c_common_initialize_diagnostics (context); + + base = context->printer; + pp = XNEW (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); +} + +/* This compares two types for equivalence ("compatible" in C-based languages). + This routine should only return 1 if it is sure. It should not be used + in contexts where erroneously returning 0 causes problems. */ + +int +cxx_types_compatible_p (tree x, tree y) +{ + return same_type_ignoring_top_level_qualifiers_p (x, y); +} + +/* Return true if DECL is explicit member function. */ + +bool +cp_function_decl_explicit_p (tree decl) +{ + return (decl + && FUNCTION_FIRST_USER_PARMTYPE (decl) != void_list_node + && DECL_NONCONVERTING_P (decl)); +} + +/* Stubs to keep c-opts.c happy. */ +void +push_file_scope (void) +{ +} + +void +pop_file_scope (void) +{ +} + +/* c-pragma.c needs to query whether a decl has extern "C" linkage. */ +bool +has_c_linkage (const_tree decl) +{ + return DECL_EXTERN_C_P (decl); +} + +static GTY ((if_marked ("tree_decl_map_marked_p"), param_is (struct tree_decl_map))) + htab_t shadowed_var_for_decl; + +/* Lookup a shadowed var for FROM, and return it if we find one. */ + +tree +decl_shadowed_for_var_lookup (tree from) +{ + struct tree_decl_map *h, in; + in.base.from = from; + + h = (struct tree_decl_map *) + htab_find_with_hash (shadowed_var_for_decl, &in, DECL_UID (from)); + if (h) + return h->to; + return NULL_TREE; +} + +/* Insert a mapping FROM->TO in the shadowed var hashtable. */ + +void +decl_shadowed_for_var_insert (tree from, tree to) +{ + struct tree_decl_map *h; + void **loc; + + h = ggc_alloc_tree_decl_map (); + h->base.from = from; + h->to = to; + loc = htab_find_slot_with_hash (shadowed_var_for_decl, h, DECL_UID (from), + INSERT); + *(struct tree_decl_map **) loc = h; +} + +void +init_shadowed_var_for_decl (void) +{ + shadowed_var_for_decl = htab_create_ggc (512, tree_decl_map_hash, + tree_decl_map_eq, 0); +} + + +#include "gt-cp-cp-objcp-common.h" diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h new file mode 100644 index 000000000..38da59e00 --- /dev/null +++ b/gcc/cp/cp-objcp-common.h @@ -0,0 +1,156 @@ +/* Language hooks common to C++ and ObjC++ front ends. + Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. + Contributed by Ziemowit Laski + +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 3, 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 COPYING3. If not see +. */ + +#ifndef GCC_CP_OBJCP_COMMON +#define GCC_CP_OBJCP_COMMON + +/* In cp/cp-lang.c and objcp/objcp-lang.c. */ + +extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t, + tree, bool); + +extern bool cp_function_decl_explicit_p (tree decl); + +/* Lang hooks that are shared between C++ and ObjC++ are defined here. Hooks + specific to C++ or ObjC++ go in cp/cp-lang.c and objcp/objcp-lang.c, + respectively. */ + +#undef LANG_HOOKS_FREE_LANG_DATA +#define LANG_HOOKS_FREE_LANG_DATA cp_free_lang_data +#undef LANG_HOOKS_TREE_SIZE +#define LANG_HOOKS_TREE_SIZE cp_tree_size +#undef LANG_HOOKS_FINISH +#define LANG_HOOKS_FINISH cxx_finish +#undef LANG_HOOKS_CLEAR_BINDING_STACK +#define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything +#undef LANG_HOOKS_OPTION_LANG_MASK +#define LANG_HOOKS_OPTION_LANG_MASK c_common_option_lang_mask +#undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P +#define LANG_HOOKS_COMPLAIN_WRONG_LANG_P c_common_complain_wrong_lang_p +#undef LANG_HOOKS_INIT_OPTIONS_STRUCT +#define LANG_HOOKS_INIT_OPTIONS_STRUCT c_common_init_options_struct +#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_POST_OPTIONS +#define LANG_HOOKS_POST_OPTIONS c_common_post_options +#undef LANG_HOOKS_GET_ALIAS_SET +#define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set +#undef LANG_HOOKS_PARSE_FILE +#define LANG_HOOKS_PARSE_FILE c_common_parse_file +#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL +#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl +#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME +#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME mangle_decl +#undef LANG_HOOKS_PRINT_STATISTICS +#define LANG_HOOKS_PRINT_STATISTICS cxx_print_statistics +#undef LANG_HOOKS_PRINT_XNODE +#define LANG_HOOKS_PRINT_XNODE cxx_print_xnode +#undef LANG_HOOKS_DECL_PRINTABLE_NAME +#define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name +#undef LANG_HOOKS_PRINT_DECL +#define LANG_HOOKS_PRINT_DECL cxx_print_decl +#undef LANG_HOOKS_PRINT_TYPE +#define LANG_HOOKS_PRINT_TYPE cxx_print_type +#undef LANG_HOOKS_PRINT_IDENTIFIER +#define LANG_HOOKS_PRINT_IDENTIFIER cxx_print_identifier +#undef LANG_HOOKS_TYPES_COMPATIBLE_P +#define LANG_HOOKS_TYPES_COMPATIBLE_P cxx_types_compatible_p +#undef LANG_HOOKS_PRINT_ERROR_FUNCTION +#define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function +#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 cp_write_global_declarations +#undef LANG_HOOKS_BUILTIN_FUNCTION +#define LANG_HOOKS_BUILTIN_FUNCTION cxx_builtin_function +#undef LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE +#define LANG_HOOKS_BUILTIN_FUNCTION_EXT_SCOPE cxx_builtin_function_ext_scope +#undef LANG_HOOKS_TYPE_HASH_EQ +#define LANG_HOOKS_TYPE_HASH_EQ cxx_type_hash_eq +#undef LANG_HOOKS_MISSING_NORETURN_OK_P +#define LANG_HOOKS_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p + +/* Attribute hooks. */ +#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE +#define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table +#undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE +#define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table +#undef LANG_HOOKS_ATTRIBUTE_TABLE +#define LANG_HOOKS_ATTRIBUTE_TABLE cxx_attribute_table + +#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_DUMP_DUMP_TREE_FN +#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree +#undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN +#define LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN cp_type_quals + +#undef LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR +#define LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR cxx_callgraph_analyze_expr + +#undef LANG_HOOKS_MAKE_TYPE +#define LANG_HOOKS_MAKE_TYPE cxx_make_type +#undef LANG_HOOKS_TYPE_FOR_MODE +#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode +#undef LANG_HOOKS_TYPE_FOR_SIZE +#define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size +#undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR +#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 +#undef LANG_HOOKS_RECONSTRUCT_COMPLEX_TYPE +#define LANG_HOOKS_RECONSTRUCT_COMPLEX_TYPE cp_reconstruct_complex_type +#undef LANG_HOOKS_TO_TARGET_CHARSET +#define LANG_HOOKS_TO_TARGET_CHARSET c_common_to_target_charset +#undef LANG_HOOKS_GIMPLIFY_EXPR +#define LANG_HOOKS_GIMPLIFY_EXPR cp_gimplify_expr +#undef LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P +#define LANG_HOOKS_FUNCTION_DECL_EXPLICIT_P cp_function_decl_explicit_p +#undef LANG_HOOKS_OMP_PREDETERMINED_SHARING +#define LANG_HOOKS_OMP_PREDETERMINED_SHARING cxx_omp_predetermined_sharing +#undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR +#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR cxx_omp_clause_default_ctor +#undef LANG_HOOKS_OMP_CLAUSE_COPY_CTOR +#define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR cxx_omp_clause_copy_ctor +#undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP +#define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP cxx_omp_clause_assign_op +#undef LANG_HOOKS_OMP_CLAUSE_DTOR +#define LANG_HOOKS_OMP_CLAUSE_DTOR cxx_omp_clause_dtor +#undef LANG_HOOKS_OMP_FINISH_CLAUSE +#define LANG_HOOKS_OMP_FINISH_CLAUSE cxx_omp_finish_clause +#undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE +#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE cxx_omp_privatize_by_reference + +#undef LANG_HOOKS_EH_USE_CXA_END_CLEANUP +#define LANG_HOOKS_EH_USE_CXA_END_CLEANUP true + +#undef LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS +#define LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS cp_protect_cleanup_actions + +#endif /* GCC_CP_OBJCP_COMMON */ diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def new file mode 100644 index 000000000..509d5e7ee --- /dev/null +++ b/gcc/cp/cp-tree.def @@ -0,0 +1,466 @@ +/* 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, 2004, 2005, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2010 + 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 3, 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 COPYING3. If not see +. */ + + +/* 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 is not + taken. + + 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", tcc_reference, 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", tcc_constant, 0) + +/* For NEW_EXPR, operand 0 is the placement list. + Operand 1 is the new-declarator. + Operand 2 is the number of elements in the array. + Operand 3 is the initializer. */ +DEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4) +DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3) + +/* For DELETE_EXPR, operand 0 is the store to be destroyed. + Operand 1 is the value to pass to the destroying function + saying whether the store should be deallocated as well. */ +DEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2) +DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 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", tcc_reference, 2) + +/* When composing an object with a member, this is the result. + Operand 0 is the object. Operand 1 is the member (usually + a dereferenced pointer to member). */ +DEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2) + +/* Type conversion operator in C++. TREE_TYPE is type that this + operator converts to. Operand is expression to be converted. */ +DEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1) + +/* AGGR_INIT_EXPRs have a variably-sized representation similar to + that of CALL_EXPRs. Operand 0 is an INTEGER_CST node containing the + operand count, operand 1 is the function which performs initialization, + operand 2 is the slot which was allocated for this expression, and + the remaining operands are the arguments to the initialization function. */ +DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_vl_exp, 3) + +/* Initialization of an array from another array, expressed at a high level + so that it works with TARGET_EXPR. Operand 0 is the target, operand 1 + is the initializer. */ +DEFTREECODE (VEC_INIT_EXPR, "vec_init_expr", tcc_expression, 2) + +/* A throw expression. operand 0 is the expression, if there was one, + else it is NULL_TREE. */ +DEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1) + +/* An empty class object. The TREE_TYPE gives the class type. We use + these to avoid actually creating instances of the empty classes. */ +DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 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 + functions. BASELINK_BINFO gives the base from which the functions + come, i.e., the base to which the `this' pointer must be converted + before the functions are called. BASELINK_ACCESS_BINFO gives the + base used to name the functions. + + A BASELINK is an expression; the TREE_TYPE of the BASELINK gives + 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", tcc_exceptional, 0) + +/* Template definition. The following fields have the specified uses, + although there are other macros in cp-tree.h that should be used for + accessing this data. + DECL_ARGUMENTS template parm vector + DECL_TEMPLATE_INFO template text &c + DECL_VINDEX list of instantiations already produced; + only done for functions so far + For class template: + DECL_INITIAL associated templates (methods &c) + DECL_TEMPLATE_RESULT null + For non-class templates: + TREE_TYPE type of object to be constructed + DECL_TEMPLATE_RESULT decl for object to be created + (e.g., FUNCTION_DECL with tmpl parms used) + */ +DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0) + +/* Index into a template parameter list. The TEMPLATE_PARM_IDX gives + the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL + gives the level (from 1) of the parameter. + + Here's an example: + + template // Index 0, Level 1. + struct S + { + template // Index 1, Level 2. + void f(); + }; + + The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended + from this one. The first descendant will have the same IDX, but + its LEVEL will be one less. The TREE_CHAIN field is used to chain + together the descendants. The TEMPLATE_PARM_DECL is the + declaration of this parameter, either a TYPE_DECL or CONST_DECL. + The TEMPLATE_PARM_ORIG_LEVEL is the LEVEL of the most distant + parent, i.e., the LEVEL that the parameter originally had when it + was declared. For example, if we instantiate S, we will have: + + struct S + { + template // Index 1, Level 1, Orig Level 2 + void f(); + }; + + 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", tcc_exceptional, 0) + +/* Index into a template parameter list for template template parameters. + This parameter must be a type. The TYPE_FIELDS value will be a + TEMPLATE_PARM_INDEX. + + It is used without template arguments like TT in C, + TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE + and TYPE_NAME is a TEMPLATE_DECL. */ +DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0) + +/* The ordering of the following codes is optimized for the checking + macros in tree.h. Changing the order will degrade the speed of the + compiler. TEMPLATE_TYPE_PARM, TYPENAME_TYPE, TYPEOF_TYPE, + BOUND_TEMPLATE_TEMPLATE_PARM. */ + +/* Index into a template parameter list. This parameter must be a type. + The type.values field will be a TEMPLATE_PARM_INDEX. */ +DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0) + +/* A type designated by `typename T::t'. TYPE_CONTEXT is `T', + TYPE_NAME is an IDENTIFIER_NODE for `t'. If the type was named via + template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR. + TREE_TYPE is always NULL. */ +DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0) + +/* A type designated by `__typeof (expr)'. TYPEOF_TYPE_EXPR is the + expression in question. */ +DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0) + +/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments + like TT. + In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the + template name and its bound arguments. TYPE_NAME is a TYPE_DECL. */ +DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", + tcc_type, 0) + +/* For template template argument of the form `T::template C'. + TYPE_CONTEXT is `T', the template parameter dependent object. + TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template. */ +DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0) + +/* A using declaration. USING_DECL_SCOPE contains the specified + scope. In a member using decl, unless DECL_DEPENDENT_P is true, + USING_DECL_DECLS contains the _DECL or OVERLOAD so named. This is + not an alias, but is later expanded into multiple aliases. */ +DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0) + +/* A using directive. The operand is USING_STMT_NAMESPACE. */ +DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1) + +/* An un-parsed default argument. Holds a vector of input tokens and + a vector of places where the argument was instantiated before + parsing had occurred. */ +DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 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", tcc_expression, 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", tcc_exceptional, 0) + +/* A pseudo-destructor, of the form "OBJECT.~DESTRUCTOR" or + "OBJECT.SCOPE::~DESTRUCTOR. The first operand is the OBJECT. The + second operand (if non-NULL) is the SCOPE. The third operand is + the TYPE node corresponding to the DESTRUCTOR. The type of the + first operand will always be a scalar type. + + The type of a PSEUDO_DTOR_EXPR is always "void", even though it can + be used as if it were a zero-argument function. We handle the + function-call case specially, and giving it "void" type prevents it + being used in expressions in ways that are not permitted. */ +DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3) + +/* A whole bunch of tree codes for the initial, superficial parsing of + templates. */ +DEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3) +DEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1) +DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1) +DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1) +DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1) +DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1) +DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2) +DEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1) +DEFTREECODE (NOEXCEPT_EXPR, "noexcept_expr", tcc_unary, 1) + +/* 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", tcc_expression, 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", tcc_expression, 1) + +DEFTREECODE (TRY_BLOCK, "try_block", tcc_statement, 2) + +DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_statement, 2) + +/* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is + CATCH_ALL_TYPE, then the handler catches all types. The declaration of + the catch variable is in HANDLER_PARMS, and the body block in + HANDLER_BODY. */ +DEFTREECODE (HANDLER, "handler", tcc_statement, 2) + +/* A MUST_NOT_THROW_EXPR wraps an expression that may not + throw, and must call terminate if it does. */ +DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 1) + +/* A CLEANUP_STMT marks the point at which a declaration is fully + constructed. The CLEANUP_EXPR is run on behalf of CLEANUP_DECL + when CLEANUP_BODY completes. */ +DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3) + +/* Represents an 'if' statement. The operands are IF_COND, + THEN_CLAUSE, and ELSE_CLAUSE, respectively. */ +/* ??? It is currently still necessary to distinguish between IF_STMT + and COND_EXPR for the benefit of templates. */ +DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 3) + +/* Used to represent a `for' statement. The operands are + FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */ +DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 4) + +/* Used to represent a range-based `for' statement. The operands are + RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY, respectively. Only used + in templates. */ +DEFTREECODE (RANGE_FOR_STMT, "range_for_stmt", tcc_statement, 3) + +/* Used to represent a 'while' statement. The operands are WHILE_COND + and WHILE_BODY, respectively. */ +DEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 2) + +/* Used to represent a 'do' statement. The operands are DO_BODY and + DO_COND, respectively. */ +DEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 2) + +/* Used to represent a 'break' statement. */ +DEFTREECODE (BREAK_STMT, "break_stmt", tcc_statement, 0) + +/* Used to represent a 'continue' statement. */ +DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0) + +/* Used to represent a 'switch' statement. The operands are + SWITCH_STMT_COND, SWITCH_STMT_BODY and SWITCH_STMT_TYPE, respectively. */ +DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 3) + +/* Used to represent an expression statement. Use `EXPR_STMT_EXPR' to + obtain the expression. */ +DEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1) + +DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0) + +/* Represents an 'offsetof' expression during template expansion. */ +DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1) + +/* Represents a 'sizeof' expression during template expansion. */ +DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1) + +/* Represents the -> operator during template expansion. */ +DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1) + +/* Represents an '__alignof__' expression during template + expansion. */ +DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_expression, 1) + +/* Represents an Objective-C++ '@encode' expression during template + expansion. */ +DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_expression, 1) + +/* A STMT_EXPR represents a statement-expression during template + expansion. This is the GCC extension { ( ... ) }. The + STMT_EXPR_STMT is the statement given by the expression. */ +DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1) + +/* Unary plus. Operand 0 is the expression to which the unary plus + is applied. */ +DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1) + +/** C++0x extensions. */ + +/* A static assertion. This is a C++0x extension. + STATIC_ASSERT_CONDITION contains the condition that is being + checked. STATIC_ASSERT_MESSAGE contains the message (a string + literal) to be displayed if the condition fails to hold. */ +DEFTREECODE (STATIC_ASSERT, "static_assert", tcc_exceptional, 0) + +/* Represents an argument pack of types (or templates). An argument + pack stores zero or more arguments that will be used to instantiate + a parameter pack. + + ARGUMENT_PACK_ARGS retrieves the arguments stored in the argument + pack. + + Example: + template + class tuple { ... }; + + tuple t; + + Values is a (template) parameter pack. When tuple is instantiated, the Values parameter pack is instantiated + with the argument pack . ARGUMENT_PACK_ARGS will + be a TREE_VEC containing int, float, and double. */ +DEFTREECODE (TYPE_ARGUMENT_PACK, "type_argument_pack", tcc_type, 0) + +/* Represents an argument pack of values, which can be used either for + non-type template arguments or function call arguments. + + NONTYPE_ARGUMENT_PACK plays precisely the same role as + TYPE_ARGUMENT_PACK, but will be used for packing non-type template + arguments (e.g., "int... Dimensions") or function arguments ("const + Args&... args"). */ +DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1) + +/* Represents a type expression that will be expanded into a list of + types when instantiated with one or more argument packs. + + PACK_EXPANSION_PATTERN retrieves the expansion pattern. This is + the type or expression that we will substitute into with each + argument in an argument pack. + + SET_PACK_EXPANSION_PATTERN sets the expansion pattern. + + PACK_EXPANSION_PARAMETER_PACKS contains a TREE_LIST of the parameter + packs that are used in this pack expansion. + + Example: + template + struct tied : tuple { + // ... + }; + + The derivation from tuple contains a TYPE_PACK_EXPANSION for the + template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its + PACK_EXPANSION_PARAMETER_PACKS will contain "Values". */ +DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0) + +/* Represents an expression that will be expanded into a list of + expressions when instantiated with one or more argument packs. + + EXPR_PACK_EXPANSION plays precisely the same role as TYPE_PACK_EXPANSION, + but will be used for expressions. */ +DEFTREECODE (EXPR_PACK_EXPANSION, "expr_pack_expansion", tcc_expression, 1) + +/* Selects the Ith parameter out of an argument pack. This node will + be used when instantiating pack expansions; see + tsubst_pack_expansion. + + ARGUMENT_PACK_SELECT_FROM_PACK contains the *_ARGUMENT_PACK node + from which the argument will be selected. + + ARGUMENT_PACK_SELECT_INDEX contains the index into the argument + pack that will be returned by this ARGUMENT_PACK_SELECT node. The + index is a machine integer. */ +DEFTREECODE (ARGUMENT_PACK_SELECT, "argument_pack_select", tcc_exceptional, 0) + +/** C++ extensions. */ + +/* Represents a trait expression during template expansion. */ +DEFTREECODE (TRAIT_EXPR, "trait_expr", tcc_exceptional, 0) + +/* A lambda expression. This is a C++0x extension. + LAMBDA_EXPR_DEFAULT_CAPTURE_MODE is an enum for the default, which may be + none. + LAMBDA_EXPR_CAPTURE_LIST holds the capture-list, including `this'. + LAMBDA_EXPR_THIS_CAPTURE goes straight to the capture of `this', if it exists. + LAMBDA_EXPR_MUTABLE_P signals whether this lambda was declared mutable. + LAMBDA_EXPR_RETURN_TYPE holds the return type, if it was specified. */ +DEFTREECODE (LAMBDA_EXPR, "lambda_expr", tcc_exceptional, 0) + +/* The declared type of an expression. This is a C++0x extension. + DECLTYPE_TYPE_EXPR is the expression whose type we are computing. + DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P states whether the + expression was parsed as an id-expression or a member access + expression. When false, it was parsed as a full expression. + DECLTYPE_FOR_LAMBDA_CAPTURE is set if we want lambda capture semantics. + DECLTYPE_FOR_LAMBDA_RETURN is set if we want lambda return deduction. */ +DEFTREECODE (DECLTYPE_TYPE, "decltype_type", tcc_type, 0) + +/* Used to represent the template information stored by template + specializations. + The accessors are: + TI_TEMPLATE the template declaration associated to the specialization + TI_ARGS the arguments of the template specialization + TI_TYPEDEFS_NEEDING_ACCESS_CHECKING the vector of typedefs used in + the pattern of the template for which access check is needed at template + instantiation time. */ +DEFTREECODE (TEMPLATE_INFO, "template_info", tcc_exceptional, 0) + +/* +Local variables: +mode:c +End: +*/ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h new file mode 100644 index 000000000..7ff09cfeb --- /dev/null +++ b/gcc/cp/cp-tree.h @@ -0,0 +1,5660 @@ +/* Definitions for C++ parsing and type checking. + Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + 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 3, 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 COPYING3. If not see +. */ + +#ifndef GCC_CP_TREE_H +#define GCC_CP_TREE_H + +#include "ggc.h" +#include "function.h" +#include "hashtab.h" +#include "vec.h" + +/* In order for the format checking to accept the C++ front end + diagnostic framework extensions, you must include this file before + diagnostic-core.h, not after. We override the definition of GCC_DIAG_STYLE + in c-common.h. */ +#undef GCC_DIAG_STYLE +#define GCC_DIAG_STYLE __gcc_cxxdiag__ +#if defined(GCC_DIAGNOSTIC_CORE_H) || defined (GCC_C_COMMON_H) +#error \ +In order for the format checking to accept the C++ front end diagnostic \ +framework extensions, you must include this file before diagnostic-core.h and \ +c-common.h, not after. +#endif +#include "c-family/c-common.h" +#include "diagnostic.h" + +#include "name-lookup.h" + +/* Usage of TREE_LANG_FLAG_?: + 0: 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). + CLEANUP_P (in TRY_BLOCK) + AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) + PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF) + PAREN_STRING_LITERAL (in STRING_CST) + DECL_PRETTY_FUNCTION_P (in VAR_DECL) + KOENIG_LOOKUP_P (in CALL_EXPR) + STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST). + EXPR_STMT_STMT_EXPR_RESULT (in EXPR_STMT) + STMT_EXPR_NO_SCOPE (in STMT_EXPR) + BIND_EXPR_TRY_BLOCK (in BIND_EXPR) + TYPENAME_IS_ENUM_P (in TYPENAME_TYPE) + REFERENCE_REF_P (in INDIRECT_EXPR) + QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF) + OMP_FOR_GIMPLIFYING_P (in OMP_FOR) + BASELINK_QUALIFIED_P (in BASELINK) + TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR) + TEMPLATE_PARM_PARAMETER_PACK (in TEMPLATE_PARM_INDEX) + ATTR_IS_DEPENDENT (in the TREE_LIST for an attribute) + CONSTRUCTOR_IS_DIRECT_INIT (in CONSTRUCTOR) + LAMBDA_EXPR_CAPTURES_THIS_P (in LAMBDA_EXPR) + DECLTYPE_FOR_LAMBDA_CAPTURE (in DECLTYPE_TYPE) + VEC_INIT_EXPR_IS_CONSTEXPR (in VEC_INIT_EXPR) + 1: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE) + TI_PENDING_TEMPLATE_FLAG. + TEMPLATE_PARMS_FOR_INLINE. + DELETE_EXPR_USE_VEC (in DELETE_EXPR). + (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out). + ICS_ELLIPSIS_FLAG (in _CONV) + DECL_INITIALIZED_P (in VAR_DECL) + TYPENAME_IS_CLASS_P (in TYPENAME_TYPE) + STMT_IS_FULL_EXPR_P (in _STMT) + TARGET_EXPR_LIST_INIT_P (in TARGET_EXPR) + LAMBDA_EXPR_MUTABLE_P (in LAMBDA_EXPR) + DECLTYPE_FOR_LAMBDA_RETURN (in DECLTYPE_TYPE) + 2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE) + ICS_THIS_FLAG (in _CONV) + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL) + STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST) + TYPENAME_IS_RESOLVING_P (in TYPE_NAME_TYPE) + LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (in LAMBDA_EXPR) + TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR) + 3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out). + ICS_BAD_FLAG (in _CONV) + FN_TRY_BLOCK_P (in TRY_BLOCK) + IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE) + BIND_EXPR_BODY_BLOCK (in BIND_EXPR) + DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL) + 4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR, + or FIELD_DECL). + IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE) + DECL_TINFO_P (in VAR_DECL) + 5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE) + DECL_VTABLE_OR_VTT_P (in VAR_DECL) + 6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE) + DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL) + TYPE_MARKED_P (in _TYPE) + + Usage of TYPE_LANG_FLAG_?: + 0: TYPE_DEPENDENT_P + 1: TYPE_HAS_USER_CONSTRUCTOR. + 2: unused + 3: TYPE_FOR_JAVA. + 4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR + 5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE) + ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE) + 6: TYPE_DEPENDENT_P_VALID + + Usage of DECL_LANG_FLAG_?: + 0: DECL_ERROR_REPORTED (in VAR_DECL). + DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL) + DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL) + DECL_MUTABLE_P (in FIELD_DECL) + DECL_DEPENDENT_P (in USING_DECL) + 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). + DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL) + DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL) + FUNCTION_PARAMETER_PACK_P (in PARM_DECL) + 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL). + DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL) + 3: DECL_IN_AGGR_P. + 4: DECL_C_BIT_FIELD (in a FIELD_DECL) + DECL_ANON_UNION_VAR_P (in a VAR_DECL) + DECL_SELF_REFERENCE_P (in a TYPE_DECL) + DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL) + 5: DECL_INTERFACE_KNOWN. + 6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL). + DECL_FIELD_IS_BASE (in FIELD_DECL) + 7: DECL_DEAD_FOR_LOCAL (in VAR_DECL). + DECL_THUNK_P (in a member FUNCTION_DECL) + DECL_NORMAL_CAPTURE_P (in FIELD_DECL) + 8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL) + + Usage of language-independent fields in a language-dependent manner: + + TYPE_ALIAS_SET + This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so + forth as a substitute for the mark bits provided in `lang_type'. + At present, only the six low-order bits are used. + + TYPE_LANG_SLOT_1 + For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO. + For a FUNCTION_TYPE or METHOD_TYPE, this is TYPE_RAISES_EXCEPTIONS + + BINFO_VIRTUALS + For a binfo, this is a TREE_LIST. There is an entry for each + virtual function declared either in BINFO or its direct and + indirect primary bases. + + 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. + + The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable + index of the vcall offset for this entry. + + The BV_FN is the declaration for the virtual function itself. + + If BV_LOST_PRIMARY is set, it means that this entry is for a lost + primary virtual base and can be left null in the vtable. + + BINFO_VTABLE + This is an expression with POINTER_TYPE that gives the value + to which the vptr should be initialized. Use get_vtbl_decl_for_binfo + to extract the VAR_DECL for the complete vtable. + + DECL_VINDEX + This field is NULL for a non-virtual function. For a virtual + 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 + the old DECL_VINDEX. */ + +/* Language-specific tree checkers. */ + +#define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ + TREE_CHECK2(NODE,VAR_DECL,FUNCTION_DECL) + +#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \ + TREE_CHECK3(NODE,VAR_DECL,FUNCTION_DECL,PARM_DECL) + +#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \ + TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL) + +#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \ + TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM) + +#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) +#define THUNK_FUNCTION_CHECK(NODE) __extension__ \ +({ __typeof (NODE) const __t = (NODE); \ + if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific \ + || !__t->decl_common.lang_specific->u.fn.thunk_p) \ + tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \ + __t; }) +#else +#define THUNK_FUNCTION_CHECK(NODE) (NODE) +#endif + +/* Language-dependent contents of an identifier. */ + +struct GTY(()) lang_identifier { + struct c_common_identifier c_common; + cxx_binding *namespace_bindings; + cxx_binding *bindings; + tree class_template_info; + tree label_value; +}; + +/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a + keyword. C_RID_CODE (node) is then the RID_* value of the keyword, + and C_RID_YYCODE is the token number wanted by Yacc. */ + +#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_5 (ID) + +#define LANG_IDENTIFIER_CAST(NODE) \ + ((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE)) + +struct GTY(()) template_parm_index_s { + struct tree_common common; + int index; + int level; + int orig_level; + int num_siblings; + tree decl; +}; +typedef struct template_parm_index_s template_parm_index; + +struct GTY(()) ptrmem_cst { + struct tree_common common; + tree member; +}; +typedef struct ptrmem_cst * ptrmem_cst_t; + +#define IDENTIFIER_GLOBAL_VALUE(NODE) \ + namespace_binding ((NODE), global_namespace) +#define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \ + set_namespace_binding ((NODE), global_namespace, (VAL)) +#define IDENTIFIER_NAMESPACE_VALUE(NODE) \ + namespace_binding ((NODE), current_namespace) +#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \ + set_namespace_binding ((NODE), current_namespace, (VAL)) + +#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE)) + +#define BIND_EXPR_TRY_BLOCK(NODE) \ + TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE)) + +/* Used to mark the block around the member initializers and cleanups. */ +#define BIND_EXPR_BODY_BLOCK(NODE) \ + TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE)) +#define FUNCTION_NEEDS_BODY_BLOCK(NODE) \ + (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE)) + +#define STATEMENT_LIST_NO_SCOPE(NODE) \ + TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE)) +#define STATEMENT_LIST_TRY_BLOCK(NODE) \ + TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE)) + +/* Nonzero if this statement should be considered a full-expression, + i.e., if temporaries created during this statement should have + their destructors run at the end of this statement. */ +#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE)) + +/* Marks the result of a statement expression. */ +#define EXPR_STMT_STMT_EXPR_RESULT(NODE) \ + TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE)) + +/* Nonzero if this statement-expression does not have an associated scope. */ +#define STMT_EXPR_NO_SCOPE(NODE) \ + TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE)) + +/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual + sense of `same'. */ +#define same_type_p(TYPE1, TYPE2) \ + comptypes ((TYPE1), (TYPE2), COMPARE_STRICT) + +/* Nonzero if we are presently building a statement tree, rather + than expanding each statement as we encounter it. */ +#define building_stmt_tree() (cur_stmt_list != NULL_TREE) + +/* Returns nonzero iff NODE is a declaration for the global function + `main'. */ +#define DECL_MAIN_P(NODE) \ + (DECL_EXTERN_C_FUNCTION_P (NODE) \ + && DECL_NAME (NODE) != NULL_TREE \ + && MAIN_NAME_P (DECL_NAME (NODE)) \ + && flag_hosted) + +/* The overloaded FUNCTION_DECL. */ +#define OVL_FUNCTION(NODE) \ + (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function) +#define OVL_CHAIN(NODE) TREE_CHAIN (NODE) +/* Polymorphic access to FUNCTION and CHAIN. */ +#define OVL_CURRENT(NODE) \ + ((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE)) +#define OVL_NEXT(NODE) \ + ((TREE_CODE (NODE) == OVERLOAD) ? TREE_CHAIN (NODE) : NULL_TREE) +/* If set, this was imported in a using declaration. + This is not to confuse with being used somewhere, which + is not important for this node. */ +#define OVL_USED(NODE) TREE_USED (NODE) + +struct GTY(()) tree_overload { + struct tree_common common; + tree function; +}; + +/* Returns true iff NODE is a BASELINK. */ +#define BASELINK_P(NODE) \ + (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 -- + the BASELINK_OPTYPE can be used to determine what type the user + requested. */ +#define BASELINK_OPTYPE(NODE) \ + (TREE_CHAIN (BASELINK_CHECK (NODE))) +/* Nonzero if this baselink was from a qualified lookup. */ +#define BASELINK_QUALIFIED_P(NODE) \ + TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE)) + +struct GTY(()) tree_baselink { + struct tree_common common; + tree binfo; + tree functions; + tree access_binfo; +}; + +/* The different kinds of ids that we encounter. */ + +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; + + +/* The various kinds of C++0x warnings we encounter. */ + +typedef enum cpp0x_warn_str +{ + /* extended initializer lists */ + CPP0X_INITIALIZER_LISTS, + /* explicit conversion operators */ + CPP0X_EXPLICIT_CONVERSION, + /* variadic templates */ + CPP0X_VARIADIC_TEMPLATES, + /* lambda expressions */ + CPP0X_LAMBDA_EXPR, + /* C++0x auto */ + CPP0X_AUTO, + /* scoped enums */ + CPP0X_SCOPED_ENUMS, + /* defaulted and deleted functions */ + CPP0X_DEFAULTED_DELETED, + /* inline namespaces */ + CPP0X_INLINE_NAMESPACES +} cpp0x_warn_str; + +/* The various kinds of operation used by composite_pointer_type. */ + +typedef enum composite_pointer_operation +{ + /* comparison */ + CPO_COMPARISON, + /* conversion */ + CPO_CONVERSION, + /* conditional expression */ + CPO_CONDITIONAL_EXPR +} composite_pointer_operation; + +/* Possible cases of expression list used by build_x_compound_expr_from_list. */ +typedef enum expr_list_kind { + ELK_INIT, /* initializer */ + ELK_MEM_INIT, /* member initializer */ + ELK_FUNC_CAST /* functional cast */ +} expr_list_kind; + +/* Possible cases of implicit bad rhs conversions. */ +typedef enum impl_conv_rhs { + ICR_DEFAULT_ARGUMENT, /* default argument */ + ICR_CONVERTING, /* converting */ + ICR_INIT, /* initialization */ + ICR_ARGPASS, /* argument passing */ + ICR_RETURN, /* return */ + ICR_ASSIGN /* assignment */ +} impl_conv_rhs; + +/* Possible cases of implicit or explicit bad conversions to void. */ +typedef enum impl_conv_void { + ICV_CAST, /* (explicit) conversion to void */ + ICV_SECOND_OF_COND, /* second operand of conditional expression */ + ICV_THIRD_OF_COND, /* third operand of conditional expression */ + ICV_RIGHT_OF_COMMA, /* right operand of comma operator */ + ICV_LEFT_OF_COMMA, /* left operand of comma operator */ + ICV_STATEMENT, /* statement */ + ICV_THIRD_IN_FOR /* for increment expression */ +} impl_conv_void; + +/* Macros for access to language-specific slots in an identifier. */ + +#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \ + (LANG_IDENTIFIER_CAST (NODE)->namespace_bindings) +#define IDENTIFIER_TEMPLATE(NODE) \ + (LANG_IDENTIFIER_CAST (NODE)->class_template_info) + +/* 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) + +/* TREE_TYPE only indicates on local and class scope the current + type. For namespace scope, the presence of a type in any namespace + is indicated with global_type_node, and the real type behind must + be found through lookup. */ +#define IDENTIFIER_TYPE_VALUE(NODE) identifier_type_value (NODE) +#define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE) +#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) + +/* Nonzero if this identifier is used as a virtual function name somewhere + (optimizes searches). */ +#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1 (NODE) + +/* Nonzero if this identifier is the prefix for a mangled C++ operator + name. */ +#define IDENTIFIER_OPNAME_P(NODE) TREE_LANG_FLAG_2 (NODE) + +/* Nonzero if this identifier is the name of a type-conversion + operator. */ +#define IDENTIFIER_TYPENAME_P(NODE) \ + TREE_LANG_FLAG_4 (NODE) + +/* Nonzero if this identifier is the name of a constructor or + destructor. */ +#define IDENTIFIER_CTOR_OR_DTOR_P(NODE) \ + TREE_LANG_FLAG_3 (NODE) + +/* True iff NAME is the DECL_ASSEMBLER_NAME for an entity with vague + linkage which the prelinker has assigned to this translation + unit. */ +#define IDENTIFIER_REPO_CHOSEN(NAME) \ + (TREE_LANG_FLAG_6 (NAME)) + +/* 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) + +/* The tokens stored in the default argument. */ + +#define DEFARG_TOKENS(NODE) \ + (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens) +#define DEFARG_INSTANTIATIONS(NODE) \ + (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations) + +struct GTY (()) tree_default_arg { + struct tree_common common; + struct cp_token_cache *tokens; + VEC(tree,gc) *instantiations; +}; + +/* The condition associated with the static assertion. This must be + an integral constant expression. */ +#define STATIC_ASSERT_CONDITION(NODE) \ + (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition) + +/* The message associated with the static assertion. This must be a + string constant, which will be emitted as an error message when the + static assert condition is false. */ +#define STATIC_ASSERT_MESSAGE(NODE) \ + (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message) + +/* Source location information for a static assertion. */ +#define STATIC_ASSERT_SOURCE_LOCATION(NODE) \ + (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location) + +struct GTY (()) tree_static_assert { + struct tree_common common; + tree condition; + tree message; + location_t location; +}; + +struct GTY (()) tree_argument_pack_select { + struct tree_common common; + tree argument_pack; + int index; +}; + +/* The different kinds of traits that we encounter. */ + +typedef enum cp_trait_kind +{ + CPTK_HAS_NOTHROW_ASSIGN, + CPTK_HAS_NOTHROW_CONSTRUCTOR, + CPTK_HAS_NOTHROW_COPY, + CPTK_HAS_TRIVIAL_ASSIGN, + CPTK_HAS_TRIVIAL_CONSTRUCTOR, + CPTK_HAS_TRIVIAL_COPY, + CPTK_HAS_TRIVIAL_DESTRUCTOR, + CPTK_HAS_VIRTUAL_DESTRUCTOR, + CPTK_IS_ABSTRACT, + CPTK_IS_BASE_OF, + CPTK_IS_CLASS, + CPTK_IS_CONVERTIBLE_TO, + CPTK_IS_EMPTY, + CPTK_IS_ENUM, + CPTK_IS_POD, + CPTK_IS_POLYMORPHIC, + CPTK_IS_STD_LAYOUT, + CPTK_IS_TRIVIAL, + CPTK_IS_LITERAL_TYPE, + CPTK_IS_UNION +} cp_trait_kind; + +/* The types that we are processing. */ +#define TRAIT_EXPR_TYPE1(NODE) \ + (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type1) + +#define TRAIT_EXPR_TYPE2(NODE) \ + (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type2) + +/* The specific trait that we are processing. */ +#define TRAIT_EXPR_KIND(NODE) \ + (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->kind) + +struct GTY (()) tree_trait_expr { + struct tree_common common; + tree type1; + tree type2; + enum cp_trait_kind kind; +}; + +/* Based off of TYPE_ANONYMOUS_P. */ +#define LAMBDA_TYPE_P(NODE) \ + (CLASS_TYPE_P (NODE) && LAMBDANAME_P (TYPE_LINKAGE_IDENTIFIER (NODE))) + +/* Test if FUNCTION_DECL is a lambda function. */ +#define LAMBDA_FUNCTION_P(FNDECL) \ + (DECL_OVERLOADED_OPERATOR_P (FNDECL) == CALL_EXPR \ + && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL))) + +enum cp_lambda_default_capture_mode_type { + CPLD_NONE, + CPLD_COPY, + CPLD_REFERENCE +}; + +/* The method of default capture, if any. */ +#define LAMBDA_EXPR_DEFAULT_CAPTURE_MODE(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->default_capture_mode) + +/* The capture-list, including `this'. Each capture is stored as a FIELD_DECL + * so that the name, type, and field are all together, whether or not it has + * been added to the lambda's class type. + TREE_LIST: + TREE_PURPOSE: The FIELD_DECL for this capture. + TREE_VALUE: The initializer. This is part of a GNU extension. */ +#define LAMBDA_EXPR_CAPTURE_LIST(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list) + +/* The node in the capture-list that holds the 'this' capture. */ +#define LAMBDA_EXPR_THIS_CAPTURE(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture) + +/* Predicate tracking whether `this' is in the effective capture set. */ +#define LAMBDA_EXPR_CAPTURES_THIS_P(NODE) \ + LAMBDA_EXPR_THIS_CAPTURE(NODE) + +/* Predicate tracking whether the lambda was declared 'mutable'. */ +#define LAMBDA_EXPR_MUTABLE_P(NODE) \ + TREE_LANG_FLAG_1 (LAMBDA_EXPR_CHECK (NODE)) + +/* True iff we should try to deduce the lambda return type from any return + statement. */ +#define LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P(NODE) \ + TREE_LANG_FLAG_2 (LAMBDA_EXPR_CHECK (NODE)) + +/* The return type in the expression. + * NULL_TREE indicates that none was specified. */ +#define LAMBDA_EXPR_RETURN_TYPE(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->return_type) + +/* The source location of the lambda. */ +#define LAMBDA_EXPR_LOCATION(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->locus) + +/* The mangling scope for the lambda: FUNCTION_DECL, PARM_DECL, VAR_DECL, + FIELD_DECL or NULL_TREE. If this is NULL_TREE, we have no linkage. */ +#define LAMBDA_EXPR_EXTRA_SCOPE(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_scope) + +/* If EXTRA_SCOPE, this is the number of the lambda within that scope. */ +#define LAMBDA_EXPR_DISCRIMINATOR(NODE) \ + (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator) + +struct GTY (()) tree_lambda_expr +{ + struct tree_common common; + location_t locus; + enum cp_lambda_default_capture_mode_type default_capture_mode; + tree capture_list; + tree this_capture; + tree return_type; + tree extra_scope; + int discriminator; +}; + +/* A (typedef,context,usage location) triplet. + It represents a typedef used through a + context at a given source location. + e.g. + struct foo { + typedef int myint; + }; + + struct bar { + foo::myint v; // #1<-- this location. + }; + + In bar, the triplet will be (myint, foo, #1). + */ +struct GTY(()) qualified_typedef_usage_s { + tree typedef_decl; + tree context; + location_t locus; +}; +typedef struct qualified_typedef_usage_s qualified_typedef_usage_t; +DEF_VEC_O (qualified_typedef_usage_t); +DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc); + +struct GTY(()) tree_template_info { + struct tree_common common; + VEC(qualified_typedef_usage_t,gc) *typedefs_needing_access_checking; +}; + +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, + TS_CP_STATIC_ASSERT, + TS_CP_ARGUMENT_PACK_SELECT, + TS_CP_TRAIT_EXPR, + TS_CP_LAMBDA_EXPR, + TS_CP_TEMPLATE_INFO, + LAST_TS_CP_ENUM +}; + +/* The resulting tree type. */ +union GTY((desc ("cp_tree_node_structure (&%h)"), + chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)"))) lang_tree_node { + 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_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg; + struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier; + struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT"))) + static_assertion; + struct tree_argument_pack_select GTY ((tag ("TS_CP_ARGUMENT_PACK_SELECT"))) + argument_pack_select; + struct tree_trait_expr GTY ((tag ("TS_CP_TRAIT_EXPR"))) + trait_expression; + struct tree_lambda_expr GTY ((tag ("TS_CP_LAMBDA_EXPR"))) + lambda_expression; + struct tree_template_info GTY ((tag ("TS_CP_TEMPLATE_INFO"))) + template_info; +}; + + +enum cp_tree_index +{ + CPTI_JAVA_BYTE_TYPE, + CPTI_JAVA_SHORT_TYPE, + CPTI_JAVA_INT_TYPE, + CPTI_JAVA_LONG_TYPE, + CPTI_JAVA_FLOAT_TYPE, + CPTI_JAVA_DOUBLE_TYPE, + CPTI_JAVA_CHAR_TYPE, + CPTI_JAVA_BOOLEAN_TYPE, + + CPTI_WCHAR_DECL, + CPTI_VTABLE_ENTRY_TYPE, + CPTI_DELTA_TYPE, + CPTI_VTABLE_INDEX_TYPE, + CPTI_CLEANUP_TYPE, + CPTI_VTT_PARM_TYPE, + + CPTI_CLASS_TYPE, + CPTI_UNKNOWN_TYPE, + CPTI_INIT_LIST_TYPE, + CPTI_VTBL_TYPE, + CPTI_VTBL_PTR_TYPE, + CPTI_STD, + CPTI_ABI, + CPTI_CONST_TYPE_INFO_TYPE, + CPTI_TYPE_INFO_PTR_TYPE, + CPTI_ABORT_FNDECL, + CPTI_GLOBAL_DELETE_FNDECL, + CPTI_AGGR_TAG, + + CPTI_CTOR_IDENTIFIER, + CPTI_COMPLETE_CTOR_IDENTIFIER, + CPTI_BASE_CTOR_IDENTIFIER, + CPTI_DTOR_IDENTIFIER, + CPTI_COMPLETE_DTOR_IDENTIFIER, + CPTI_BASE_DTOR_IDENTIFIER, + CPTI_DELETING_DTOR_IDENTIFIER, + CPTI_DELTA_IDENTIFIER, + CPTI_IN_CHARGE_IDENTIFIER, + CPTI_VTT_PARM_IDENTIFIER, + CPTI_NELTS_IDENTIFIER, + CPTI_THIS_IDENTIFIER, + CPTI_PFN_IDENTIFIER, + CPTI_VPTR_IDENTIFIER, + CPTI_STD_IDENTIFIER, + + CPTI_LANG_NAME_C, + CPTI_LANG_NAME_CPLUSPLUS, + CPTI_LANG_NAME_JAVA, + + CPTI_EMPTY_EXCEPT_SPEC, + CPTI_NOEXCEPT_TRUE_SPEC, + CPTI_NOEXCEPT_FALSE_SPEC, + CPTI_JCLASS, + CPTI_TERMINATE, + CPTI_CALL_UNEXPECTED, + CPTI_ATEXIT_FN_PTR_TYPE, + CPTI_ATEXIT, + CPTI_DSO_HANDLE, + CPTI_DCAST, + + CPTI_KEYED_CLASSES, + + CPTI_NULLPTR, + CPTI_NULLPTR_TYPE, + + CPTI_MAX +}; + +extern GTY(()) tree cp_global_trees[CPTI_MAX]; + +#define java_byte_type_node cp_global_trees[CPTI_JAVA_BYTE_TYPE] +#define java_short_type_node cp_global_trees[CPTI_JAVA_SHORT_TYPE] +#define java_int_type_node cp_global_trees[CPTI_JAVA_INT_TYPE] +#define java_long_type_node cp_global_trees[CPTI_JAVA_LONG_TYPE] +#define java_float_type_node cp_global_trees[CPTI_JAVA_FLOAT_TYPE] +#define java_double_type_node cp_global_trees[CPTI_JAVA_DOUBLE_TYPE] +#define java_char_type_node cp_global_trees[CPTI_JAVA_CHAR_TYPE] +#define java_boolean_type_node cp_global_trees[CPTI_JAVA_BOOLEAN_TYPE] + +#define wchar_decl_node cp_global_trees[CPTI_WCHAR_DECL] +#define vtable_entry_type cp_global_trees[CPTI_VTABLE_ENTRY_TYPE] +/* The type used to represent an offset by which to adjust the `this' + pointer in pointer-to-member types. */ +#define delta_type_node cp_global_trees[CPTI_DELTA_TYPE] +/* The type used to represent an index into the vtable. */ +#define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE] + +#define class_type_node cp_global_trees[CPTI_CLASS_TYPE] +#define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE] +#define init_list_type_node cp_global_trees[CPTI_INIT_LIST_TYPE] +#define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE] +#define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE] +#define std_node cp_global_trees[CPTI_STD] +#define abi_node cp_global_trees[CPTI_ABI] +#define const_type_info_type_node cp_global_trees[CPTI_CONST_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 nullptr_node cp_global_trees[CPTI_NULLPTR] +#define nullptr_type_node cp_global_trees[CPTI_NULLPTR_TYPE] + +/* We cache these tree nodes so as to call get_identifier less + frequently. */ + +/* The name of a constructor that takes an in-charge parameter to + decide whether or not to construct virtual base classes. */ +#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER] +/* The name of a constructor that constructs virtual base classes. */ +#define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER] +/* The name of a constructor that does not construct virtual base classes. */ +#define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER] +/* The name of a destructor that takes an in-charge parameter to + decide whether or not to destroy virtual base classes and whether + or not to delete the object. */ +#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER] +/* The name of a destructor that destroys virtual base classes. */ +#define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER] +/* The name of a destructor that does not destroy virtual base + classes. */ +#define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER] +/* The name of a destructor that destroys virtual base classes, and + then deletes the entire object. */ +#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER] +#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER] +#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER] +/* The name of the parameter that contains a pointer to the VTT to use + for this subobject constructor or destructor. */ +#define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER] +#define nelts_identifier cp_global_trees[CPTI_NELTS_IDENTIFIER] +#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER] +#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER] +#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER] +/* The name of the std namespace. */ +#define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER] +#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C] +#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS] +#define lang_name_java cp_global_trees[CPTI_LANG_NAME_JAVA] + +/* Exception specifier used for throw(). */ +#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC] +#define noexcept_true_spec cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC] +#define noexcept_false_spec cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC] + +/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */ +#define jclass_node cp_global_trees[CPTI_JCLASS] + +/* The declaration for `std::terminate'. */ +#define terminate_node cp_global_trees[CPTI_TERMINATE] + +/* The declaration for "__cxa_call_unexpected". */ +#define call_unexpected_node cp_global_trees[CPTI_CALL_UNEXPECTED] + +/* The type of the function-pointer argument to "__cxa_atexit" (or + "std::atexit", if "__cxa_atexit" is not being used). */ +#define atexit_fn_ptr_type_node cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE] + +/* A pointer to `std::atexit'. */ +#define atexit_node cp_global_trees[CPTI_ATEXIT] + +/* A pointer to `__dso_handle'. */ +#define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE] + +/* The declaration of the dynamic_cast runtime. */ +#define dynamic_cast_node cp_global_trees[CPTI_DCAST] + +/* The type of a destructor. */ +#define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE] + +/* The type of the vtt parameter passed to subobject constructors and + destructors. */ +#define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE] + +/* A TREE_LIST of the dynamic classes whose vtables may have to be + emitted in this translation unit. */ + +#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 GTY(()) saved_scope { + VEC(cxx_saved_binding,gc) *old_bindings; + tree old_namespace; + VEC(tree,gc) *decl_ns_list; + tree class_name; + tree class_type; + tree access_specifier; + tree function_decl; + VEC(tree,gc) *lang_base; + tree lang_name; + tree template_parms; + struct cp_binding_level *x_previous_class_level; + tree x_saved_tree; + + int x_processing_template_decl; + int x_processing_specialization; + BOOL_BITFIELD x_processing_explicit_instantiation : 1; + BOOL_BITFIELD need_pop_function_context : 1; + + int unevaluated_operand; + int inhibit_evaluation_warnings; + + struct stmt_tree_s x_stmt_tree; + + struct cp_binding_level *class_bindings; + struct cp_binding_level *bindings; + + struct saved_scope *prev; +}; + +/* The current open namespace. */ + +#define current_namespace scope_chain->old_namespace + +/* The stack for namespaces of current declarations. */ + +#define decl_namespace_list scope_chain->decl_ns_list + +/* IDENTIFIER_NODE: name of current class */ + +#define current_class_name scope_chain->class_name + +/* _TYPE: the type of the current class */ + +#define current_class_type scope_chain->class_type + +/* When parsing a class definition, the access specifier most recently + given by the user, or, if no access specifier was given, the + default value appropriate for the kind of class (i.e., struct, + class, or union). */ + +#define current_access_specifier scope_chain->access_specifier + +/* Pointer to the top of the language name stack. */ + +#define current_lang_base scope_chain->lang_base +#define current_lang_name scope_chain->lang_name + +/* When parsing a template declaration, a TREE_LIST represents the + active template parameters. Each node in the list represents one + level of template parameters. The innermost level is first in the + list. The depth of each level is stored as an INTEGER_CST in the + TREE_PURPOSE of each node. The parameters for that level are + stored in the TREE_VALUE. */ + +#define current_template_parms scope_chain->template_parms + +#define processing_template_decl scope_chain->x_processing_template_decl +#define processing_specialization scope_chain->x_processing_specialization +#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation + +/* The cached class binding level, from the most recently exited + class, or NULL if none. */ + +#define previous_class_level scope_chain->x_previous_class_level + +/* A list of private types mentioned, for deferred access checking. */ + +extern GTY(()) struct saved_scope *scope_chain; + +struct GTY(()) cxx_int_tree_map { + unsigned int uid; + tree to; +}; + +extern unsigned int cxx_int_tree_map_hash (const void *); +extern int cxx_int_tree_map_eq (const void *, const void *); + +/* Global state pertinent to the current function. */ + +struct GTY(()) language_function { + struct c_language_function base; + + tree x_cdtor_label; + tree x_current_class_ptr; + tree x_current_class_ref; + tree x_eh_spec_block; + tree x_in_charge_parm; + tree x_vtt_parm; + tree x_return_value; + + BOOL_BITFIELD returns_value : 1; + BOOL_BITFIELD returns_null : 1; + BOOL_BITFIELD returns_abnormally : 1; + BOOL_BITFIELD in_function_try_handler : 1; + BOOL_BITFIELD in_base_initializer : 1; + + /* True if this function can throw an exception. */ + BOOL_BITFIELD can_throw : 1; + + htab_t GTY((param_is(struct named_label_entry))) x_named_labels; + struct cp_binding_level *bindings; + VEC(tree,gc) *x_local_names; + htab_t GTY((param_is (struct cxx_int_tree_map))) extern_decl_map; +}; + +/* The current C++-specific per-function global variables. */ + +#define cp_function_chain (cfun->language) + +/* In a constructor destructor, the point at which all derived class + destroying/construction has been done. I.e., just before a + constructor returns, or before any base class destroying will be done + in a destructor. */ + +#define cdtor_label cp_function_chain->x_cdtor_label + +/* When we're processing a member function, current_class_ptr is the + PARM_DECL for the `this' pointer. The current_class_ref is an + expression for `*this'. */ + +#define current_class_ptr \ + (cfun && cp_function_chain \ + ? cp_function_chain->x_current_class_ptr : NULL_TREE) +#define current_class_ref \ + ((cfun && cp_function_chain) \ + ? cp_function_chain->x_current_class_ref : NULL_TREE) + +/* The EH_SPEC_BLOCK for the exception-specifiers for the current + function, if any. */ + +#define current_eh_spec_block cp_function_chain->x_eh_spec_block + +/* The `__in_chrg' parameter for the current function. Only used for + constructors and destructors. */ + +#define current_in_charge_parm cp_function_chain->x_in_charge_parm + +/* The `__vtt_parm' parameter for the current function. Only used for + constructors and destructors. */ + +#define current_vtt_parm cp_function_chain->x_vtt_parm + +/* Set to 0 at beginning of a function definition, set to 1 if + a return statement that specifies a return value is seen. */ + +#define current_function_returns_value cp_function_chain->returns_value + +/* Set to 0 at beginning of a function definition, set to 1 if + a return statement with no argument is seen. */ + +#define current_function_returns_null cp_function_chain->returns_null + +/* Set to 0 at beginning of a function definition, set to 1 if + a call to a noreturn function is seen. */ + +#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 + +/* Expression always returned from function, or error_mark_node + otherwise, for use by the automatic named return value optimization. */ + +#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) +#define ansi_assopname(CODE) \ + (assignment_operator_name_info[(int) (CODE)].identifier) + +/* True if NODE is an erroneous expression. */ + +#define error_operand_p(NODE) \ + ((NODE) == error_mark_node \ + || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node)) + +/* TRUE if a tree code represents a statement. */ +extern bool statement_code_p[MAX_TREE_CODES]; + +#define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)] + +enum languages { lang_c, lang_cplusplus, lang_java }; + +/* Macros to make error reporting functions' lives easier. */ +#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE))) +#define TYPE_LINKAGE_IDENTIFIER(NODE) \ + (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE))) +#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE))) +#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE))) + +/* Nonzero if NODE has no name for linkage purposes. */ +#define TYPE_ANONYMOUS_P(NODE) \ + (TAGGED_TYPE_P (NODE) && ANON_AGGRNAME_P (TYPE_LINKAGE_IDENTIFIER (NODE))) + +/* The _DECL for this _TYPE. */ +#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE))) + +/* Nonzero if T is a class (or struct or union) type. Also nonzero + for template type parameters, typename types, and instantiated + template template parameters. Keep these checks in ascending code + order. */ +#define MAYBE_CLASS_TYPE_P(T) \ + (TREE_CODE (T) == TEMPLATE_TYPE_PARM \ + || TREE_CODE (T) == TYPENAME_TYPE \ + || TREE_CODE (T) == TYPEOF_TYPE \ + || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM \ + || TREE_CODE (T) == DECLTYPE_TYPE \ + || CLASS_TYPE_P (T)) + +/* Set CLASS_TYPE_P for T to VAL. T must be a class, struct, or + union type. */ +#define SET_CLASS_TYPE_P(T, VAL) \ + (TYPE_LANG_FLAG_5 (T) = (VAL)) + +/* Nonzero if T is a class type. Zero for template type parameters, + typename types, and so forth. */ +#define CLASS_TYPE_P(T) \ + (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T)) + +/* Nonzero if T is a class type but not an union. */ +#define NON_UNION_CLASS_TYPE_P(T) \ + (CLASS_TYPE_P (T) && TREE_CODE (T) != UNION_TYPE) + +/* Keep these checks in ascending code order. */ +#define RECORD_OR_UNION_CODE_P(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) + +/* Nonzero if this type is volatile-qualified. */ +#define CP_TYPE_VOLATILE_P(NODE) \ + ((cp_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0) + +/* Nonzero if this type is restrict-qualified. */ +#define CP_TYPE_RESTRICT_P(NODE) \ + ((cp_type_quals (NODE) & TYPE_QUAL_RESTRICT) != 0) + +/* Nonzero if this type is const-qualified, but not + volatile-qualified. Other qualifiers are ignored. This macro is + used to test whether or not it is OK to bind an rvalue to a + reference. */ +#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \ + ((cp_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \ + == TYPE_QUAL_CONST) + +#define FUNCTION_ARG_CHAIN(NODE) \ + TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE))) + +/* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES + which refers to a user-written parameter. */ +#define FUNCTION_FIRST_USER_PARMTYPE(NODE) \ + skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE))) + +/* Similarly, but for DECL_ARGUMENTS. */ +#define FUNCTION_FIRST_USER_PARM(NODE) \ + skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE)) + +/* 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) \ + (lookup_base ((TYPE), (PARENT), ba_unique | ba_quiet, NULL) != NULL_TREE) +/* Nonzero iff TYPE is publicly & uniquely derived from PARENT. */ +#define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ + (lookup_base ((TYPE), (PARENT), ba_ignore_scope | ba_check | ba_quiet, \ + NULL) != NULL_TREE) + +/* Gives the visibility specification for a class type. */ +#define CLASSTYPE_VISIBILITY(TYPE) \ + DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE)) +#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) \ + DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE)) + +typedef struct GTY (()) tree_pair_s { + tree purpose; + tree value; +} tree_pair_s; +typedef tree_pair_s *tree_pair_p; +DEF_VEC_O (tree_pair_s); +DEF_VEC_ALLOC_O (tree_pair_s,gc); + +/* This is a few header flags for 'struct lang_type'. Actually, + all but the first are used only for lang_type_class; they + are put in this structure to save space. */ +struct GTY(()) lang_type_header { + BOOL_BITFIELD is_lang_type_class : 1; + + BOOL_BITFIELD has_type_conversion : 1; + BOOL_BITFIELD has_copy_ctor : 1; + BOOL_BITFIELD has_default_ctor : 1; + BOOL_BITFIELD const_needs_init : 1; + BOOL_BITFIELD ref_needs_init : 1; + BOOL_BITFIELD has_const_copy_assign : 1; + + BOOL_BITFIELD spare : 1; +}; + +/* This structure provides additional information above and beyond + what is provide in the ordinary tree_type. In the past, we used it + for the types of class types, template parameters types, typename + types, and so forth. However, there can be many (tens to hundreds + of thousands) of template parameter types in a compilation, and + there's no need for this additional information in that case. + Therefore, we now use this data structure only for class types. + + In the past, it was thought that there would be relatively few + class types. However, in the presence of heavy use of templates, + many (i.e., thousands) of classes can easily be generated. + Therefore, we should endeavor to keep the size of this structure to + a minimum. */ +struct GTY(()) lang_type_class { + struct lang_type_header h; + + unsigned char align; + + unsigned has_mutable : 1; + unsigned com_interface : 1; + unsigned non_pod_class : 1; + unsigned nearly_empty_p : 1; + unsigned user_align : 1; + unsigned has_copy_assign : 1; + unsigned has_new : 1; + 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 vec_new_uses_cookie : 1; + unsigned declared_class : 1; + unsigned diamond_shaped : 1; + unsigned repeated_base : 1; + unsigned being_defined : 1; + unsigned java_interface : 1; + unsigned debug_requested : 1; + unsigned fields_readonly : 1; + + unsigned use_template : 2; + unsigned ptrmemfunc_flag : 1; + unsigned was_anonymous : 1; + unsigned lazy_default_ctor : 1; + unsigned lazy_copy_ctor : 1; + unsigned lazy_copy_assign : 1; + unsigned lazy_destructor : 1; + + unsigned has_const_copy_ctor : 1; + unsigned has_complex_copy_ctor : 1; + unsigned has_complex_copy_assign : 1; + unsigned non_aggregate : 1; + unsigned has_complex_dflt : 1; + unsigned has_list_ctor : 1; + unsigned non_std_layout : 1; + unsigned is_literal : 1; + + unsigned lazy_move_ctor : 1; + unsigned lazy_move_assign : 1; + unsigned has_complex_move_ctor : 1; + unsigned has_complex_move_assign : 1; + unsigned has_constexpr_ctor : 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! */ + + /* 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 : 3; + + tree primary_base; + VEC(tree_pair_s,gc) *vcall_indices; + tree vtables; + tree typeinfo_var; + VEC(tree,gc) *vbases; + binding_table nested_udts; + tree as_base; + VEC(tree,gc) *pure_virtuals; + tree friend_classes; + VEC(tree,gc) * GTY((reorder ("resort_type_method_vec"))) methods; + tree key_method; + tree decl_list; + tree template_info; + tree befriending_classes; + /* In a RECORD_TYPE, information specific to Objective-C++, such + as a list of adopted protocols or a pointer to a corresponding + @interface. See objc/objc-act.h for details. */ + tree objc_info; + /* sorted_fields is sorted based on a pointer, so we need to be able + to resort it if pointers get rearranged. */ + struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields"))) + sorted_fields; + /* FIXME reuse another field? */ + tree lambda_expr; +}; + +struct GTY(()) lang_type_ptrmem { + struct lang_type_header h; + tree record; +}; + +struct GTY((variable_size)) lang_type { + union lang_type_u + { + struct lang_type_header GTY((skip (""))) h; + struct lang_type_class GTY((tag ("1"))) c; + struct lang_type_ptrmem GTY((tag ("0"))) ptrmem; + } GTY((desc ("%h.h.is_lang_type_class"))) u; +}; + +#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__); \ + <->u.ptrmem; }) + +#else + +#define LANG_TYPE_CLASS_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.c) +#define LANG_TYPE_PTRMEM_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.ptrmem) + +#endif /* ENABLE_TREE_CHECKING */ + +/* Nonzero for _CLASSTYPE means that operator delete is defined. */ +#define TYPE_GETS_DELETE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->gets_delete) +#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1) + +/* Nonzero if `new NODE[x]' should cause the allocation of extra + storage to indicate how many array elements are in use. */ +#define TYPE_VEC_NEW_USES_COOKIE(NODE) \ + (CLASS_TYPE_P (NODE) \ + && LANG_TYPE_CLASS_CHECK (NODE)->vec_new_uses_cookie) + +/* Nonzero means that this _CLASSTYPE node defines ways of converting + itself to other types. */ +#define TYPE_HAS_CONVERSION(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.has_type_conversion) + +/* Nonzero means that NODE (a class type) has a default constructor -- + but that it has not yet been declared. */ +#define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor) + +/* Nonzero means that NODE (a class type) has a copy constructor -- + but that it has not yet been declared. */ +#define CLASSTYPE_LAZY_COPY_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor) + +/* Nonzero means that NODE (a class type) has a move constructor -- + but that it has not yet been declared. */ +#define CLASSTYPE_LAZY_MOVE_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_ctor) + +/* Nonzero means that NODE (a class type) has an assignment operator + -- but that it has not yet been declared. */ +#define CLASSTYPE_LAZY_COPY_ASSIGN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_assign) + +/* Nonzero means that NODE (a class type) has an assignment operator + -- but that it has not yet been declared. */ +#define CLASSTYPE_LAZY_MOVE_ASSIGN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_assign) + +/* Nonzero means that NODE (a class type) has a destructor -- but that + it has not yet been declared. */ +#define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor) + +/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */ +#define TYPE_HAS_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_assign) + +/* True iff the class type NODE has an "operator =" whose parameter + has a parameter of type "const X&". */ +#define TYPE_HAS_CONST_COPY_ASSIGN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.has_const_copy_assign) + +/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */ +#define TYPE_HAS_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->h.has_copy_ctor) +#define TYPE_HAS_CONST_COPY_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_ctor) + +/* Nonzero if this class has an X(initializer_list) constructor. */ +#define TYPE_HAS_LIST_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->has_list_ctor) + +/* Nonzero if this class has a constexpr constructor other than a copy/move + constructor. Note that a class can have constexpr constructors for + static initialization even if it isn't a literal class. */ +#define TYPE_HAS_CONSTEXPR_CTOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor) + +/* Nonzero if this class defines an overloaded operator new. (An + operator new [] doesn't count.) */ +#define TYPE_HAS_NEW_OPERATOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->has_new) + +/* Nonzero if this class defines an overloaded operator new[]. */ +#define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->has_array_new) + +/* Nonzero means that this type is being defined. I.e., the left brace + starting the definition of this type has been seen. */ +#define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined) + +/* Nonzero means that this type is either complete or being defined, so we + can do lookup in it. */ +#define COMPLETE_OR_OPEN_TYPE_P(NODE) \ + (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE))) + +/* Mark bits for repeated base checks. */ +#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE)) + +/* Nonzero if the class NODE has multiple paths to the same (virtual) + base object. */ +#define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \ + (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped) + +/* Nonzero if the class NODE has multiple instances of the same base + type. */ +#define CLASSTYPE_REPEATED_BASE_P(NODE) \ + (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base) + +/* The member function with which the vtable will be emitted: + the first noninline non-pure-virtual member function. NULL_TREE + if there is no key function or if this is a class template */ +#define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method) + +/* Vector member functions defined in this class. Each element is + either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All + functions with the same name end up in the same slot. The first + two elements are for constructors, and destructors, respectively. + All template conversion operators to innermost template dependent + types are overloaded on the next slot, if they exist. Note, the + names for these functions will not all be the same. The + non-template conversion operators & templated conversions to + non-innermost template types are next, followed by ordinary member + functions. There may be empty entries at the end of the vector. + The conversion operators are unsorted. The ordinary member + functions are sorted, once the class is complete. */ +#define CLASSTYPE_METHOD_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->methods) + +/* For class templates, this is a TREE_LIST of all member data, + functions, types, and friends in the order of declaration. + The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend, + and the RECORD_TYPE for the class template otherwise. */ +#define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list) + +/* The slot in the CLASSTYPE_METHOD_VEC where constructors go. */ +#define CLASSTYPE_CONSTRUCTOR_SLOT 0 + +/* The slot in the CLASSTYPE_METHOD_VEC where destructors go. */ +#define CLASSTYPE_DESTRUCTOR_SLOT 1 + +/* The first slot in the CLASSTYPE_METHOD_VEC where conversion + operators can appear. */ +#define CLASSTYPE_FIRST_CONVERSION_SLOT 2 + +/* A FUNCTION_DECL or OVERLOAD for the constructors for NODE. These + are the constructors that take an in-charge parameter. */ +#define CLASSTYPE_CONSTRUCTORS(NODE) \ + (VEC_index (tree, CLASSTYPE_METHOD_VEC (NODE), CLASSTYPE_CONSTRUCTOR_SLOT)) + +/* A FUNCTION_DECL for the destructor for NODE. These are the + destructors that take an in-charge parameter. If + CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL + until the destructor is created with lazily_declare_fn. */ +#define CLASSTYPE_DESTRUCTORS(NODE) \ + (CLASSTYPE_METHOD_VEC (NODE) \ + ? VEC_index (tree, CLASSTYPE_METHOD_VEC (NODE), CLASSTYPE_DESTRUCTOR_SLOT) \ + : NULL_TREE) + +/* 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 + which it shares the virtual function table pointer. */ +#define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \ + (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE) + +/* If non-NULL, this is the binfo for the primary base class, i.e., + the base class which contains the virtual function table pointer + for this class. */ +#define CLASSTYPE_PRIMARY_BINFO(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->primary_base) + +/* A vector 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) + +/* The type corresponding to NODE when NODE is used as a base class, + i.e., NODE without virtual base classes. */ + +#define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base) + +/* True iff NODE is the CLASSTYPE_AS_BASE version of some type. */ + +#define IS_FAKE_BASE_TYPE(NODE) \ + (TREE_CODE (NODE) == RECORD_TYPE \ + && TYPE_CONTEXT (NODE) && CLASS_TYPE_P (TYPE_CONTEXT (NODE)) \ + && CLASSTYPE_AS_BASE (TYPE_CONTEXT (NODE)) == (NODE)) + +/* These are the size and alignment of the type without its virtual + base classes, for when we use this type as a base itself. */ +#define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE)) +#define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE)) +#define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE)) +#define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE)) + +/* The alignment of NODE, without its virtual bases, in bytes. */ +#define CLASSTYPE_ALIGN_UNIT(NODE) \ + (CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT) + +/* True if this a Java interface type, declared with + '__attribute__ ((java_interface))'. */ +#define TYPE_JAVA_INTERFACE(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->java_interface) + +/* A VEC(tree) of virtual functions which cannot be inherited by + derived classes. When deriving from this type, the derived + 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)) + +/* Nonzero means that this class type is not POD for the purpose of layout + (as defined in the ABI). This is different from the language's POD. */ +#define CLASSTYPE_NON_LAYOUT_POD_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_class) + +/* Nonzero means that this class type is a non-standard-layout class. */ +#define CLASSTYPE_NON_STD_LAYOUT(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout) + +/* Nonzero means that this class contains pod types whose default + initialization is not a zero initialization (namely, pointers to + data members). */ +#define CLASSTYPE_NON_ZERO_INIT_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init) + +/* Nonzero if this class is "empty" in the sense of the C++ ABI. */ +#define CLASSTYPE_EMPTY_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->empty_p) + +/* Nonzero if this class is "nearly empty", i.e., contains only a + virtual function table pointer. */ +#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->nearly_empty_p) + +/* Nonzero if this class contains an empty subobject. */ +#define CLASSTYPE_CONTAINS_EMPTY_CLASS_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->contains_empty_class_p) + +/* A list of class types of which this type is a friend. The + TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the + case of a template friend. */ +#define CLASSTYPE_FRIEND_CLASSES(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->friend_classes) + +/* A list of the classes which grant friendship to this class. */ +#define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->befriending_classes) + +/* The associated LAMBDA_EXPR that made this class. */ +#define CLASSTYPE_LAMBDA_EXPR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr) +/* The extra mangling scope for this closure type. */ +#define LAMBDA_TYPE_EXTRA_SCOPE(NODE) \ + (LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE))) + +/* Say whether this node was declared as a "class" or a "struct". */ +#define CLASSTYPE_DECLARED_CLASS(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->declared_class) + +/* Nonzero if this class has const members + which have no specified initialization. */ +#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE) \ + (TYPE_LANG_SPECIFIC (NODE) \ + ? LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init : 0) +#define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init = (VALUE)) + +/* Nonzero if this class has ref members + which have no specified initialization. */ +#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE) \ + (TYPE_LANG_SPECIFIC (NODE) \ + ? LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init : 0) +#define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init = (VALUE)) + +/* Nonzero if this class is included from a header file which employs + `#pragma interface', and it is not included in its implementation file. */ +#define CLASSTYPE_INTERFACE_ONLY(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_only) + +/* True if we have already determined whether or not vtables, VTTs, + typeinfo, and other similar per-class data should be emitted in + this translation unit. This flag does not indicate whether or not + these items should be emitted; it only indicates that we know one + way or the other. */ +#define CLASSTYPE_INTERFACE_KNOWN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown == 0) +/* The opposite of CLASSTYPE_INTERFACE_KNOWN. */ +#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown) + +#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X)) +#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 1) +#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 0) + +/* Nonzero if a _DECL node requires us to output debug info for this class. */ +#define CLASSTYPE_DEBUG_REQUESTED(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->debug_requested) + +/* Additional macros for inheritance information. */ + +/* Nonzero means that this class is on a path leading to a new vtable. */ +#define BINFO_VTABLE_PATH_MARKED(NODE) BINFO_FLAG_1 (NODE) + +/* Nonzero means B (a BINFO) has its own vtable. Any copies will not + have this flag set. */ +#define BINFO_NEW_VTABLE_MARKED(B) (BINFO_FLAG_2 (B)) + +/* Compare a BINFO_TYPE with another type for equality. For a binfo, + this is functionally equivalent to using same_type_p, but + measurably faster. At least one of the arguments must be a + BINFO_TYPE. The other can be a BINFO_TYPE or a regular type. If + BINFO_TYPE(T) ever stops being the main variant of the class the + binfo is for, this macro must change. */ +#define SAME_BINFO_TYPE_P(A, B) ((A) == (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, \ + gcc_assert (!BINFO_PRIMARY_P (B) || BINFO_VIRTUAL_P (B)), \ + gcc_assert (TYPE_VFIELD (BINFO_TYPE (B)))) + +/* Nonzero if this binfo is for a dependent base - one that should not + be searched. */ +#define BINFO_DEPENDENT_BASE_P(NODE) BINFO_FLAG_3 (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 + base in the complete hierarchy. */ +#define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE) + +/* Nonzero if this BINFO is a primary base class. */ +#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE) + +/* Used by various search routines. */ +#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE) + +/* A VEC(tree_pair_s) of the vcall indices associated with the class + NODE. The PURPOSE of each element is a FUNCTION_DECL for a virtual + function. The VALUE is the index into the virtual table where the + vcall offset for that function is stored, when NODE is a virtual + base. */ +#define CLASSTYPE_VCALL_INDICES(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices) + +/* The various vtables for the class NODE. The primary vtable will be + first, followed by the construction vtables and VTT, if any. */ +#define CLASSTYPE_VTABLES(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->vtables) + +/* The std::type_info variable representing this class, or NULL if no + such variable has been created. This field is only set for the + TYPE_MAIN_VARIANT of the class. */ +#define CLASSTYPE_TYPEINFO_VAR(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var) + +/* Accessor macros for the BINFO_VIRTUALS list. */ + +/* The number of bytes by which to adjust the `this' pointer when + calling this virtual function. Subtract this value from the this + pointer. Always non-NULL, might be constant zero though. */ +#define BV_DELTA(NODE) (TREE_PURPOSE (NODE)) + +/* If non-NULL, the vtable index at which to find the vcall offset + when calling this virtual function. Add the value at that vtable + index to the this pointer. */ +#define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE)) + +/* The function to call. */ +#define BV_FN(NODE) (TREE_VALUE (NODE)) + +/* Whether or not this entry is for a lost primary virtual base. */ +#define BV_LOST_PRIMARY(NODE) (TREE_LANG_FLAG_0 (NODE)) + +/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that + this type can raise. Each TREE_VALUE is a _TYPE. The TREE_VALUE + will be NULL_TREE to indicate a throw specification of `()', or + no exceptions allowed. For a noexcept specification, TREE_VALUE + is NULL_TREE and TREE_PURPOSE is the constant-expression. */ +#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_LANG_SLOT_1 (NODE) + +/* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()' + or noexcept(true). */ +#define TYPE_NOTHROW_P(NODE) nothrow_spec_p (TYPE_RAISES_EXCEPTIONS (NODE)) + +/* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept. This is the + case for things declared noexcept(true) and, with -fnothrow-opt, for + throw() functions. */ +#define TYPE_NOEXCEPT_P(NODE) type_noexcept_p (NODE) + +/* The binding level associated with the namespace. */ +#define NAMESPACE_LEVEL(NODE) \ + (LANG_DECL_NS_CHECK (NODE)->level) + +/* Flags shared by all forms of DECL_LANG_SPECIFIC. + + Some of the flags live here only to make lang_decl_min/fn smaller. Do + not make this struct larger than 32 bits; instead, make sel smaller. */ + +struct GTY(()) lang_decl_base { + unsigned selector : 16; /* Larger than necessary for faster access. */ + ENUM_BITFIELD(languages) language : 4; + unsigned use_template : 2; + unsigned not_really_extern : 1; /* var or fn */ + unsigned initialized_in_class : 1; /* var or fn */ + unsigned repo_available_p : 1; /* var or fn */ + unsigned threadprivate_or_deleted_p : 1; /* var or fn */ + unsigned anticipated_p : 1; /* fn or type */ + unsigned friend_attr : 1; /* fn or type */ + unsigned template_conv_p : 1; /* var or template */ + unsigned odr_used : 1; /* var or fn */ + unsigned u2sel : 1; + /* 1 spare bit */ +}; + +/* True for DECL codes which have template info and access. */ +#define LANG_DECL_HAS_MIN(NODE) \ + (TREE_CODE (NODE) == FUNCTION_DECL \ + || TREE_CODE (NODE) == FIELD_DECL \ + || TREE_CODE (NODE) == VAR_DECL \ + || TREE_CODE (NODE) == CONST_DECL \ + || TREE_CODE (NODE) == TYPE_DECL \ + || TREE_CODE (NODE) == TEMPLATE_DECL \ + || TREE_CODE (NODE) == USING_DECL) + +/* DECL_LANG_SPECIFIC for the above codes. */ + +struct GTY(()) lang_decl_min { + struct lang_decl_base base; + + /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is + THUNK_ALIAS. + 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 template_info; + + union lang_decl_u2 { + /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is + THUNK_VIRTUAL_OFFSET. + Otherwise this is DECL_ACCESS. */ + tree GTY ((tag ("0"))) access; + + /* For VAR_DECL in function, this is DECL_DISCRIMINATOR. */ + int GTY ((tag ("1"))) discriminator; + } GTY ((desc ("%0.u.base.u2sel"))) u2; +}; + +/* Additional DECL_LANG_SPECIFIC information for functions. */ + +struct GTY(()) lang_decl_fn { + struct lang_decl_min min; + + /* In an overloaded operator, this is the value of + DECL_OVERLOADED_OPERATOR_P. */ + ENUM_BITFIELD (tree_code) operator_code : 16; + + unsigned global_ctor_p : 1; + unsigned global_dtor_p : 1; + unsigned constructor_attr : 1; + unsigned destructor_attr : 1; + unsigned assignment_operator_p : 1; + unsigned static_function : 1; + unsigned pure_virtual : 1; + unsigned defaulted_p : 1; + + unsigned has_in_charge_parm_p : 1; + unsigned has_vtt_parm_p : 1; + unsigned pending_inline_p : 1; + unsigned nonconverting : 1; + unsigned thunk_p : 1; + unsigned this_thunk_p : 1; + unsigned hidden_friend_p : 1; + /* 1 spare bit. */ + + /* 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; + + union lang_decl_u5 + { + /* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is + DECL_CLONED_FUNCTION. */ + tree GTY ((tag ("0"))) cloned_function; + + /* In a FUNCTION_DECL for which THUNK_P holds this is the + THUNK_FIXED_OFFSET. */ + HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset; + } GTY ((desc ("%1.thunk_p"))) u5; + + union lang_decl_u3 + { + struct cp_token_cache * GTY ((tag ("1"))) pending_inline_info; + struct language_function * GTY ((tag ("0"))) + saved_language_function; + } GTY ((desc ("%1.pending_inline_p"))) u; + +}; + +/* DECL_LANG_SPECIFIC for namespaces. */ + +struct GTY(()) lang_decl_ns { + struct lang_decl_base base; + struct cp_binding_level *level; +}; + +/* DECL_LANG_SPECIFIC for parameters. */ + +struct GTY(()) lang_decl_parm { + struct lang_decl_base base; + int level; + int index; +}; + +/* DECL_LANG_SPECIFIC for all types. It would be nice to just make this a + union rather than a struct containing a union as its only field, but + tree.h declares it as a struct. */ + +struct GTY((variable_size)) lang_decl { + union GTY((desc ("%h.base.selector"))) lang_decl_u { + struct lang_decl_base GTY ((default)) base; + struct lang_decl_min GTY((tag ("0"))) min; + struct lang_decl_fn GTY ((tag ("1"))) fn; + struct lang_decl_ns GTY((tag ("2"))) ns; + struct lang_decl_parm GTY((tag ("3"))) parm; + } u; +}; + +/* Looks through a template (if present) to find what it declares. */ +#define STRIP_TEMPLATE(NODE) \ + (TREE_CODE (NODE) == TEMPLATE_DECL ? DECL_TEMPLATE_RESULT (NODE) : NODE) + +#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) + +#define LANG_DECL_MIN_CHECK(NODE) __extension__ \ +({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ + if (!LANG_DECL_HAS_MIN (NODE)) \ + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ + <->u.min; }) + +/* We want to be able to check DECL_CONSTRUCTOR_P and such on a function + template, not just on a FUNCTION_DECL. So when looking for things in + lang_decl_fn, look down through a TEMPLATE_DECL into its result. */ +#define LANG_DECL_FN_CHECK(NODE) __extension__ \ +({ struct lang_decl *lt = DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE)); \ + if (!DECL_DECLARES_FUNCTION_P (NODE) || lt->u.base.selector != 1) \ + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ + <->u.fn; }) + +#define LANG_DECL_NS_CHECK(NODE) __extension__ \ +({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ + if (TREE_CODE (NODE) != NAMESPACE_DECL || lt->u.base.selector != 2) \ + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ + <->u.ns; }) + +#define LANG_DECL_PARM_CHECK(NODE) __extension__ \ +({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ + if (TREE_CODE (NODE) != PARM_DECL) \ + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ + <->u.parm; }) + +#define LANG_DECL_U2_CHECK(NODE, TF) __extension__ \ +({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \ + if (!LANG_DECL_HAS_MIN (NODE) || lt->u.base.u2sel != TF) \ + lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \ + <->u.min.u2; }) + +#else + +#define LANG_DECL_MIN_CHECK(NODE) \ + (&DECL_LANG_SPECIFIC (NODE)->u.min) + +#define LANG_DECL_FN_CHECK(NODE) \ + (&DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE))->u.fn) + +#define LANG_DECL_NS_CHECK(NODE) \ + (&DECL_LANG_SPECIFIC (NODE)->u.ns) + +#define LANG_DECL_PARM_CHECK(NODE) \ + (&DECL_LANG_SPECIFIC (NODE)->u.parm) + +#define LANG_DECL_U2_CHECK(NODE, TF) \ + (&DECL_LANG_SPECIFIC (NODE)->u.min.u2) + +#endif /* ENABLE_TREE_CHECKING */ + +/* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the + declaration. Some entities (like a member function in a local + class, or a local variable) do not have linkage at all, and this + macro should not be used in those cases. + + Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was + created by language-independent code, and has C linkage. Most + VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but + we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */ +#define DECL_LANGUAGE(NODE) \ + (DECL_LANG_SPECIFIC (NODE) \ + ? DECL_LANG_SPECIFIC (NODE)->u.base.language \ + : (TREE_CODE (NODE) == FUNCTION_DECL \ + ? lang_c : lang_cplusplus)) + +/* Set the language linkage for NODE to LANGUAGE. */ +#define SET_DECL_LANGUAGE(NODE, LANGUAGE) \ + (DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE)) + +/* For FUNCTION_DECLs: nonzero means that this function is a constructor. */ +#define DECL_CONSTRUCTOR_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->constructor_attr) + +/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete + object. */ +#define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \ + (DECL_CONSTRUCTOR_P (NODE) \ + && DECL_NAME (NODE) == complete_ctor_identifier) + +/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base + object. */ +#define DECL_BASE_CONSTRUCTOR_P(NODE) \ + (DECL_CONSTRUCTOR_P (NODE) \ + && DECL_NAME (NODE) == base_ctor_identifier) + +/* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the + specialized in-charge constructor or the specialized not-in-charge + constructor. */ +#define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE) \ + (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \ + && !DECL_CLONED_FUNCTION_P (NODE)) + +/* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor. */ +#define DECL_COPY_CONSTRUCTOR_P(NODE) \ + (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0) + +/* Nonzero if NODE (a FUNCTION_DECL) is a move constructor. */ +#define DECL_MOVE_CONSTRUCTOR_P(NODE) \ + (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE)) + +/* Nonzero if NODE is a destructor. */ +#define DECL_DESTRUCTOR_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->destructor_attr) + +/* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the + specialized in-charge constructor, in-charge deleting constructor, + or the base destructor. */ +#define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE) \ + (DECL_DECLARES_FUNCTION_P (NODE) && DECL_DESTRUCTOR_P (NODE) \ + && !DECL_CLONED_FUNCTION_P (NODE)) + +/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete + object. */ +#define DECL_COMPLETE_DESTRUCTOR_P(NODE) \ + (DECL_DESTRUCTOR_P (NODE) \ + && DECL_NAME (NODE) == complete_dtor_identifier) + +/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base + object. */ +#define DECL_BASE_DESTRUCTOR_P(NODE) \ + (DECL_DESTRUCTOR_P (NODE) \ + && DECL_NAME (NODE) == base_dtor_identifier) + +/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete + object that deletes the object after it has been destroyed. */ +#define DECL_DELETING_DESTRUCTOR_P(NODE) \ + (DECL_DESTRUCTOR_P (NODE) \ + && DECL_NAME (NODE) == deleting_dtor_identifier) + +/* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or + destructor. */ +#define DECL_CLONED_FUNCTION_P(NODE) (!!decl_cloned_function_p (NODE, true)) + +/* If DECL_CLONED_FUNCTION_P holds, this is the function that was + cloned. */ +#define DECL_CLONED_FUNCTION(NODE) (*decl_cloned_function_p (NODE, false)) + +/* Perform an action for each clone of FN, if FN is a function with + clones. This macro should be used like: + + FOR_EACH_CLONE (clone, fn) + { ... } + + */ +#define FOR_EACH_CLONE(CLONE, FN) \ + if (TREE_CODE (FN) == FUNCTION_DECL \ + && (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (FN) \ + || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (FN))) \ + for (CLONE = DECL_CHAIN (FN); \ + CLONE && DECL_CLONED_FUNCTION_P (CLONE); \ + CLONE = DECL_CHAIN (CLONE)) + +/* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS. */ +#define DECL_DISCRIMINATOR_P(NODE) \ + (TREE_CODE (NODE) == VAR_DECL \ + && DECL_FUNCTION_SCOPE_P (NODE)) + +/* Discriminator for name mangling. */ +#define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator) + +/* True iff DECL_DISCRIMINATOR is set for a DECL_DISCRIMINATOR_P decl. */ +#define DECL_DISCRIMINATOR_SET_P(NODE) \ + (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->u.base.u2sel == 1) + +/* The index of a user-declared parameter in its function, starting at 1. + All artificial parameters will have index 0. */ +#define DECL_PARM_INDEX(NODE) \ + (LANG_DECL_PARM_CHECK (NODE)->index) + +/* The level of a user-declared parameter in its function, starting at 1. + A parameter of the function will have level 1; a parameter of the first + nested function declarator (i.e. t in void f (void (*p)(T t))) will have + level 2. */ +#define DECL_PARM_LEVEL(NODE) \ + (LANG_DECL_PARM_CHECK (NODE)->level) + +/* Nonzero if the VTT parm has been added to NODE. */ +#define DECL_HAS_VTT_PARM_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p) + +/* Nonzero if NODE is a FUNCTION_DECL for which a VTT parameter is + required. */ +#define DECL_NEEDS_VTT_PARM_P(NODE) \ + (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (NODE)) \ + && (DECL_BASE_CONSTRUCTOR_P (NODE) \ + || DECL_BASE_DESTRUCTOR_P (NODE))) + +/* 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. */ +#define DECL_CONV_FN_TYPE(FN) \ + (DECL_CONV_FN_P (FN) ? TREE_TYPE (DECL_NAME (FN)) : NULL_TREE) + +/* Nonzero if NODE, which is a TEMPLATE_DECL, is a template + conversion operator to a type dependent on the innermost template + args. */ +#define DECL_TEMPLATE_CONV_FN_P(NODE) \ + (DECL_LANG_SPECIFIC (TEMPLATE_DECL_CHECK (NODE))->u.base.template_conv_p) + +/* Nonzero if NODE, a static data member, was declared in its class as an + array of unknown bound. */ +#define VAR_HAD_UNKNOWN_BOUND(NODE) \ + (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE)) \ + ? DECL_LANG_SPECIFIC (NODE)->u.base.template_conv_p \ + : false) +#define SET_VAR_HAD_UNKNOWN_BOUND(NODE) \ + (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.template_conv_p = true) + +/* Set the overloaded operator code for NODE to CODE. */ +#define SET_OVERLOADED_OPERATOR_CODE(NODE, CODE) \ + (LANG_DECL_FN_CHECK (NODE)->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 + value of ERROR_MARK is zero, this macro can be used as a predicate + to test whether or not NODE is an overloaded operator. */ +#define DECL_OVERLOADED_OPERATOR_P(NODE) \ + (IDENTIFIER_OPNAME_P (DECL_NAME (NODE)) \ + ? LANG_DECL_FN_CHECK (NODE)->operator_code : ERROR_MARK) + +/* Nonzero if NODE is an assignment operator (including += and such). */ +#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->assignment_operator_p) + +/* For FUNCTION_DECLs: nonzero means that this function is a + constructor or a destructor with an extra in-charge parameter to + control whether or not virtual bases are constructed. */ +#define DECL_HAS_IN_CHARGE_PARM_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p) + +/* Nonzero if DECL is a declaration of __builtin_constant_p. */ +#define DECL_IS_BUILTIN_CONSTANT_P(NODE) \ + (TREE_CODE (NODE) == FUNCTION_DECL \ + && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL \ + && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P) + +/* Nonzero for _DECL means that this decl appears in (or will appear + in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for + detecting circularity in case members are multiply defined. In the + case of a VAR_DECL, it is also used to determine how program storage + should be allocated. */ +#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE)) + +/* Nonzero for a VAR_DECL means that the variable's initialization (if + any) has been processed. (In general, DECL_INITIALIZED_P is + !DECL_EXTERN, but static data members may be initialized even if + not defined.) */ +#define DECL_INITIALIZED_P(NODE) \ + (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE))) + +/* Nonzero for a VAR_DECL iff an explicit initializer was provided. */ +#define DECL_NONTRIVIALLY_INITIALIZED_P(NODE) \ + (TREE_LANG_FLAG_3 (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 FUNCTION_DECLS that are defined in the class. */ +#define DECL_INITIALIZED_IN_CLASS_P(DECL) \ + (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \ + ->u.base.initialized_in_class) + +/* Nonzero if the DECL is used in the sense of 3.2 [basic.def.odr]. + Only available for decls with DECL_LANG_SPECIFIC. */ +#define DECL_ODR_USED(DECL) \ + (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \ + ->u.base.odr_used) + +/* Nonzero for DECL means that this decl is just a friend declaration, + and should not be added to the list of members for this class. */ +#define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.friend_attr) + +/* A TREE_LIST of the types which have befriended this FUNCTION_DECL. */ +#define DECL_BEFRIENDING_CLASSES(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->befriending_classes) + +/* Nonzero for FUNCTION_DECL means that this decl is a static + member function. */ +#define DECL_STATIC_FUNCTION_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->static_function) + +/* Nonzero for FUNCTION_DECL means that this decl is a non-static + member function. */ +#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \ + (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE) + +/* Nonzero for FUNCTION_DECL means that this decl is a member function + (static or non-static). */ +#define DECL_FUNCTION_MEMBER_P(NODE) \ + (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE)) + +/* Nonzero for FUNCTION_DECL means that this member function + has `this' as const X *const. */ +#define DECL_CONST_MEMFUNC_P(NODE) \ + (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \ + && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE \ + (TYPE_ARG_TYPES (TREE_TYPE (NODE)))))) + +/* Nonzero for FUNCTION_DECL means that this member function + has `this' as volatile X *const. */ +#define DECL_VOLATILE_MEMFUNC_P(NODE) \ + (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \ + && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE \ + (TYPE_ARG_TYPES (TREE_TYPE (NODE)))))) + +/* Nonzero for a DECL means that this member is a non-static member. */ +#define DECL_NONSTATIC_MEMBER_P(NODE) \ + (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) \ + || TREE_CODE (NODE) == FIELD_DECL) + +/* Nonzero for _DECL means that this member object type + is mutable. */ +#define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (NODE)) + +/* Nonzero for _DECL means that this constructor or conversion function is + non-converting. */ +#define DECL_NONCONVERTING_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->nonconverting) + +/* Nonzero for FUNCTION_DECL means that this member function is a pure + virtual function. */ +#define DECL_PURE_VIRTUAL_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->pure_virtual) + +/* True (in a FUNCTION_DECL) if NODE is a virtual function that is an + invalid overrider for a function from a base class. Once we have + complained about an invalid overrider we avoid complaining about it + again. */ +#define DECL_INVALID_OVERRIDER_P(NODE) \ + (DECL_LANG_FLAG_4 (NODE)) + +/* The thunks associated with NODE, a FUNCTION_DECL. */ +#define DECL_THUNKS(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->context) + +/* Nonzero if NODE is a thunk, rather than an ordinary function. */ +#define DECL_THUNK_P(NODE) \ + (TREE_CODE (NODE) == FUNCTION_DECL \ + && DECL_LANG_SPECIFIC (NODE) \ + && LANG_DECL_FN_CHECK (NODE)->thunk_p) + +/* Set DECL_THUNK_P for node. */ +#define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING) \ + (LANG_DECL_FN_CHECK (NODE)->thunk_p = 1, \ + LANG_DECL_FN_CHECK (NODE)->this_thunk_p = (THIS_ADJUSTING)) + +/* Nonzero if NODE is a this pointer adjusting thunk. */ +#define DECL_THIS_THUNK_P(NODE) \ + (DECL_THUNK_P (NODE) && LANG_DECL_FN_CHECK (NODE)->this_thunk_p) + +/* Nonzero if NODE is a result pointer adjusting thunk. */ +#define DECL_RESULT_THUNK_P(NODE) \ + (DECL_THUNK_P (NODE) && !LANG_DECL_FN_CHECK (NODE)->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)) + +/* Nonzero if NODE is `extern "C"'. */ +#define DECL_EXTERN_C_P(NODE) \ + (DECL_LANGUAGE (NODE) == lang_c) + +/* Nonzero if NODE is an `extern "C"' function. */ +#define DECL_EXTERN_C_FUNCTION_P(NODE) \ + (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE)) + +/* True iff DECL is an entity with vague linkage whose definition is + available in this translation unit. */ +#define DECL_REPO_AVAILABLE_P(NODE) \ + (DECL_LANG_SPECIFIC (NODE)->u.base.repo_available_p) + +/* True if DECL is declared 'constexpr'. */ +#define DECL_DECLARED_CONSTEXPR_P(DECL) \ + DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (STRIP_TEMPLATE (DECL))) + +/* 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. */ +#define DECL_CLASS_CONTEXT(NODE) \ + (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE) + +/* For a non-member friend function, the class (if any) in which this + friend was defined. For example, given: + + struct S { friend void f (); }; + + the DECL_FRIEND_CONTEXT for `f' will be `S'. */ +#define DECL_FRIEND_CONTEXT(NODE) \ + ((DECL_DECLARES_FUNCTION_P (NODE) \ + && DECL_FRIEND_P (NODE) && !DECL_FUNCTION_MEMBER_P (NODE)) \ + ? LANG_DECL_FN_CHECK (NODE)->context \ + : NULL_TREE) + +/* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT. */ +#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \ + (LANG_DECL_FN_CHECK (NODE)->context = (CONTEXT)) + +#define CP_DECL_CONTEXT(NODE) \ + (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace) +#define CP_TYPE_CONTEXT(NODE) \ + (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace) +#define FROB_CONTEXT(NODE) \ + ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE)) + +/* 1 iff NODE has namespace scope, including the global namespace. */ +#define DECL_NAMESPACE_SCOPE_P(NODE) \ + (!DECL_TEMPLATE_PARM_P (NODE) \ + && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL) + +#define TYPE_NAMESPACE_SCOPE_P(NODE) \ + (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL) + +#define NAMESPACE_SCOPE_P(NODE) \ + ((DECL_P (NODE) && DECL_NAMESPACE_SCOPE_P (NODE)) \ + || (TYPE_P (NODE) && TYPE_NAMESPACE_SCOPE_P (NODE))) + +/* 1 iff NODE is a class member. */ +#define DECL_CLASS_SCOPE_P(NODE) \ + (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE))) + +#define TYPE_CLASS_SCOPE_P(NODE) \ + (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE))) + +/* 1 iff NODE is function-local. */ +#define DECL_FUNCTION_SCOPE_P(NODE) \ + (DECL_CONTEXT (NODE) \ + && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL) + +#define TYPE_FUNCTION_SCOPE_P(NODE) \ + (TYPE_CONTEXT (NODE) && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL) + +/* 1 iff VAR_DECL node NODE is a type-info decl. This flag is set for + both the primary typeinfo object and the associated NTBS name. */ +#define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)) + +/* 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)) + +/* Returns 1 iff VAR_DECL is a construction virtual table. + DECL_VTABLE_OR_VTT_P will be true in this case and must be checked + before using this macro. */ +#define DECL_CONSTRUCTION_VTABLE_P(NODE) \ + TREE_LANG_FLAG_6 (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) + +/* For a NAMESPACE_DECL: the list of using namespace directives + The PURPOSE is the used namespace, the value is the namespace + that is the common ancestor. */ +#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX (NAMESPACE_DECL_CHECK (NODE)) + +/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users + 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_non_common.saved_tree) + +/* In a NAMESPACE_DECL, points to the original namespace if this is + a namespace alias. */ +#define DECL_NAMESPACE_ALIAS(NODE) \ + DECL_ABSTRACT_ORIGIN (NAMESPACE_DECL_CHECK (NODE)) +#define ORIGINAL_NAMESPACE(NODE) \ + (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE)) + +/* Nonzero if NODE is the std namespace. */ +#define DECL_NAMESPACE_STD_P(NODE) \ + (TREE_CODE (NODE) == NAMESPACE_DECL \ + && CP_DECL_CONTEXT (NODE) == global_namespace \ + && DECL_NAME (NODE) == std_identifier) + +/* In a TREE_LIST concatenating using directives, indicate indirect + directives */ +#define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->base.lang_flag_0) + +/* In a TREE_LIST in an attribute list, indicates that the attribute + must be applied at instantiation time. */ +#define ATTR_IS_DEPENDENT(NODE) (TREE_LIST_CHECK (NODE)->base.lang_flag_0) + +extern tree decl_shadowed_for_var_lookup (tree); +extern void decl_shadowed_for_var_insert (tree, tree); + +/* Non zero if this is a using decl for a dependent scope. */ +#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE)) + +/* The scope named in a using decl. */ +#define USING_DECL_SCOPE(NODE) TREE_TYPE (USING_DECL_CHECK (NODE)) + +/* The decls named by a using decl. */ +#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE)) + +/* In a VAR_DECL, true if we have a shadowed local variable + in the shadowed var table for this VAR_DECL. */ +#define DECL_HAS_SHADOWED_FOR_VAR_P(NODE) \ + (VAR_DECL_CHECK (NODE)->decl_with_vis.shadowed_for_var_p) + +/* In a VAR_DECL for a variable declared in a for statement, + this is the shadowed (local) variable. */ +#define DECL_SHADOWED_FOR_VAR(NODE) \ + (DECL_HAS_SHADOWED_FOR_VAR_P(NODE) ? decl_shadowed_for_var_lookup (NODE) : NULL) + +#define SET_DECL_SHADOWED_FOR_VAR(NODE, VAL) \ + (decl_shadowed_for_var_insert (NODE, VAL)) + +/* In a FUNCTION_DECL, this is nonzero if this function was defined in + the class definition. We have saved away the text of the function, + but have not yet processed it. */ +#define DECL_PENDING_INLINE_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->pending_inline_p) + +/* If DECL_PENDING_INLINE_P holds, this is the saved text of the + function. */ +#define DECL_PENDING_INLINE_INFO(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info) + +/* For a class type: if this structure has many fields, we'll sort them + and put them into a TREE_VEC. */ +#define CLASSTYPE_SORTED_FIELDS(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->sorted_fields) + +/* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL or + TEMPLATE_DECL, the entity is either a template specialization (if + DECL_USE_TEMPLATE is nonzero) or the abstract instance of the + template itself. + + In either case, DECL_TEMPLATE_INFO is a TREE_LIST, whose + TREE_PURPOSE is the TEMPLATE_DECL of which this entity is a + specialization or abstract instance. The TREE_VALUE is the + template arguments used to specialize the template. + + Consider: + + template struct S { friend void f(T) {} }; + + In this case, S::f is, from the point of view of the compiler, + an instantiation of a template -- but, from the point of view of + the language, each instantiation of S results in a wholly unrelated + global function f. In this case, DECL_TEMPLATE_INFO for S::f + will be non-NULL, but DECL_USE_TEMPLATE will be zero. */ +#define DECL_TEMPLATE_INFO(NODE) \ + (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \ + ->u.min.template_info) + +/* For a VAR_DECL, indicates that the variable is actually a + non-static data member of anonymous union that has been promoted to + variable status. */ +#define DECL_ANON_UNION_VAR_P(NODE) \ + (DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))) + +/* Template information for a RECORD_TYPE or UNION_TYPE. */ +#define CLASSTYPE_TEMPLATE_INFO(NODE) \ + (LANG_TYPE_CLASS_CHECK (RECORD_OR_UNION_CHECK (NODE))->template_info) + +/* Template information for an ENUMERAL_TYPE. Although an enumeration may + not be a primary template, it may be declared within the scope of a + primary template and the enumeration constants may depend on + non-type template parameters. */ +#define ENUM_TEMPLATE_INFO(NODE) \ + (TYPE_LANG_SLOT_1 (ENUMERAL_TYPE_CHECK (NODE))) + +/* Template information for a template template parameter. */ +#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \ + (LANG_TYPE_CLASS_CHECK (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE)) \ + ->template_info) + +/* Template information for an ENUMERAL_, RECORD_, or UNION_TYPE. */ +#define TYPE_TEMPLATE_INFO(NODE) \ + (TREE_CODE (NODE) == ENUMERAL_TYPE \ + ? ENUM_TEMPLATE_INFO (NODE) : \ + (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM \ + ? TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (NODE) : \ + (TYPE_LANG_SPECIFIC (NODE) \ + ? CLASSTYPE_TEMPLATE_INFO (NODE) \ + : NULL_TREE))) + +/* Set the template information for an ENUMERAL_, RECORD_, or + UNION_TYPE to VAL. */ +#define SET_TYPE_TEMPLATE_INFO(NODE, VAL) \ + (TREE_CODE (NODE) == ENUMERAL_TYPE \ + ? (ENUM_TEMPLATE_INFO (NODE) = (VAL)) \ + : (CLASSTYPE_TEMPLATE_INFO (NODE) = (VAL))) + +#define TI_TEMPLATE(NODE) TREE_TYPE (TEMPLATE_INFO_CHECK (NODE)) +#define TI_ARGS(NODE) TREE_CHAIN (TEMPLATE_INFO_CHECK (NODE)) +#define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE) +/* For a given TREE_VEC containing a template argument list, + this property contains the number of arguments that are not + defaulted. */ +#define NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) TREE_CHAIN (TREE_VEC_CHECK (NODE)) +/* Below are the setter and getter of the NON_DEFAULT_TEMPLATE_ARGS_COUNT + property. */ +#define SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE, INT_VALUE) \ + NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) = build_int_cst (NULL_TREE, INT_VALUE) +#ifdef ENABLE_CHECKING +#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \ + int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) +#else +#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \ + NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE) \ + ? int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) \ + : TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (NODE)) +#endif +/* The list of typedefs - used in the template - that need + access checking at template instantiation time. */ +#define TI_TYPEDEFS_NEEDING_ACCESS_CHECKING(NODE) \ + ((struct tree_template_info*)TEMPLATE_INFO_CHECK \ + (NODE))->typedefs_needing_access_checking + +/* We use TREE_VECs to hold template arguments. If there is only one + level of template arguments, then the TREE_VEC contains the + arguments directly. If there is more than one level of template + arguments, then each entry in the TREE_VEC is itself a TREE_VEC, + containing the template arguments for a single level. The first + entry in the outer TREE_VEC is the outermost level of template + parameters; the last is the innermost. + + It is incorrect to ever form a template argument vector containing + only one level of arguments, but which is a TREE_VEC containing as + its only entry the TREE_VEC for that level. + + For each TREE_VEC containing the template arguments for a single + level, it's possible to get or set the number of non defaulted + template arguments by using the accessor macros + GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT or + SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT. */ + +/* 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_LENGTH (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 + the parser, we use a TREE_LIST rather than a TREE_VEC to represent + template arguments. In fact, we may even see NULL_TREE if there + are no template arguments. In both of those cases, there is only + one level of template arguments. */ +#define TMPL_ARGS_DEPTH(NODE) \ + (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) : 1) + +/* The LEVELth level of the template ARGS. The outermost level of + args is level 1, not level 0. */ +#define TMPL_ARGS_LEVEL(ARGS, LEVEL) \ + (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS) \ + ? TREE_VEC_ELT (ARGS, (LEVEL) - 1) : (ARGS)) + +/* Set the LEVELth level of the template ARGS to VAL. This macro does + not work with single-level argument vectors. */ +#define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL) \ + (TREE_VEC_ELT (ARGS, (LEVEL) - 1) = (VAL)) + +/* Accesses the IDXth parameter in the LEVELth level of the ARGS. */ +#define TMPL_ARG(ARGS, LEVEL, IDX) \ + (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX)) + +/* 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) \ + (get_innermost_template_args ((NODE), 1)) + +/* The number of levels of template parameters given by NODE. */ +#define TMPL_PARMS_DEPTH(NODE) \ + ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE))) + +/* The TEMPLATE_DECL instantiated or specialized by NODE. This + TEMPLATE_DECL will be the immediate parent, not the most general + template. For example, in: + + template struct S { template void f(U); } + + the FUNCTION_DECL for S::f will have, as its + 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)) + +/* The template arguments used to obtain this decl from the most + general form of DECL_TI_TEMPLATE. For the example given for + DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These + are always the full set of arguments required to instantiate this + declaration from the most general template specialized here. */ +#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE)) + +/* The TEMPLATE_DECL associated with NODE, a class type. Even if NODE + will be generated from a partial specialization, the TEMPLATE_DECL + referred to here will be the original template. For example, + given: + + template struct S {}; + template struct S {}; + + the CLASSTPYE_TI_TEMPLATE for S will be S, not the S. */ +#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE)) +#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_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 CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs. */ +#define TYPE_TI_TEMPLATE(NODE) \ + (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE))) + +/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ +#define TYPE_TI_ARGS(NODE) \ + (TI_ARGS (TYPE_TEMPLATE_INFO (NODE))) + +#define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE (NODE) + +/* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the + sense of [temp.mem]. */ +#define DECL_MEMBER_TEMPLATE_P(NODE) \ + (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE))) + +/* Nonzero if the NODE corresponds to the template parameters for a + member template, whose inline definition is being processed after + the class definition is complete. */ +#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE) + +/* Determine if a parameter (i.e., a PARM_DECL) is a function + parameter pack. */ +#define FUNCTION_PARAMETER_PACK_P(NODE) \ + (DECL_LANG_FLAG_1 (PARM_DECL_CHECK (NODE))) + +/* Determines if NODE is an expansion of one or more parameter packs, + e.g., a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION. */ +#define PACK_EXPANSION_P(NODE) \ + (TREE_CODE (NODE) == TYPE_PACK_EXPANSION \ + || TREE_CODE (NODE) == EXPR_PACK_EXPANSION) + +/* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or + EXPR_PACK_EXPANSION. */ +#define PACK_EXPANSION_PATTERN(NODE) \ + (TREE_CODE (NODE) == TYPE_PACK_EXPANSION? TREE_TYPE (NODE) \ + : TREE_OPERAND (NODE, 0)) + +/* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or + EXPR_PACK_EXPANSION. */ +#define SET_PACK_EXPANSION_PATTERN(NODE,VALUE) \ + if (TREE_CODE (NODE) == TYPE_PACK_EXPANSION) \ + TREE_TYPE (NODE) = VALUE; \ + else \ + TREE_OPERAND (NODE, 0) = VALUE + +/* The list of parameter packs used in the PACK_EXPANSION_* node. The + TREE_VALUE of each TREE_LIST contains the parameter packs. */ +#define PACK_EXPANSION_PARAMETER_PACKS(NODE) TREE_CHAIN (NODE) + +/* Determine if this is an argument pack. */ +#define ARGUMENT_PACK_P(NODE) \ + (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK \ + || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK) + +/* The arguments stored in an argument pack. Arguments are stored in a + TREE_VEC, which may have length zero. */ +#define ARGUMENT_PACK_ARGS(NODE) \ + (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK? TREE_TYPE (NODE) \ + : TREE_OPERAND (NODE, 0)) + +/* Set the arguments stored in an argument pack. VALUE must be a + TREE_VEC. */ +#define SET_ARGUMENT_PACK_ARGS(NODE,VALUE) \ + if (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK) \ + TREE_TYPE (NODE) = VALUE; \ + else \ + TREE_OPERAND (NODE, 0) = VALUE + +/* Whether the argument pack is "incomplete", meaning that more + arguments can still be deduced. Incomplete argument packs are only + used when the user has provided an explicit template argument list + for a variadic function template. Some of the explicit template + arguments will be placed into the beginning of the argument pack, + but additional arguments might still be deduced. */ +#define ARGUMENT_PACK_INCOMPLETE_P(NODE) \ + TREE_LANG_FLAG_0 (ARGUMENT_PACK_ARGS (NODE)) + +/* When ARGUMENT_PACK_INCOMPLETE_P, stores the explicit template + arguments used to fill this pack. */ +#define ARGUMENT_PACK_EXPLICIT_ARGS(NODE) \ + TREE_TYPE (ARGUMENT_PACK_ARGS (NODE)) + +/* In an ARGUMENT_PACK_SELECT, the argument pack from which an + argument will be selected. */ +#define ARGUMENT_PACK_SELECT_FROM_PACK(NODE) \ + (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->argument_pack) + +/* In an ARGUMENT_PACK_SELECT, the index of the argument we want to + select. */ +#define ARGUMENT_PACK_SELECT_INDEX(NODE) \ + (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->index) + +/* In an ARGUMENT_PACK_SELECT, the actual underlying argument that the + ARGUMENT_PACK_SELECT represents. */ +#define ARGUMENT_PACK_SELECT_ARG(NODE) \ + TREE_VEC_ELT (ARGUMENT_PACK_ARGS (ARGUMENT_PACK_SELECT_FROM_PACK (NODE)), \ + ARGUMENT_PACK_SELECT_INDEX (NODE)); + +/* In a FUNCTION_DECL, the saved language-specific per-function data. */ +#define DECL_SAVED_FUNCTION_DATA(NODE) \ + (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE)) \ + ->u.saved_language_function) + +/* Indicates an indirect_expr is for converting a reference. */ +#define REFERENCE_REF_P(NODE) \ + TREE_LANG_FLAG_0 (INDIRECT_REF_CHECK (NODE)) + +#define NEW_EXPR_USE_GLOBAL(NODE) \ + TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE)) +#define DELETE_EXPR_USE_GLOBAL(NODE) \ + TREE_LANG_FLAG_0 (DELETE_EXPR_CHECK (NODE)) +#define DELETE_EXPR_USE_VEC(NODE) \ + TREE_LANG_FLAG_1 (DELETE_EXPR_CHECK (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 (COMPOUND_EXPR_CHECK (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 (CALL_EXPR_CHECK (NODE)) + +/* Indicates whether a string literal has been parenthesized. Such + usages are disallowed in certain circumstances. */ + +#define PAREN_STRING_LITERAL_P(NODE) \ + TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE)) + +/* Nonzero if this AGGR_INIT_EXPR provides for initialization via a + constructor call, rather than an ordinary function call. */ +#define AGGR_INIT_VIA_CTOR_P(NODE) \ + TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE)) + +/* Nonzero if expanding this AGGR_INIT_EXPR should first zero-initialize + the object. */ +#define AGGR_INIT_ZERO_FIRST(NODE) \ + TREE_LANG_FLAG_2 (AGGR_INIT_EXPR_CHECK (NODE)) + +/* AGGR_INIT_EXPR accessors. These are equivalent to the CALL_EXPR + accessors, except for AGGR_INIT_EXPR_SLOT (which takes the place of + CALL_EXPR_STATIC_CHAIN). */ + +#define AGGR_INIT_EXPR_FN(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 1) +#define AGGR_INIT_EXPR_SLOT(NODE) \ + TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2) +#define AGGR_INIT_EXPR_ARG(NODE, I) \ + TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), (I) + 3) +#define aggr_init_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH(NODE) - 3) + +/* AGGR_INIT_EXPR_ARGP returns a pointer to the argument vector for NODE. + We can't use &AGGR_INIT_EXPR_ARG (NODE, 0) because that will complain if + the argument count is zero when checking is enabled. Instead, do + the pointer arithmetic to advance past the 3 fixed operands in a + AGGR_INIT_EXPR. That produces a valid pointer to just past the end of + the operand array, even if it's not valid to dereference it. */ +#define AGGR_INIT_EXPR_ARGP(NODE) \ + (&(TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 0)) + 3) + +/* Abstract iterators for AGGR_INIT_EXPRs. */ + +/* Structure containing iterator state. */ +typedef struct aggr_init_expr_arg_iterator_d { + tree t; /* the aggr_init_expr */ + int n; /* argument count */ + int i; /* next argument index */ +} aggr_init_expr_arg_iterator; + +/* Initialize the abstract argument list iterator object ITER with the + arguments from AGGR_INIT_EXPR node EXP. */ +static inline void +init_aggr_init_expr_arg_iterator (tree exp, + aggr_init_expr_arg_iterator *iter) +{ + iter->t = exp; + iter->n = aggr_init_expr_nargs (exp); + iter->i = 0; +} + +/* Return the next argument from abstract argument list iterator object ITER, + and advance its state. Return NULL_TREE if there are no more arguments. */ +static inline tree +next_aggr_init_expr_arg (aggr_init_expr_arg_iterator *iter) +{ + tree result; + if (iter->i >= iter->n) + return NULL_TREE; + result = AGGR_INIT_EXPR_ARG (iter->t, iter->i); + iter->i++; + return result; +} + +/* Initialize the abstract argument list iterator object ITER, then advance + past and return the first argument. Useful in for expressions, e.g. + for (arg = first_aggr_init_expr_arg (exp, &iter); arg; + arg = next_aggr_init_expr_arg (&iter)) */ +static inline tree +first_aggr_init_expr_arg (tree exp, aggr_init_expr_arg_iterator *iter) +{ + init_aggr_init_expr_arg_iterator (exp, iter); + return next_aggr_init_expr_arg (iter); +} + +/* Test whether there are more arguments in abstract argument list iterator + ITER, without changing its state. */ +static inline bool +more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) +{ + return (iter->i < iter->n); +} + +/* Iterate through each argument ARG of AGGR_INIT_EXPR CALL, using variable + ITER (of type aggr_init_expr_arg_iterator) to hold the iteration state. */ +#define FOR_EACH_AGGR_INIT_EXPR_ARG(arg, iter, call) \ + for ((arg) = first_aggr_init_expr_arg ((call), &(iter)); (arg); \ + (arg) = next_aggr_init_expr_arg (&(iter))) + +/* VEC_INIT_EXPR accessors. */ +#define VEC_INIT_EXPR_SLOT(NODE) TREE_OPERAND (NODE, 0) +#define VEC_INIT_EXPR_INIT(NODE) TREE_OPERAND (NODE, 1) + +/* Indicates that a VEC_INIT_EXPR is a potential constant expression. + Only set when the current function is constexpr. */ +#define VEC_INIT_EXPR_IS_CONSTEXPR(NODE) \ + TREE_LANG_FLAG_0 (VEC_INIT_EXPR_CHECK (NODE)) + +/* Indicates that a VEC_INIT_EXPR is expressing value-initialization. */ +#define VEC_INIT_EXPR_VALUE_INIT(NODE) \ + TREE_LANG_FLAG_1 (VEC_INIT_EXPR_CHECK (NODE)) + +/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a + TEMPLATE_DECL. This macro determines whether or not a given class + type is really a template type, as opposed to an instantiation or + specialization of one. */ +#define CLASSTYPE_IS_TEMPLATE(NODE) \ + (CLASSTYPE_TEMPLATE_INFO (NODE) \ + && !CLASSTYPE_USE_TEMPLATE (NODE) \ + && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))) + +/* The name used by the user to name the typename type. Typically, + this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the + corresponding TYPE_DECL. However, this may also be a + TEMPLATE_ID_EXPR if we had something like `typename X::Y'. */ +#define TYPENAME_TYPE_FULLNAME(NODE) (TYPENAME_TYPE_CHECK (NODE))->type.values + +/* True if a TYPENAME_TYPE was declared as an "enum". */ +#define TYPENAME_IS_ENUM_P(NODE) \ + (TREE_LANG_FLAG_0 (TYPENAME_TYPE_CHECK (NODE))) + +/* True if a TYPENAME_TYPE was declared as a "class", "struct", or + "union". */ +#define TYPENAME_IS_CLASS_P(NODE) \ + (TREE_LANG_FLAG_1 (TYPENAME_TYPE_CHECK (NODE))) + +/* True if a TYPENAME_TYPE is in the process of being resolved. */ +#define TYPENAME_IS_RESOLVING_P(NODE) \ + (TREE_LANG_FLAG_2 (TYPENAME_TYPE_CHECK (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)) + +/* [class.virtual] + + A class that declares or inherits a virtual function is called a + polymorphic class. */ +#define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE)) + +/* Nonzero if this class has a virtual function table pointer. */ +#define TYPE_CONTAINS_VPTR_P(NODE) \ + (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE)) + +/* This flag is true of a local VAR_DECL if it was declared in a for + statement, but we are no longer in the scope of the for. */ +#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE)) + +/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL + if we already emitted a warning about using it. */ +#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)) + +/* Nonzero if NODE is a FUNCTION_DECL (for a function with global + scope) declared in a local scope. */ +#define DECL_LOCAL_FUNCTION_P(NODE) \ + DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE)) + +/* Nonzero if NODE is a DECL which we know about but which has not + been explicitly declared, such as a built-in function or a friend + declared inside a class. In the latter case DECL_HIDDEN_FRIEND_P + will be set. */ +#define DECL_ANTICIPATED(NODE) \ + (DECL_LANG_SPECIFIC (DECL_COMMON_CHECK (NODE))->u.base.anticipated_p) + +/* Nonzero if NODE is a FUNCTION_DECL which was declared as a friend + within a class but has not been declared in the surrounding scope. + The function is invisible except via argument dependent lookup. */ +#define DECL_HIDDEN_FRIEND_P(NODE) \ + (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->hidden_friend_p) + +/* Nonzero if DECL has been declared threadprivate by + #pragma omp threadprivate. */ +#define CP_DECL_THREADPRIVATE_P(DECL) \ + (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p) + +/* Nonzero if DECL was declared with '= delete'. */ +#define DECL_DELETED_FN(DECL) \ + (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p) + +/* Nonzero if DECL was declared with '= default' (maybe implicitly). */ +#define DECL_DEFAULTED_FN(DECL) \ + (LANG_DECL_FN_CHECK (DECL)->defaulted_p) + +/* Nonzero if DECL is explicitly defaulted in the class body. */ +#define DECL_DEFAULTED_IN_CLASS_P(DECL) \ + (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL)) +/* Nonzero if DECL was defaulted outside the class body. */ +#define DECL_DEFAULTED_OUTSIDE_CLASS_P(DECL) \ + (DECL_DEFAULTED_FN (DECL) \ + && !(DECL_ARTIFICIAL (DECL) || DECL_INITIALIZED_IN_CLASS_P (DECL))) + +/* Record whether a typedef for type `int' was actually `signed int'. */ +#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) + +/* Returns nonzero if DECL has external linkage, as specified by the + language standard. (This predicate may hold even when the + corresponding entity is not actually given external linkage in the + object file; see decl_linkage for details.) */ +#define DECL_EXTERNAL_LINKAGE_P(DECL) \ + (decl_linkage (DECL) == lk_external) + +/* Keep these codes in ascending code order. */ + +#define INTEGRAL_CODE_P(CODE) \ + ((CODE) == ENUMERAL_TYPE \ + || (CODE) == BOOLEAN_TYPE \ + || (CODE) == INTEGER_TYPE) + +/* [basic.fundamental] + + Types bool, char, wchar_t, and the signed and unsigned integer types + are collectively called integral types. + + Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration + types as well, which is incorrect in C++. Keep these checks in + ascending code order. */ +#define CP_INTEGRAL_TYPE_P(TYPE) \ + (TREE_CODE (TYPE) == BOOLEAN_TYPE \ + || TREE_CODE (TYPE) == INTEGER_TYPE) + +/* Returns true if TYPE is an integral or enumeration name. Keep + these checks in ascending code order. */ +#define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \ + (TREE_CODE (TYPE) == ENUMERAL_TYPE || CP_INTEGRAL_TYPE_P (TYPE)) + +/* Returns true if TYPE is an integral or unscoped enumeration type. */ +#define INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P(TYPE) \ + (UNSCOPED_ENUM_P (TYPE) || CP_INTEGRAL_TYPE_P (TYPE)) + +/* True if the class type TYPE is a literal type. */ +#define CLASSTYPE_LITERAL_P(TYPE) \ + (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal) + +/* [basic.fundamental] + + Integral and floating types are collectively called arithmetic + types. + + As a GNU extension, we also accept complex types. + + Keep these checks in ascending code order. */ +#define ARITHMETIC_TYPE_P(TYPE) \ + (CP_INTEGRAL_TYPE_P (TYPE) \ + || TREE_CODE (TYPE) == REAL_TYPE \ + || TREE_CODE (TYPE) == COMPLEX_TYPE) + +/* True iff TYPE is cv decltype(nullptr). */ +#define NULLPTR_TYPE_P(TYPE) (TREE_CODE (TYPE) == NULLPTR_TYPE) + +/* [basic.types] + + Arithmetic types, enumeration types, pointer types, + pointer-to-member types, and std::nullptr_t are collectively called + scalar types. + + Keep these checks in ascending code order. */ +#define SCALAR_TYPE_P(TYPE) \ + (TYPE_PTRMEM_P (TYPE) \ + || TREE_CODE (TYPE) == ENUMERAL_TYPE \ + || ARITHMETIC_TYPE_P (TYPE) \ + || TYPE_PTR_P (TYPE) \ + || TYPE_PTRMEMFUNC_P (TYPE) \ + || NULLPTR_TYPE_P (TYPE)) + +/* Determines whether this type is a C++0x scoped enumeration + type. Scoped enumerations types are introduced via "enum class" or + "enum struct", e.g., + + enum class Color { + Red, Green, Blue + }; + + Scoped enumeration types are different from normal (unscoped) + enumeration types in several ways: + + - The enumerators of a scoped enumeration type are only available + within the scope of the enumeration type and not in the + enclosing scope. For example, the Red color can be referred to + with "Color::Red" but not "Red". + + - Scoped enumerators and enumerations do not implicitly convert + to integers or 'bool'. + + - The underlying type of the enum is well-defined. */ +#define SCOPED_ENUM_P(TYPE) \ + (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_SCOPED (TYPE)) + +/* Determine whether this is an unscoped enumeration type. */ +#define UNSCOPED_ENUM_P(TYPE) \ + (TREE_CODE (TYPE) == ENUMERAL_TYPE && !ENUM_IS_SCOPED (TYPE)) + +/* Set the flag indicating whether an ENUMERAL_TYPE is a C++0x scoped + enumeration type (1) or a normal (unscoped) enumeration type + (0). */ +#define SET_SCOPED_ENUM_P(TYPE, VAL) \ + (ENUM_IS_SCOPED (TYPE) = (VAL)) + +#define SET_OPAQUE_ENUM_P(TYPE, VAL) \ + (ENUM_IS_OPAQUE (TYPE) = (VAL)) + +#define OPAQUE_ENUM_P(TYPE) \ + (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE)) + +/* Determines whether an ENUMERAL_TYPE has an explicit + underlying type. */ +#define ENUM_FIXED_UNDERLYING_TYPE_P(NODE) (TYPE_LANG_FLAG_5 (NODE)) + +/* Returns the underlying type of the given enumeration type. The + underlying type is determined in different ways, depending on the + properties of the enum: + + - In C++0x, the underlying type can be explicitly specified, e.g., + + enum E1 : char { ... } // underlying type is char + + - In a C++0x scoped enumeration, the underlying type is int + unless otherwises specified: + + enum class E2 { ... } // underlying type is int + + - Otherwise, the underlying type is determined based on the + values of the enumerators. In this case, the + ENUM_UNDERLYING_TYPE will not be set until after the definition + of the enumeration is completed by finish_enum. */ +#define ENUM_UNDERLYING_TYPE(TYPE) \ + TREE_TYPE (ENUMERAL_TYPE_CHECK (TYPE)) + +/* [dcl.init.aggr] + + An aggregate is an array or a class with no user-declared + constructors, no private or protected non-static data members, no + base classes, and no virtual functions. + + As an extension, we also treat vectors as aggregates. Keep these + checks in ascending code order. */ +#define CP_AGGREGATE_TYPE_P(TYPE) \ + (TREE_CODE (TYPE) == VECTOR_TYPE \ + ||TREE_CODE (TYPE) == ARRAY_TYPE \ + || (CLASS_TYPE_P (TYPE) && !CLASSTYPE_NON_AGGREGATE (TYPE))) + +/* Nonzero for a class type means that the class type has a + user-declared constructor. */ +#define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE)) + +/* When appearing in an INDIRECT_REF, it means that the tree structure + underneath is actually a call to a constructor. This is needed + when the constructor must initialize local storage (which can + be automatically destroyed), rather than allowing it to allocate + space from the heap. + + When appearing in a SAVE_EXPR, it means that underneath + is a call to a constructor. + + When appearing in a CONSTRUCTOR, the expression is a + compound literal. + + When appearing in a FIELD_DECL, it means that this field + has been duly initialized in its constructor. */ +#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE)) + +/* True if NODE is a brace-enclosed initializer. */ +#define BRACE_ENCLOSED_INITIALIZER_P(NODE) \ + (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node) + +/* True if NODE is a compound-literal, i.e., a brace-enclosed + initializer cast to a particular type. */ +#define COMPOUND_LITERAL_P(NODE) \ + (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE)) + +#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \ + && VEC_empty (constructor_elt, \ + CONSTRUCTOR_ELTS (NODE)) \ + && !TREE_HAS_CONSTRUCTOR (NODE)) + +/* True if NODE is a init-list used as a direct-initializer, i.e. + B b{1,2}, not B b({1,2}) or B b = {1,2}. */ +#define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE))) + +/* Nonzero means that an object of this type can not be initialized using + an initializer list. */ +#define CLASSTYPE_NON_AGGREGATE(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate) +#define TYPE_NON_AGGREGATE_CLASS(NODE) \ + (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE)) + +/* Nonzero if there is a non-trivial X::op=(cv X&) for this class. */ +#define TYPE_HAS_COMPLEX_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_assign) + +/* Nonzero if there is a non-trivial X::X(cv X&) for this class. */ +#define TYPE_HAS_COMPLEX_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_ctor) + +/* Nonzero if there is a non-trivial X::op=(X&&) for this class. */ +#define TYPE_HAS_COMPLEX_MOVE_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_assign) + +/* Nonzero if there is a non-trivial X::X(X&&) for this class. */ +#define TYPE_HAS_COMPLEX_MOVE_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_ctor) + +/* Nonzero if there is a non-trivial default constructor for this class. */ +#define TYPE_HAS_COMPLEX_DFLT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt) + +/* Nonzero if TYPE has a trivial destructor. From [class.dtor]: + + A destructor is trivial if it is an implicitly declared + destructor and if: + + - all of the direct base classes of its class have trivial + destructors, + + - for all of the non-static data members of its class that are + of class type (or array thereof), each such class has a + trivial destructor. */ +#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \ + (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE)) + +/* Nonzero for _TYPE node means that this type does not have a trivial + destructor. Therefore, destroying an object of this type will + involve a call to a destructor. This can apply to objects of + ARRAY_TYPE is the type of the elements needs a destructor. */ +#define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \ + (TYPE_LANG_FLAG_4 (NODE)) + +/* Nonzero for class type means that the default constructor is trivial. */ +#define TYPE_HAS_TRIVIAL_DFLT(NODE) \ + (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && ! TYPE_HAS_COMPLEX_DFLT (NODE)) + +/* Nonzero for class type means that copy initialization of this type can use + a bitwise copy. */ +#define TYPE_HAS_TRIVIAL_COPY_CTOR(NODE) \ + (TYPE_HAS_COPY_CTOR (NODE) && ! TYPE_HAS_COMPLEX_COPY_CTOR (NODE)) + +/* Nonzero for class type means that assignment of this type can use + a bitwise copy. */ +#define TYPE_HAS_TRIVIAL_COPY_ASSIGN(NODE) \ + (TYPE_HAS_COPY_ASSIGN (NODE) && ! TYPE_HAS_COMPLEX_COPY_ASSIGN (NODE)) + +/* Returns true if NODE is a pointer-to-data-member. */ +#define TYPE_PTRMEM_P(NODE) \ + (TREE_CODE (NODE) == OFFSET_TYPE) +/* Returns true if NODE is a pointer. */ +#define TYPE_PTR_P(NODE) \ + (TREE_CODE (NODE) == POINTER_TYPE) + +/* Returns true if NODE is an object type: + + [basic.types] + + An object type is a (possibly cv-qualified) type that is not a + function type, not a reference type, and not a void type. + + Keep these checks in ascending order, for speed. */ +#define TYPE_OBJ_P(NODE) \ + (TREE_CODE (NODE) != REFERENCE_TYPE \ + && TREE_CODE (NODE) != VOID_TYPE \ + && TREE_CODE (NODE) != FUNCTION_TYPE \ + && TREE_CODE (NODE) != METHOD_TYPE) + +/* Returns true if NODE is a pointer to an object. Keep these checks + in ascending tree code order. */ +#define TYPE_PTROB_P(NODE) \ + (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE))) + +/* Returns true if NODE is a reference to an object. Keep these checks + in ascending tree code order. */ +#define TYPE_REF_OBJ_P(NODE) \ + (TREE_CODE (NODE) == REFERENCE_TYPE && TYPE_OBJ_P (TREE_TYPE (NODE))) + +/* Returns true if NODE is a pointer to an object, or a pointer to + void. Keep these checks in ascending tree code order. */ +#define TYPE_PTROBV_P(NODE) \ + (TYPE_PTR_P (NODE) \ + && !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \ + || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)) + +/* Returns true if NODE is a pointer to function. */ +#define TYPE_PTRFN_P(NODE) \ + (TREE_CODE (NODE) == POINTER_TYPE \ + && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) + +/* Returns true if NODE is a reference to function. */ +#define TYPE_REFFN_P(NODE) \ + (TREE_CODE (NODE) == REFERENCE_TYPE \ + && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE) + +/* Nonzero for _TYPE node means that this type is a pointer to member + function type. */ +#define TYPE_PTRMEMFUNC_P(NODE) \ + (TREE_CODE (NODE) == RECORD_TYPE \ + && TYPE_LANG_SPECIFIC (NODE) \ + && TYPE_PTRMEMFUNC_FLAG (NODE)) + +#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 (TREE_CHECK2 ((NODE), ADDR_EXPR, OFFSET_REF)) + +/* Get the POINTER_TYPE to the METHOD_TYPE associated with this + pointer to member function. TYPE_PTRMEMFUNC_P _must_ be true, + before using this macro. */ +#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \ + (TREE_TYPE (TYPE_FIELDS (NODE))) + +/* Returns `A' for a type like `int (A::*)(double)' */ +#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \ + TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE))) + +/* These are use to manipulate the canonical RECORD_TYPE from the + hashed POINTER_TYPE, and can only be used on the POINTER_TYPE. */ +#define TYPE_GET_PTRMEMFUNC_TYPE(NODE) \ + (TYPE_LANG_SPECIFIC (NODE) ? LANG_TYPE_PTRMEM_CHECK (NODE)->record : NULL) +#define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE) \ + do { \ + if (TYPE_LANG_SPECIFIC (NODE) == NULL) \ + { \ + TYPE_LANG_SPECIFIC (NODE) = ggc_alloc_cleared_lang_type \ + (sizeof (struct lang_type_ptrmem)); \ + TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0; \ + } \ + TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.record = (VALUE); \ + } while (0) + +/* For a pointer-to-member type of the form `T X::*', this is `X'. + For a type like `void (X::*)() const', this type is `X', not `const + X'. To get at the `const X' you have to look at the + TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have + 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 + `X'. */ +#define PTRMEM_CST_CLASS(NODE) \ + TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (PTRMEM_CST_CHECK (NODE))) + +/* For a pointer-to-member constant `X::Y' this is the _DECL for + `Y'. */ +#define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member) + +/* The expression in question for a TYPEOF_TYPE. */ +#define TYPEOF_TYPE_EXPR(NODE) (TYPEOF_TYPE_CHECK (NODE))->type.values + +/* The expression in question for a DECLTYPE_TYPE. */ +#define DECLTYPE_TYPE_EXPR(NODE) (DECLTYPE_TYPE_CHECK (NODE))->type.values + +/* Whether the DECLTYPE_TYPE_EXPR of NODE was originally parsed as an + id-expression or a member-access expression. When false, it was + parsed as a full expression. */ +#define DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P(NODE) \ + (DECLTYPE_TYPE_CHECK (NODE))->type.string_flag + +/* These flags indicate that we want different semantics from normal + decltype: lambda capture just drops references, lambda return also does + type decay. */ +#define DECLTYPE_FOR_LAMBDA_CAPTURE(NODE) \ + TREE_LANG_FLAG_0 (DECLTYPE_TYPE_CHECK (NODE)) +#define DECLTYPE_FOR_LAMBDA_RETURN(NODE) \ + TREE_LANG_FLAG_1 (DECLTYPE_TYPE_CHECK (NODE)) + +/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was + specified in its declaration. This can also be set for an + erroneously declared PARM_DECL. */ +#define DECL_THIS_EXTERN(NODE) \ + DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE)) + +/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was + specified in its declaration. This can also be set for an + erroneously declared PARM_DECL. */ +#define DECL_THIS_STATIC(NODE) \ + DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE)) + +/* Nonzero for FIELD_DECL node means that this field is a base class + of the parent object, as opposed to a member field. */ +#define DECL_FIELD_IS_BASE(NODE) \ + DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE)) + +/* Nonzero for FIELD_DECL node means that this field is a simple (no + explicit initializer) lambda capture field, making it invisible to + name lookup in unevaluated contexts. */ +#define DECL_NORMAL_CAPTURE_P(NODE) \ + DECL_LANG_FLAG_7 (FIELD_DECL_CHECK (NODE)) + +/* Nonzero if TYPE is an anonymous union or struct type. We have to use a + flag for this because "A union for which objects or pointers are + declared is not an anonymous union" [class.union]. */ +#define ANON_AGGR_TYPE_P(NODE) \ + (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr) +#define SET_ANON_AGGR_TYPE_P(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1) + +/* Nonzero if TYPE is an anonymous union type. */ +#define ANON_UNION_TYPE_P(NODE) \ + (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE)) + +/* Define fields and accessors for nodes representing declared names. */ + +#define TYPE_WAS_ANONYMOUS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->was_anonymous) + +/* C++: all of these are overloaded! These apply only to TYPE_DECLs. */ + +/* 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)) + +/* The DECL_ACCESS, if non-NULL, is a TREE_LIST. The TREE_PURPOSE of + each node is a type; the TREE_VALUE is the access granted for this + DECL in that type. The DECL_ACCESS is set by access declarations. + For example, if a member that would normally be public in a + derived class is made protected, then the derived class and the + protected_access_node will appear in the DECL_ACCESS for the node. */ +#define DECL_ACCESS(NODE) (LANG_DECL_U2_CHECK (NODE, 0)->access) + +/* Nonzero if the FUNCTION_DECL is a global constructor. */ +#define DECL_GLOBAL_CTOR_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->global_ctor_p) + +/* Nonzero if the FUNCTION_DECL is a global destructor. */ +#define DECL_GLOBAL_DTOR_P(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->global_dtor_p) + +/* Accessor macros for C++ template decl nodes. */ + +/* The DECL_TEMPLATE_PARMS are a list. The TREE_PURPOSE of each node + is a INT_CST whose TREE_INT_CST_LOW indicates the level of the + template parameters, with 1 being the outermost set of template + parameters. The TREE_VALUE is a vector, whose elements are the + template parameters at each level. Each element in the vector is a + 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_NON_COMMON_CHECK (NODE)->decl_non_common.arguments +#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \ + INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE)) +#define DECL_NTPARMS(NODE) \ + TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE)) +/* For function, method, class-data templates. */ +#define DECL_TEMPLATE_RESULT(NODE) DECL_RESULT_FLD (NODE) +/* For a function template at namespace scope, DECL_TEMPLATE_INSTANTIATIONS + lists all instantiations and specializations of the function so that + tsubst_friend_function can reassign them to another template if we find + that the namespace-scope template is really a partial instantiation of a + friend template. + + For a class template the DECL_TEMPLATE_INSTANTIATIONS lists holds + all instantiations and specializations of the class type, including + partial instantiations and partial specializations, so that if we + explicitly specialize a partial instantiation we can walk the list + in maybe_process_partial_specialization and reassign them or complain + as appropriate. + + In both cases, the TREE_PURPOSE of each node contains the arguments + used; the TREE_VALUE contains the generated variable. The template + arguments are always complete. For example, given: + + template struct S1 { + template struct S2 {}; + template struct S2 {}; + }; + + the record for the partial specialization will contain, as its + argument list, { {T}, {U*} }, and will be on the + DECL_TEMPLATE_INSTANTIATIONS list for `template template + struct S1::S2'. + + This list is not used for other templates. */ +#define DECL_TEMPLATE_INSTANTIATIONS(NODE) DECL_VINDEX (NODE) +/* For a class template, this list contains the partial + specializations of this template. (Full specializations are not + recorded on this list.) The TREE_PURPOSE holds the arguments used + in the partial specialization (e.g., for `template struct + S' this will be `T*'.) The arguments will also include + any outer template arguments. The TREE_VALUE holds the innermost + template parameters for the specialization (e.g., `T' in the + example above.) The TREE_TYPE is the _TYPE node for the partial + specialization. + + This list is not used for other templates. */ +#define DECL_TEMPLATE_SPECIALIZATIONS(NODE) DECL_SIZE (NODE) + +/* Nonzero for a DECL which is actually a template parameter. Keep + these checks in ascending tree code order. */ +#define DECL_TEMPLATE_PARM_P(NODE) \ + (DECL_LANG_FLAG_0 (NODE) \ + && (TREE_CODE (NODE) == CONST_DECL \ + || TREE_CODE (NODE) == PARM_DECL \ + || TREE_CODE (NODE) == TYPE_DECL \ + || TREE_CODE (NODE) == TEMPLATE_DECL)) + +/* Mark NODE as a template parameter. */ +#define SET_DECL_TEMPLATE_PARM_P(NODE) \ + (DECL_LANG_FLAG_0 (NODE) = 1) + +/* Nonzero if NODE is a template template parameter. */ +#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_TEMPLATE_RESULT (NODE) != NULL_TREE \ + && DECL_IMPLICIT_TYPEDEF_P (DECL_TEMPLATE_RESULT (NODE))) + +/* Nonzero if NODE which declares a type. */ +#define DECL_DECLARES_TYPE_P(NODE) \ + (TREE_CODE (NODE) == TYPE_DECL || DECL_CLASS_TEMPLATE_P (NODE)) + +/* Nonzero if NODE declares a function. */ +#define DECL_DECLARES_FUNCTION_P(NODE) \ + (TREE_CODE (NODE) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (NODE)) + +/* Nonzero if NODE is the typedef implicitly generated for a type when + the type is declared. In C++, `struct S {};' is roughly + equivalent to `struct S {}; typedef struct S S;' in C. + DECL_IMPLICIT_TYPEDEF_P will hold for the typedef indicated in this + example. In C++, there is a second implicit typedef for each + class, in the scope of `S' itself, so that you can say `S::S'. + DECL_SELF_REFERENCE_P will hold for that second typedef. */ +#define DECL_IMPLICIT_TYPEDEF_P(NODE) \ + (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_2 (NODE)) +#define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \ + (DECL_LANG_FLAG_2 (NODE) = 1) +#define DECL_SELF_REFERENCE_P(NODE) \ + (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_4 (NODE)) +#define SET_DECL_SELF_REFERENCE_P(NODE) \ + (DECL_LANG_FLAG_4 (NODE) = 1) + +/* A `primary' template is one that has its own template header. A + member function of a class template is a template, but not primary. + A member template is primary. Friend templates are primary, too. */ + +/* Returns the primary template corresponding to these parameters. */ +#define DECL_PRIMARY_TEMPLATE(NODE) \ + (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE))) + +/* Returns nonzero if NODE is a primary template. */ +#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE)) + +/* Nonzero iff NODE is a specialization of a template. The value + indicates the type of specializations: + + 1=implicit instantiation + + 2=partial or explicit specialization, e.g.: + + template <> int min (int, int), + + 3=explicit instantiation, e.g.: + + template int min (int, int); + + Note that NODE will be marked as a specialization even if the + template it is instantiating is not a primary template. For + example, given: + + template struct O { + void f(); + struct I {}; + }; + + both O::f and O::I will be marked as instantiations. + + If DECL_USE_TEMPLATE is nonzero, then DECL_TEMPLATE_INFO will also + be non-NULL. */ +#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.use_template) + +/* Like DECL_USE_TEMPLATE, but for class types. */ +#define CLASSTYPE_USE_TEMPLATE(NODE) \ + (LANG_TYPE_CLASS_CHECK (NODE)->use_template) + +/* True if NODE is a specialization of a primary template. */ +#define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE) \ + (CLASS_TYPE_P (NODE) \ + && CLASSTYPE_USE_TEMPLATE (NODE) \ + && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))) + +#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1) +#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) & 1) + +#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2) +#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2) + +/* Returns true for an explicit or partial specialization of a class + template. */ +#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) == 2) +#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) = 2) + +#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1) +#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1) +#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) == 1) +#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) = 1) + +#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3) +#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3) +#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) == 3) +#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \ + (CLASSTYPE_USE_TEMPLATE (NODE) = 3) + +/* Nonzero if DECL is a friend function which is an instantiation + from the point of view of the compiler, but not from the point of + view of the language. For example given: + template struct S { friend void f(T) {}; }; + the declaration of `void f(int)' generated when S is + instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be + a DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION. */ +#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \ + (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL)) + +/* Nonzero iff we are currently processing a declaration for an + entity with its own template parameter list, and which is not a + full specialization. */ +#define PROCESSING_REAL_TEMPLATE_DECL_P() \ + (processing_template_decl > template_class_depth (current_scope ())) + +/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been + instantiated, i.e. its definition has been generated from the + pattern given in the template. */ +#define DECL_TEMPLATE_INSTANTIATED(NODE) \ + DECL_LANG_FLAG_1 (VAR_OR_FUNCTION_DECL_CHECK (NODE)) + +/* We know what we're doing with this decl now. */ +#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE) + +/* 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. + + This flag does not indicate whether or not the decl is defined in the + current translation unit; it indicates whether or not we should emit the + decl at the end of compilation if it is defined and needed. */ +#define DECL_NOT_REALLY_EXTERN(NODE) \ + (DECL_LANG_SPECIFIC (NODE)->u.base.not_really_extern) + +#define DECL_REALLY_EXTERN(NODE) \ + (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE)) + +/* A thunk is a stub function. + + 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 (THUNK_FUNCTION_CHECK (DECL))->u.fn.u5.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)->access) + +/* A thunk which is equivalent to another thunk. */ +#define THUNK_ALIAS(DECL) \ + (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.min.template_info) + +/* For thunk NODE, this is the FUNCTION_DECL thunked to. It is + possible for the target to be a thunk too. */ +#define THUNK_TARGET(NODE) \ + (LANG_DECL_FN_CHECK (NODE)->befriending_classes) + +/* True for a SCOPE_REF iff the "template" keyword was used to + indicate that the qualified name denotes a template. */ +#define QUALIFIED_NAME_IS_TEMPLATE(NODE) \ + (TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE))) + +/* True for an OMP_ATOMIC that has dependent parameters. These are stored + as an expr in operand 1, and integer_zero_node in operand 0. */ +#define OMP_ATOMIC_DEPENDENT_P(NODE) \ + (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST) + +/* Used while gimplifying continue statements bound to OMP_FOR nodes. */ +#define OMP_FOR_GIMPLIFYING_P(NODE) \ + (TREE_LANG_FLAG_0 (OMP_FOR_CHECK (NODE))) + +/* A language-specific token attached to the OpenMP data clauses to + hold code (or code fragments) related to ctors, dtors, and op=. + See semantics.c for details. */ +#define CP_OMP_CLAUSE_INFO(NODE) \ + TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \ + OMP_CLAUSE_COPYPRIVATE)) + +/* These macros provide convenient access to the various _STMT nodes + created when parsing template declarations. */ +#define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0) +#define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1) + +#define EH_SPEC_STMTS(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0) +#define EH_SPEC_RAISES(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1) + +#define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0) + +/* Nonzero if this try block is a function try block. */ +#define FN_TRY_BLOCK_P(NODE) TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE)) +#define HANDLER_PARMS(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 0) +#define HANDLER_BODY(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 1) +#define HANDLER_TYPE(NODE) TREE_TYPE (HANDLER_CHECK (NODE)) + +/* CLEANUP_STMT accessors. The statement(s) covered, the cleanup to run + and the VAR_DECL for which this cleanup exists. */ +#define CLEANUP_BODY(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0) +#define CLEANUP_EXPR(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1) +#define CLEANUP_DECL(NODE) TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 2) + +/* IF_STMT accessors. These give access to the condition of the if + statement, the then block of the if statement, and the else block + of the if statement if it exists. */ +#define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0) +#define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1) +#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2) + +/* WHILE_STMT accessors. These give access to the condition of the + while statement and the body of the while statement, respectively. */ +#define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0) +#define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1) + +/* DO_STMT accessors. These give access to the condition of the do + statement and the body of the do statement, respectively. */ +#define DO_COND(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 0) +#define DO_BODY(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 1) + +/* FOR_STMT accessors. These give access to the init statement, + condition, update expression, and body of the for statement, + respectively. */ +#define FOR_INIT_STMT(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 0) +#define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1) +#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2) +#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3) + +/* RANGE_FOR_STMT accessors. These give access to the declarator, + expression and body of the statement, respectively. */ +#define RANGE_FOR_DECL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0) +#define RANGE_FOR_EXPR(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1) +#define RANGE_FOR_BODY(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2) + +#define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0) +#define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1) +#define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2) + +/* STMT_EXPR accessor. */ +#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0) + +/* EXPR_STMT accessor. This gives the expression associated with an + expression statement. */ +#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0) + +/* True if this TARGET_EXPR was created by build_cplus_new, and so we can + discard it if it isn't useful. */ +#define TARGET_EXPR_IMPLICIT_P(NODE) \ + TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE)) + +/* True if this TARGET_EXPR is the result of list-initialization of a + temporary. */ +#define TARGET_EXPR_LIST_INIT_P(NODE) \ + TREE_LANG_FLAG_1 (TARGET_EXPR_CHECK (NODE)) + +/* True if this TARGET_EXPR expresses direct-initialization of an object + to be named later. */ +#define TARGET_EXPR_DIRECT_INIT_P(NODE) \ + TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE)) + +/* True if EXPR expresses direct-initialization of a TYPE. */ +#define DIRECT_INIT_EXPR_P(TYPE,EXPR) \ + (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR) \ + && same_type_ignoring_top_level_qualifiers_p (TYPE, TREE_TYPE (EXPR))) + +/* 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. */ +enum cp_lvalue_kind_flags { + clk_none = 0, /* Things that are not an lvalue. */ + clk_ordinary = 1, /* An ordinary lvalue. */ + clk_rvalueref = 2,/* An rvalue formed using an rvalue reference */ + clk_class = 4, /* An rvalue of class-type. */ + clk_bitfield = 8, /* An lvalue for a bit-field. */ + clk_packed = 16 /* An lvalue for a packed field. */ +}; + +/* This type is used for parameters and variables which hold + combinations of the flags in enum cp_lvalue_kind_flags. */ +typedef int cp_lvalue_kind; + +/* Various kinds of template specialization, instantiation, etc. */ +typedef enum tmpl_spec_kind { + tsk_none, /* Not a template at all. */ + tsk_invalid_member_spec, /* An explicit member template + specialization, but the enclosing + classes have not all been explicitly + specialized. */ + tsk_invalid_expl_inst, /* An explicit instantiation containing + template parameter lists. */ + tsk_excessive_parms, /* A template declaration with too many + template parameter lists. */ + tsk_insufficient_parms, /* A template declaration with too few + parameter lists. */ + tsk_template, /* A template declaration. */ + tsk_expl_spec, /* An explicit specialization. */ + tsk_expl_inst /* An explicit instantiation. */ +} tmpl_spec_kind; + +/* The various kinds of access. BINFO_ACCESS depends on these being + two bit quantities. The numerical values are important; they are + used to initialize RTTI data structures, so changing them changes + the ABI. */ +typedef enum access_kind { + ak_none = 0, /* Inaccessible. */ + ak_public = 1, /* Accessible, as a `public' thing. */ + ak_protected = 2, /* Accessible, as a `protected' thing. */ + ak_private = 3 /* Accessible, as a `private' thing. */ +} access_kind; + +/* The various kinds of special functions. If you add to this list, + you should update special_function_p as well. */ +typedef enum special_function_kind { + sfk_none = 0, /* Not a special function. This enumeral + must have value zero; see + special_function_p. */ + sfk_constructor, /* A constructor. */ + sfk_copy_constructor, /* A copy constructor. */ + sfk_move_constructor, /* A move constructor. */ + sfk_copy_assignment, /* A copy assignment operator. */ + sfk_move_assignment, /* A move assignment operator. */ + sfk_destructor, /* A destructor. */ + sfk_complete_destructor, /* A destructor for complete objects. */ + sfk_base_destructor, /* A destructor for base subobjects. */ + sfk_deleting_destructor, /* A destructor for complete objects that + deletes the object after it has been + destroyed. */ + sfk_conversion /* A conversion operator. */ +} special_function_kind; + +/* The various kinds of linkage. From [basic.link], + + A name is said to have linkage when it might denote the same + object, reference, function, type, template, namespace or value + as a name introduced in another scope: + + -- When a name has external linkage, the entity it denotes can + be referred to from scopes of other translation units or from + other scopes of the same translation unit. + + -- When a name has internal linkage, the entity it denotes can + be referred to by names from other scopes in the same + translation unit. + + -- When a name has no linkage, the entity it denotes cannot be + referred to by names from other scopes. */ + +typedef enum linkage_kind { + lk_none, /* No linkage. */ + lk_internal, /* Internal linkage. */ + lk_external /* External linkage. */ +} linkage_kind; + +typedef enum duration_kind { + dk_static, + dk_thread, + dk_auto, + dk_dynamic +} duration_kind; + +/* Bitmask flags to control type substitution. */ +enum tsubst_flags { + 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_conv = 1 << 6, /* We are determining what kind of + conversion might be permissible, + not actually performing the + conversion. */ + tf_no_access_control = 1 << 7, /* Do not perform access checks, even + when issuing other errors. */ + /* Convenient substitution flags combinations. */ + tf_warning_or_error = tf_warning | tf_error +}; + +/* This type is used for parameters and variables which hold + combinations of the flags in enum tsubst_flags. */ +typedef int tsubst_flags_t; + +/* The kind of checking we can do looking in a class hierarchy. */ +enum base_access_flags { + ba_any = 0, /* Do not check access, allow an ambiguous base, + prefer a non-virtual base */ + ba_unique = 1 << 0, /* Must be a unique base. */ + ba_check_bit = 1 << 1, /* Check access. */ + ba_check = ba_unique | ba_check_bit, + ba_ignore_scope = 1 << 2, /* Ignore access allowed by local scope. */ + ba_quiet = 1 << 3 /* Do not issue error messages. */ +}; + +/* This type is used for parameters and variables which hold + combinations of the flags in enum base_access_flags. */ +typedef int 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 { + bk_inaccessible = -3, /* The base is inaccessible */ + bk_ambig = -2, /* The base is ambiguous */ + bk_not_base = -1, /* It is not a base */ + bk_same_type = 0, /* It is the same type */ + bk_proper_base = 1, /* It is a proper base */ + bk_via_virtual = 2 /* It is a proper base, but via a virtual + path. This might not be the canonical + binfo. */ +} base_kind; + +/* Node for "pointer to (virtual) function". + This may be distinct from ptr_type_node so gdb can distinguish them. */ +#define vfunc_ptr_type_node vtable_entry_type + + +/* For building calls to `delete'. */ +extern GTY(()) tree integer_two_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; + +/* Nonzero if we are inside eq_specializations, which affects comparison of + PARM_DECLs in cp_tree_equal. */ +extern int comparing_specializations; + +/* In parser.c. */ + +/* Nonzero if we are parsing an unevaluated operand: an operand to + sizeof, typeof, or alignof. This is a count since operands to + sizeof can be nested. */ + +extern int cp_unevaluated_operand; +extern tree cp_convert_range_for (tree, tree, tree); + +/* in pt.c */ + +/* These values are used for the `STRICT' parameter to type_unification and + fn_type_unification. Their meanings are described with the + documentation for fn_type_unification. */ + +typedef enum unification_kind_t { + DEDUCE_CALL, + DEDUCE_CONV, + DEDUCE_EXACT +} unification_kind_t; + +/* in class.c */ + +extern int current_class_depth; + +/* An array of all local classes present in this translation unit, in + declaration order. */ +extern GTY(()) VEC(tree,gc) *local_classes; + +/* Here's where we control how name mangling takes place. */ + +/* Cannot use '$' up front, because this confuses gdb + (names beginning with '$' are gdb-local identifiers). + + Note that all forms in which the '$' is significant are long enough + for direct indexing (meaning that if we know there is a '$' + at a particular location, we can index into the string at + any other location that provides distinguishing characters). */ + +/* Define NO_DOT_IN_LABEL in your favorite tm file if your assembler + doesn't allow '.' in symbol names. */ +#ifndef NO_DOT_IN_LABEL + +#define JOINER '.' + +#define AUTO_TEMP_NAME "_.tmp_" +#define VFIELD_BASE ".vf" +#define VFIELD_NAME "_vptr." +#define VFIELD_NAME_FORMAT "_vptr.%s" + +#define ANON_AGGRNAME_FORMAT "._%d" + +#else /* NO_DOT_IN_LABEL */ + +#ifndef NO_DOLLAR_IN_LABEL + +#define JOINER '$' + +#define AUTO_TEMP_NAME "_$tmp_" +#define VFIELD_BASE "$vf" +#define VFIELD_NAME "_vptr$" +#define VFIELD_NAME_FORMAT "_vptr$%s" +#define ANON_AGGRNAME_FORMAT "$_%d" + +#else /* NO_DOLLAR_IN_LABEL */ + +#define IN_CHARGE_NAME "__in_chrg" +#define AUTO_TEMP_NAME "__tmp_" +#define TEMP_NAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, \ + sizeof (AUTO_TEMP_NAME) - 1)) +#define VTABLE_NAME "__vt_" +#define VTABLE_NAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \ + sizeof (VTABLE_NAME) - 1)) +#define VFIELD_BASE "__vfb" +#define VFIELD_NAME "__vptr_" +#define VFIELD_NAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ + sizeof (VFIELD_NAME) - 1)) +#define VFIELD_NAME_FORMAT "__vptr_%s" + +#define ANON_AGGRNAME_PREFIX "__anon_" +#define ANON_AGGRNAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \ + sizeof (ANON_AGGRNAME_PREFIX) - 1)) +#define ANON_AGGRNAME_FORMAT "__anon_%d" + +#endif /* NO_DOLLAR_IN_LABEL */ +#endif /* NO_DOT_IN_LABEL */ + +#define THIS_NAME "this" + +#define IN_CHARGE_NAME "__in_chrg" + +#define VTBL_PTR_TYPE "__vtbl_ptr_type" +#define VTABLE_DELTA_NAME "__delta" +#define VTABLE_PFN_NAME "__pfn" + +#define LAMBDANAME_PREFIX "__lambda" +#define LAMBDANAME_FORMAT LAMBDANAME_PREFIX "%d" +#define LAMBDANAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), \ + LAMBDANAME_PREFIX, \ + sizeof (LAMBDANAME_PREFIX) - 1)) + +#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) + +#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ + && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \ + && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) + +#define TEMP_NAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1)) +#define VFIELD_NAME_P(ID_NODE) \ + (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1)) + +/* For anonymous aggregate types, we need some sort of name to + hold on to. In practice, this should not appear, but it should + not be harmful if it does. */ +#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == JOINER \ + && IDENTIFIER_POINTER (ID_NODE)[1] == '_') +#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */ + + +/* Nonzero if we're done parsing and into end-of-file activities. */ + +extern int at_eof; + +/* A list of namespace-scope objects which have constructors or + destructors which reside in the global scope. The decl is stored + in the TREE_VALUE slot and the initializer is stored in the + TREE_PURPOSE slot. */ +extern GTY(()) tree static_aggregates; + +enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG }; + +/* These are uses as bits in flags passed to various functions to + control their behavior. Despite the LOOKUP_ prefix, many of these + do not control name lookup. ??? Functions using these flags should + probably be modified to accept explicit boolean flags for the + behaviors relevant to them. */ +/* Check for access violations. */ +#define LOOKUP_PROTECT (1 << 0) +/* Complain if no suitable member function matching the arguments is + found. */ +#define LOOKUP_COMPLAIN (1 << 1) +#define LOOKUP_NORMAL (LOOKUP_PROTECT | LOOKUP_COMPLAIN) +/* Even if the function found by lookup is a virtual function, it + should be called directly. */ +#define LOOKUP_NONVIRTUAL (1 << 2) +/* Non-converting (i.e., "explicit") constructors are not tried. This flag + indicates that we are not performing direct-initialization. */ +#define LOOKUP_ONLYCONVERTING (1 << 3) +#define LOOKUP_IMPLICIT (LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING) +/* If a temporary is created, it should be created so that it lives + as long as the current variable bindings; otherwise it only lives + until the end of the complete-expression. It also forces + direct-initialization in cases where other parts of the compiler + have already generated a temporary, such as reference + initialization and the catch parameter. */ +#define DIRECT_BIND (1 << 4) +/* We're performing a user-defined conversion, so more user-defined + conversions are not permitted (only built-in conversions). */ +#define LOOKUP_NO_CONVERSION (1 << 5) +/* The user has explicitly called a destructor. (Therefore, we do + not need to check that the object is non-NULL before calling the + destructor.) */ +#define LOOKUP_DESTRUCTOR (1 << 6) +/* Do not permit references to bind to temporaries. */ +#define LOOKUP_NO_TEMP_BIND (1 << 7) +/* Do not accept objects, and possibly namespaces. */ +#define LOOKUP_PREFER_TYPES (1 << 8) +/* Do not accept objects, and possibly types. */ +#define LOOKUP_PREFER_NAMESPACES (1 << 9) +/* Accept types or namespaces. */ +#define LOOKUP_PREFER_BOTH (LOOKUP_PREFER_TYPES | LOOKUP_PREFER_NAMESPACES) +/* Return friend declarations and un-declared builtin functions. + (Normally, these entities are registered in the symbol table, but + not found by lookup.) */ +#define LOOKUP_HIDDEN (LOOKUP_PREFER_NAMESPACES << 1) +/* Prefer that the lvalue be treated as an rvalue. */ +#define LOOKUP_PREFER_RVALUE (LOOKUP_HIDDEN << 1) +/* We're inside an init-list, so narrowing conversions are ill-formed. */ +#define LOOKUP_NO_NARROWING (LOOKUP_PREFER_RVALUE << 1) +/* Avoid user-defined conversions for the first parameter of a copy + constructor (or move constructor). */ +#define LOOKUP_NO_COPY_CTOR_CONVERSION (LOOKUP_NO_NARROWING << 1) +/* This is the first parameter of a copy constructor. */ +#define LOOKUP_COPY_PARM (LOOKUP_NO_COPY_CTOR_CONVERSION << 1) +/* We only want to consider list constructors. */ +#define LOOKUP_LIST_ONLY (LOOKUP_COPY_PARM << 1) +/* Return after determining which function to call and checking access. + Used by sythesized_method_walk to determine which functions will + be called to initialize subobjects, in order to determine exception + specification and possible implicit delete. + This is kind of a hack, but since access control doesn't respect SFINAE + we can't just use tf_none to avoid access control errors, we need + another mechanism. Exiting early also avoids problems with trying + to perform argument conversions when the class isn't complete yet. */ +#define LOOKUP_SPECULATIVE (LOOKUP_LIST_ONLY << 1) +/* Used by calls from defaulted functions to limit the overload set to avoid + cycles trying to declare them (core issue 1092). */ +#define LOOKUP_DEFAULTED (LOOKUP_SPECULATIVE << 1) +/* Used in calls to store_init_value to suppress its usual call to + digest_init. */ +#define LOOKUP_ALREADY_DIGESTED (LOOKUP_DEFAULTED << 1) + +#define LOOKUP_NAMESPACES_ONLY(F) \ + (((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES)) +#define LOOKUP_TYPES_ONLY(F) \ + (!((F) & LOOKUP_PREFER_NAMESPACES) && ((F) & LOOKUP_PREFER_TYPES)) +#define LOOKUP_QUALIFIERS_ONLY(F) ((F) & LOOKUP_PREFER_BOTH) + + +/* These flags are used by the conversion code. + CONV_IMPLICIT : Perform implicit conversions (standard and user-defined). + CONV_STATIC : Perform the explicit conversions for static_cast. + CONV_CONST : Perform the explicit conversions for const_cast. + CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast. + CONV_PRIVATE : Perform upcasts to private bases. + CONV_FORCE_TEMP : Require a new temporary when converting to the same + aggregate type. */ + +#define CONV_IMPLICIT 1 +#define CONV_STATIC 2 +#define CONV_CONST 4 +#define CONV_REINTERPRET 8 +#define CONV_PRIVATE 16 +/* #define CONV_NONCONVERTING 32 */ +#define CONV_FORCE_TEMP 64 +#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ + | CONV_REINTERPRET) +#define CONV_C_CAST (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ + | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP) + +/* Used by build_expr_type_conversion to indicate which types are + acceptable as arguments to the expression under consideration. */ + +#define WANT_INT 1 /* integer types, including bool */ +#define WANT_FLOAT 2 /* floating point types */ +#define WANT_ENUM 4 /* enumerated types */ +#define WANT_POINTER 8 /* pointer types */ +#define WANT_NULL 16 /* null pointer constant */ +#define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */ +#define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX) + +/* Used with comptypes, and related functions, to guide type + comparison. */ + +#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. */ +#define COMPARE_STRUCTURAL 8 /* The comparison is intended to be + structural. The actual comparison + will be identical to + COMPARE_STRICT. */ + +/* Used with push_overloaded_decl. */ +#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope, + regardless of the current scope. */ +#define PUSH_LOCAL 1 /* Push the DECL into the current + scope. */ +#define PUSH_USING 2 /* We are pushing this DECL as the + result of a using declaration. */ + +/* Used with start function. */ +#define SF_DEFAULT 0 /* No flags. */ +#define SF_PRE_PARSED 1 /* The function declaration has + already been parsed. */ +#define SF_INCLASS_INLINE 2 /* The function is an inline, defined + in the class body. */ + +/* Used with start_decl's initialized parameter. */ +#define SD_UNINITIALIZED 0 +#define SD_INITIALIZED 1 +#define SD_DEFAULTED 2 +#define SD_DELETED 3 + +/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2 + is derived from TYPE1, or if TYPE2 is a pointer (reference) to a + class derived from the type pointed to (referred to) by TYPE1. */ +#define same_or_base_type_p(TYPE1, TYPE2) \ + comptypes ((TYPE1), (TYPE2), COMPARE_BASE) + +/* These macros are used to access a TEMPLATE_PARM_INDEX. */ +#define TEMPLATE_PARM_INDEX_CAST(NODE) \ + ((template_parm_index*)TEMPLATE_PARM_INDEX_CHECK (NODE)) +#define TEMPLATE_PARM_IDX(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->index) +#define TEMPLATE_PARM_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->level) +/* The Number of sibling parms this template parm has. */ +#define TEMPLATE_PARM_NUM_SIBLINGS(NODE) \ + (TEMPLATE_PARM_INDEX_CAST (NODE)->num_siblings) +#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (NODE)) +#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->orig_level) +#define TEMPLATE_PARM_DECL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->decl) +#define TEMPLATE_PARM_PARAMETER_PACK(NODE) \ + (TREE_LANG_FLAG_0 (TEMPLATE_PARM_INDEX_CHECK (NODE))) + +/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM, + TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM nodes. */ +#define TEMPLATE_TYPE_PARM_INDEX(NODE) \ + (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM, TEMPLATE_TEMPLATE_PARM, \ + BOUND_TEMPLATE_TEMPLATE_PARM))->type.values +#define TEMPLATE_TYPE_IDX(NODE) \ + (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE))) +#define TEMPLATE_TYPE_LEVEL(NODE) \ + (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) +#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \ + (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE))) +#define TEMPLATE_TYPE_DECL(NODE) \ + (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE))) +#define TEMPLATE_TYPE_PARAMETER_PACK(NODE) \ + (TEMPLATE_PARM_PARAMETER_PACK (TEMPLATE_TYPE_PARM_INDEX (NODE))) + +/* These constants can used as bit flags in the process of tree formatting. + + TFF_PLAIN_IDENTIFIER: unqualified part of a name. + TFF_SCOPE: include the class and namespace scope of the name. + TFF_CHASE_TYPEDEF: print the original type-id instead of the typedef-name. + TFF_DECL_SPECIFIERS: print decl-specifiers. + TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with + a class-key (resp. `enum'). + TFF_RETURN_TYPE: include function return type. + TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values. + TFF_EXCEPTION_SPECIFICATION: show function exception specification. + TFF_TEMPLATE_HEADER: show the template<...> header in a + template-declaration. + TFF_TEMPLATE_NAME: show only template-name. + TFF_EXPR_IN_PARENS: parenthesize expressions. + TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments. + TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the + top-level entity. + TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments + identical to their defaults. */ + +#define TFF_PLAIN_IDENTIFIER (0) +#define TFF_SCOPE (1) +#define TFF_CHASE_TYPEDEF (1 << 1) +#define TFF_DECL_SPECIFIERS (1 << 2) +#define TFF_CLASS_KEY_OR_ENUM (1 << 3) +#define TFF_RETURN_TYPE (1 << 4) +#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 5) +#define TFF_EXCEPTION_SPECIFICATION (1 << 6) +#define TFF_TEMPLATE_HEADER (1 << 7) +#define TFF_TEMPLATE_NAME (1 << 8) +#define TFF_EXPR_IN_PARENS (1 << 9) +#define TFF_NO_FUNCTION_ARGUMENTS (1 << 10) +#define TFF_UNQUALIFIED_NAME (1 << 11) +#define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12) + +/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM + node. */ +#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE) \ + ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM) \ + ? TYPE_TI_TEMPLATE (NODE) \ + : TYPE_NAME (NODE)) + +/* in lex.c */ + +extern void init_reswords (void); + +typedef struct GTY(()) operator_name_info_t { + /* The IDENTIFIER_NODE for the operator. */ + tree identifier; + /* The name of the operator. */ + const char *name; + /* The mangled name of the operator. */ + const char *mangled_name; + /* The arity of the operator. */ + int arity; +} operator_name_info_t; + +/* A mapping from tree codes to operator name information. */ +extern GTY(()) operator_name_info_t operator_name_info + [(int) MAX_TREE_CODES]; +/* Similar, but for assignment operators. */ +extern GTY(()) operator_name_info_t assignment_operator_name_info + [(int) MAX_TREE_CODES]; + +/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL + constants. */ + +typedef int cp_cv_quals; + +/* A storage class. */ + +typedef enum cp_storage_class { + /* sc_none must be zero so that zeroing a cp_decl_specifier_seq + sets the storage_class field to sc_none. */ + sc_none = 0, + sc_auto, + sc_register, + sc_static, + sc_extern, + sc_mutable +} cp_storage_class; + +/* An individual decl-specifier. */ + +typedef enum cp_decl_spec { + ds_first, + ds_signed = ds_first, + ds_unsigned, + ds_short, + ds_long, + ds_const, + ds_volatile, + ds_restrict, + ds_inline, + ds_virtual, + ds_explicit, + ds_friend, + ds_typedef, + ds_constexpr, + ds_complex, + ds_thread, + ds_last +} cp_decl_spec; + +/* A decl-specifier-seq. */ + +typedef struct cp_decl_specifier_seq { + /* The number of times each of the keywords has been seen. */ + unsigned specs[(int) ds_last]; + /* The location of the primary type. Mainly used for error + reporting. */ + location_t type_location; + /* The primary type, if any, given by the decl-specifier-seq. + Modifiers, like "short", "const", and "unsigned" are not + reflected here. This field will be a TYPE, unless a typedef-name + was used, in which case it will be a TYPE_DECL. */ + tree type; + /* The attributes, if any, provided with the specifier sequence. */ + tree attributes; + /* If non-NULL, a built-in type that the user attempted to redefine + to some other type. */ + tree redefined_builtin_type; + /* The storage class specified -- or sc_none if no storage class was + explicitly specified. */ + cp_storage_class storage_class; + /* True iff TYPE_SPEC indicates a user-defined type. */ + BOOL_BITFIELD user_defined_type_p : 1; + /* True iff multiple types were (erroneously) specified for this + decl-specifier-seq. */ + BOOL_BITFIELD multiple_types_p : 1; + /* True iff multiple storage classes were (erroneously) specified + for this decl-specifier-seq or a combination of a storage class + with a typedef specifier. */ + BOOL_BITFIELD conflicting_specifiers_p : 1; + /* True iff at least one decl-specifier was found. */ + BOOL_BITFIELD any_specifiers_p : 1; + /* True iff at least one type-specifier was found. */ + BOOL_BITFIELD any_type_specifiers_p : 1; + /* True iff "int" was explicitly provided. */ + BOOL_BITFIELD explicit_int_p : 1; + /* True iff "__int128" was explicitly provided. */ + BOOL_BITFIELD explicit_int128_p : 1; + /* True iff "char" was explicitly provided. */ + BOOL_BITFIELD explicit_char_p : 1; +} cp_decl_specifier_seq; + +/* The various kinds of declarators. */ + +typedef enum cp_declarator_kind { + cdk_id, + cdk_function, + cdk_array, + cdk_pointer, + cdk_reference, + cdk_ptrmem, + cdk_error +} cp_declarator_kind; + +/* A declarator. */ + +typedef struct cp_declarator cp_declarator; + +typedef struct cp_parameter_declarator cp_parameter_declarator; + +/* A parameter, before it has been semantically analyzed. */ +struct cp_parameter_declarator { + /* The next parameter, or NULL_TREE if none. */ + cp_parameter_declarator *next; + /* The decl-specifiers-seq for the parameter. */ + cp_decl_specifier_seq decl_specifiers; + /* The declarator for the parameter. */ + cp_declarator *declarator; + /* The default-argument expression, or NULL_TREE, if none. */ + tree default_argument; + /* True iff this is the first parameter in the list and the + parameter sequence ends with an ellipsis. */ + bool ellipsis_p; +}; + +/* A declarator. */ +struct cp_declarator { + /* The kind of declarator. */ + ENUM_BITFIELD (cp_declarator_kind) kind : 4; + /* Whether we parsed an ellipsis (`...') just before the declarator, + to indicate this is a parameter pack. */ + BOOL_BITFIELD parameter_pack_p : 1; + location_t id_loc; /* Currently only set for cdk_id and cdk_function. */ + /* Attributes that apply to this declarator. */ + tree attributes; + /* For all but cdk_id and cdk_error, the contained declarator. For + cdk_id and cdk_error, guaranteed to be NULL. */ + cp_declarator *declarator; + union { + /* For identifiers. */ + struct { + /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or + *_TYPE) for this identifier. */ + tree qualifying_scope; + /* The unqualified name of the entity -- an IDENTIFIER_NODE, + BIT_NOT_EXPR, or TEMPLATE_ID_EXPR. */ + tree unqualified_name; + /* If this is the name of a function, what kind of special + function (if any). */ + special_function_kind sfk; + } id; + /* For functions. */ + struct { + /* The parameters to the function as a TREE_LIST of decl/default. */ + tree parameters; + /* The cv-qualifiers for the function. */ + cp_cv_quals qualifiers; + /* The exception-specification for the function. */ + tree exception_specification; + /* The late-specified return type, if any. */ + tree late_return_type; + } function; + /* For arrays. */ + struct { + /* The bounds to the array. */ + tree bounds; + } array; + /* For cdk_pointer and cdk_ptrmem. */ + struct { + /* The cv-qualifiers for the pointer. */ + cp_cv_quals qualifiers; + /* For cdk_ptrmem, the class type containing the member. */ + tree class_type; + } pointer; + /* For cdk_reference */ + struct { + /* The cv-qualifiers for the reference. These qualifiers are + only used to diagnose ill-formed code. */ + cp_cv_quals qualifiers; + /* Whether this is an rvalue reference */ + bool rvalue_ref; + } reference; + } u; +}; + +/* A level of template instantiation. */ +struct GTY(()) tinst_level { + /* The immediately deeper level in the chain. */ + struct tinst_level *next; + + /* The original node. Can be either a DECL (for a function or static + data member) or a TYPE (for a class), depending on what we were + asked to instantiate. */ + tree decl; + + /* The location where the template is instantiated. */ + location_t locus; + + /* True if the location is in a system header. */ + bool in_system_header_p; +}; + +/* A parameter list indicating for a function with no parameters, + e.g "int f(void)". */ +extern cp_parameter_declarator *no_parameters; + +/* True if we saw "#pragma GCC java_exceptions". */ +extern bool pragma_java_exceptions; + +/* in call.c */ +extern bool check_dtor_name (tree, tree); + +extern tree build_conditional_expr (tree, tree, tree, + tsubst_flags_t); +extern tree build_addr_func (tree); +extern tree build_call_a (tree, int, tree*); +extern tree build_call_n (tree, int, ...); +extern bool null_ptr_cst_p (tree); +extern bool sufficient_parms_p (const_tree); +extern tree type_decays_to (tree); +extern tree build_user_type_conversion (tree, tree, int); +extern tree build_new_function_call (tree, VEC(tree,gc) **, bool, + tsubst_flags_t); +extern tree build_operator_new_call (tree, VEC(tree,gc) **, tree *, + tree *, tree *); +extern tree build_new_method_call (tree, tree, VEC(tree,gc) **, + tree, int, tree *, + tsubst_flags_t); +extern tree build_special_member_call (tree, tree, VEC(tree,gc) **, + tree, int, tsubst_flags_t); +extern tree build_new_op (enum tree_code, int, tree, + tree, tree, bool *, + tsubst_flags_t); +extern tree build_op_call (tree, VEC(tree,gc) **, + tsubst_flags_t); +extern tree build_op_delete_call (enum tree_code, tree, tree, bool, tree, tree); +extern bool can_convert (tree, tree); +extern bool can_convert_arg (tree, tree, tree, int); +extern bool can_convert_arg_bad (tree, tree, tree, int); +extern bool enforce_access (tree, 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 bool is_properly_derived_from (tree, tree); +extern tree set_up_extended_ref_temp (tree, tree, tree *, tree *); +extern tree initialize_reference (tree, tree, tree, tree *, tsubst_flags_t); +extern tree make_temporary_var_for_ref_to_temp (tree, tree); +extern tree strip_top_quals (tree); +extern bool reference_related_p (tree, tree); +extern tree perform_implicit_conversion (tree, tree, tsubst_flags_t); +extern tree perform_implicit_conversion_flags (tree, tree, tsubst_flags_t, int); +extern tree build_integral_nontype_arg_conv (tree, tree, tsubst_flags_t); +extern tree perform_direct_initialization_if_possible (tree, tree, bool, + tsubst_flags_t); +extern tree in_charge_arg_for_name (tree); +extern tree build_cxx_call (tree, int, tree *); +extern bool is_std_init_list (tree); +extern bool is_list_ctor (tree); +#ifdef ENABLE_CHECKING +extern void validate_conversion_obstack (void); +#endif /* ENABLE_CHECKING */ + +/* in class.c */ +extern tree build_vfield_ref (tree, tree); +extern tree build_base_path (enum tree_code, tree, + tree, int); +extern tree convert_to_base (tree, tree, bool, bool, + tsubst_flags_t); +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 bool add_method (tree, tree, tree); +extern bool currently_open_class (tree); +extern tree currently_open_derived_class (tree); +extern tree current_nonlambda_class_type (void); +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 bool is_really_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 build_self_reference (void); +extern int same_signature_p (const_tree, const_tree); +extern void maybe_add_class_template_decl_list (tree, tree, int); +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 void debug_class (tree); +extern void debug_thunks (tree); +extern tree cp_fold_obj_type_ref (tree, tree); +extern void set_linkage_according_to_type (tree, tree); +extern void determine_key_method (tree); +extern void check_for_override (tree, tree); +extern void push_class_stack (void); +extern void pop_class_stack (void); +extern bool type_has_user_nondefault_constructor (tree); +extern tree in_class_defaulted_default_constructor (tree); +extern bool user_provided_p (tree); +extern bool type_has_user_provided_constructor (tree); +extern bool type_has_user_provided_default_constructor (tree); +extern tree default_init_uninitialized_part (tree); +extern bool synthesized_default_constructor_is_constexpr (tree); +extern bool type_has_constexpr_default_constructor (tree); +extern bool type_has_virtual_destructor (tree); +extern bool type_has_move_constructor (tree); +extern bool type_has_move_assign (tree); +extern void defaulted_late_check (tree); +extern bool defaultable_fn_check (tree); +extern void fixup_type_variants (tree); +extern void fixup_attribute_variants (tree); +extern tree* decl_cloned_function_p (const_tree, bool); +extern void clone_function_decl (tree, int); +extern void adjust_clone_args (tree); + +/* in cvt.c */ +extern tree convert_to_reference (tree, tree, int, int, tree); +extern tree convert_from_reference (tree); +extern tree force_rvalue (tree); +extern tree ocp_convert (tree, tree, int, int); +extern tree cp_convert (tree, tree); +extern tree cp_convert_and_check (tree, tree); +extern tree cp_fold_convert (tree, tree); +extern tree convert_to_void (tree, impl_conv_void, + tsubst_flags_t); +extern tree convert_force (tree, tree, int); +extern tree build_expr_type_conversion (int, tree, bool); +extern tree type_promotes_to (tree); +extern tree perform_qualification_conversions (tree, tree); + +/* in name-lookup.c */ +extern tree pushdecl (tree); +extern tree pushdecl_maybe_friend (tree, bool); +extern void maybe_push_cleanup_level (tree); +extern tree pushtag (tree, tree, tag_scope); +extern tree make_anon_name (void); +extern tree pushdecl_top_level_maybe_friend (tree, bool); +extern tree pushdecl_top_level_and_finish (tree, tree); +extern tree check_for_out_of_scope_variable (tree); +extern void print_other_binding_stack (struct cp_binding_level *); +extern tree maybe_push_decl (tree); +extern tree current_decl_namespace (void); + +/* decl.c */ +extern tree poplevel (int, int, int); +extern void cxx_init_decl_processing (void); +enum cp_tree_node_structure_enum cp_tree_node_structure + (union lang_tree_node *); +extern void finish_scope (void); +extern void push_switch (tree); +extern void pop_switch (void); +extern tree make_lambda_name (void); +extern int decls_match (tree, tree); +extern tree duplicate_decls (tree, tree, bool); +extern tree declare_local_label (tree); +extern tree define_label (location_t, tree); +extern void check_goto (tree); +extern bool check_omp_return (void); +extern tree make_typename_type (tree, tree, enum tag_types, tsubst_flags_t); +extern tree make_unbound_class_template (tree, tree, tree, tsubst_flags_t); +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, tree); +extern tree push_void_library_fn (tree, tree); +extern tree push_throw_library_fn (tree, tree); +extern tree check_tag_decl (cp_decl_specifier_seq *); +extern tree shadow_tag (cp_decl_specifier_seq *); +extern tree groktypename (cp_decl_specifier_seq *, const cp_declarator *, bool); +extern tree start_decl (const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *); +extern void start_decl_1 (tree, bool); +extern bool check_array_initializer (tree, tree, tree); +extern void cp_finish_decl (tree, tree, bool, tree, int); +extern int cp_complete_array_type (tree *, tree, bool); +extern tree build_ptrmemfunc_type (tree); +extern tree build_ptrmem_type (tree, tree); +/* the grokdeclarator prototype is in decl.h */ +extern tree build_this_parm (tree, cp_cv_quals); +extern int copy_fn_p (const_tree); +extern bool move_fn_p (const_tree); +extern tree get_scope_of_declarator (const cp_declarator *); +extern void grok_special_member_properties (tree); +extern int grok_ctor_properties (const_tree, const_tree); +extern bool grok_op_properties (tree, bool); +extern tree xref_tag (enum tag_types, tree, tag_scope, bool); +extern tree xref_tag_from_type (tree, tree, tag_scope); +extern bool xref_basetypes (tree, tree); +extern tree start_enum (tree, tree, tree, bool, bool *); +extern void finish_enum_value_list (tree); +extern void finish_enum (tree); +extern void build_enumerator (tree, tree, tree, location_t); +extern tree lookup_enumerator (tree, tree); +extern void start_preparsed_function (tree, tree, int); +extern int start_function (cp_decl_specifier_seq *, const cp_declarator *, tree); +extern tree begin_function_body (void); +extern void finish_function_body (tree); +extern tree outer_curly_brace_block (tree); +extern tree finish_function (int); +extern tree grokmethod (cp_decl_specifier_seq *, const cp_declarator *, tree); +extern void maybe_register_incomplete_var (tree); +extern void maybe_commonize_var (tree); +extern void complete_vars (tree); +extern void finish_stmt (void); +extern tree static_fn_type (tree); +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, tsubst_flags_t); +extern tree check_default_argument (tree, tree); +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 int local_variable_p (const_tree); +extern tree register_dtor_fn (tree); +extern tmpl_spec_kind current_tmpl_spec_kind (int); +extern tree cp_fname_init (const char *, tree *); +extern tree cxx_builtin_function (tree decl); +extern tree cxx_builtin_function_ext_scope (tree decl); +extern tree check_elaborated_type_specifier (enum tag_types, tree, bool); +extern void warn_extern_redeclared_static (tree, tree); +extern tree cxx_comdat_group (tree); +extern bool cp_missing_noreturn_ok_p (tree); +extern void initialize_artificial_var (tree, VEC(constructor_elt,gc) *); +extern tree check_var_type (tree, tree); +extern tree reshape_init (tree, tree); +extern tree next_initializable_field (tree); + +extern bool defer_mark_used_calls; +extern GTY(()) VEC(tree, gc) *deferred_mark_used_calls; +extern tree finish_case_label (location_t, tree, tree); +extern tree cxx_maybe_build_cleanup (tree); + +/* in decl2.c */ +extern bool check_java_method (tree); +extern tree build_memfn_type (tree, tree, cp_cv_quals); +extern tree change_return_type (tree, tree); +extern void maybe_retrofit_in_chrg (tree); +extern void maybe_make_one_only (tree); +extern bool vague_linkage_p (tree); +extern void grokclassfn (tree, tree, + enum overload_flags); +extern tree grok_array_decl (tree, tree); +extern tree delete_sanity (tree, tree, bool, int); +extern tree check_classfn (tree, tree, tree); +extern void check_member_template (tree); +extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *, + tree, bool, tree, tree); +extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *, + tree, tree); +extern tree cp_reconstruct_complex_type (tree, tree); +extern void cplus_decl_attributes (tree *, tree, int); +extern void finish_anon_union (tree); +extern void cp_write_global_declarations (void); +extern tree coerce_new_type (tree); +extern tree coerce_delete_type (tree); +extern void comdat_linkage (tree); +extern void determine_visibility (tree); +extern void constrain_class_visibility (tree); +extern void import_export_decl (tree); +extern tree build_cleanup (tree); +extern tree build_offset_ref_call_from_tree (tree, VEC(tree,gc) **); +extern bool decl_constant_var_p (tree); +extern bool decl_maybe_constant_var_p (tree); +extern void check_default_args (tree); +extern void mark_used (tree); +extern void finish_static_data_member_decl (tree, tree, bool, tree, int); +extern tree cp_build_parm_decl (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 *); +extern void mark_needed (tree); +extern bool decl_needed_p (tree); +extern void note_vague_linkage_fn (tree); +extern tree build_artificial_parm (tree, tree); +extern bool possibly_inlined_p (tree); +extern int parm_index (tree); + +/* in error.c */ +extern void init_error (void); +extern const char *type_as_string (tree, int); +extern const char *type_as_string_translate (tree, int); +extern const char *decl_as_string (tree, int); +extern const char *decl_as_string_translate (tree, int); +extern const char *expr_as_string (tree, int); +extern const char *lang_decl_name (tree, int, bool); +extern const char *language_to_string (enum languages); +extern const char *class_key_or_enum_as_string (tree); +extern void print_instantiation_context (void); +extern void maybe_warn_variadic_templates (void); +extern void maybe_warn_cpp0x (cpp0x_warn_str str); +extern bool pedwarn_cxx98 (location_t, int, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); +extern location_t location_of (tree); +extern void qualified_name_lookup_error (tree, tree, tree, + location_t); + +/* in except.c */ +extern void init_exception_processing (void); +extern tree expand_start_catch_block (tree); +extern void expand_end_catch_block (void); +extern tree build_exc_ptr (void); +extern tree build_throw (tree); +extern int nothrow_libfn_p (const_tree); +extern void check_handlers (tree); +extern tree finish_noexcept_expr (tree, tsubst_flags_t); +extern void perform_deferred_noexcept_checks (void); +extern bool nothrow_spec_p (const_tree); +extern bool type_noexcept_p (const_tree); +extern bool type_throw_all_p (const_tree); +extern tree build_noexcept_spec (tree, int); +extern void choose_personality_routine (enum languages); +extern tree eh_type_info (tree); +extern tree begin_eh_spec_block (void); +extern void finish_eh_spec_block (tree, tree); +extern tree build_eh_type_type (tree); +extern tree cp_protect_cleanup_actions (void); + +/* in expr.c */ +extern tree cplus_expand_constant (tree); +extern tree mark_rvalue_use (tree); +extern tree mark_lvalue_use (tree); +extern tree mark_type_use (tree); +extern void mark_exp_read (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, bool); + +/* in init.c */ +extern tree expand_member_init (tree); +extern void emit_mem_initializers (tree); +extern tree build_aggr_init (tree, tree, int, + tsubst_flags_t); +extern int is_class_type (tree, int); +extern tree get_type_value (tree); +extern tree build_zero_init (tree, tree, bool); +extern tree build_value_init (tree, tsubst_flags_t); +extern tree build_value_init_noctor (tree, tsubst_flags_t); +extern tree build_offset_ref (tree, tree, bool); +extern tree build_new (VEC(tree,gc) **, tree, tree, + VEC(tree,gc) **, int, + tsubst_flags_t); +extern tree get_temp_regvar (tree, tree); +extern tree build_vec_init (tree, tree, tree, bool, int, + tsubst_flags_t); +extern tree build_delete (tree, tree, + special_function_kind, + int, int); +extern void push_base_cleanups (void); +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); +extern tree integral_constant_value (tree); +extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool); + +/* in lex.c */ +extern void cxx_dup_lang_specific_decl (tree); +extern void yyungetc (int, int); + +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 tree build_lang_decl_loc (location_t, 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_class_type (enum tree_code); +extern bool cxx_init (void); +extern void cxx_finish (void); +extern bool in_main_input_context (void); + +/* in method.c */ +extern void init_method (void); +extern tree make_thunk (tree, bool, tree, tree); +extern void finish_thunk (tree); +extern void use_thunk (tree, bool); +extern bool trivial_fn_p (tree); +extern bool maybe_explain_implicit_delete (tree); +extern void synthesize_method (tree); +extern tree lazily_declare_fn (special_function_kind, + tree); +extern tree skip_artificial_parms_for (const_tree, tree); +extern int num_artificial_parms_for (const_tree); +extern tree make_alias_for (tree, tree); +extern tree get_copy_ctor (tree, tsubst_flags_t); +extern tree get_copy_assign (tree); +extern tree get_default_ctor (tree); +extern tree get_dtor (tree, tsubst_flags_t); +extern tree locate_ctor (tree); + +/* In optimize.c */ +extern bool maybe_clone_body (tree); + +/* in pt.c */ +extern bool 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 bool 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 make_auto (void); +extern tree do_auto_deduction (tree, tree, tree); +extern tree type_uses_auto (tree); +extern void append_type_to_template_for_access_check (tree, tree, tree, + location_t); +extern tree splice_late_return_type (tree, tree); +extern bool is_auto (const_tree); +extern tree process_template_parm (tree, location_t, tree, + bool, bool, unsigned); +extern tree end_template_parm_list (tree); +void fixup_template_parms (void); +extern void end_template_decl (void); +extern tree maybe_update_decl_type (tree, tree); +extern bool check_default_tmpl_args (tree, tree, int, int, int); +extern tree push_template_decl (tree); +extern tree push_template_decl_real (tree, bool); +extern bool 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, + const tree *, unsigned int, + tree, unification_kind_t, int); +extern void mark_decl_instantiated (tree, int); +extern int more_specialized_fn (tree, tree, int); +extern void do_decl_instantiation (tree, tree); +extern void do_type_instantiation (tree, tree, tsubst_flags_t); +extern bool always_instantiate_p (tree); +extern tree instantiate_decl (tree, int, bool); +extern int comp_template_parms (const_tree, const_tree); +extern bool uses_parameter_packs (tree); +extern bool template_parameter_pack_p (const_tree); +extern bool function_parameter_pack_p (const_tree); +extern bool function_parameter_expanded_from_pack_p (tree, tree); +extern tree make_pack_expansion (tree); +extern bool check_for_bare_parameter_packs (tree); +extern tree build_template_info (tree, tree); +extern tree get_template_info (const_tree); +extern VEC(qualified_typedef_usage_t,gc)* get_types_needing_access_check (tree); +extern int template_class_depth (tree); +extern int is_specialization_of (tree, tree); +extern bool is_specialization_of_friend (tree, tree); +extern tree get_pattern_parm (tree, tree); +extern int comp_template_args (tree, tree); +extern tree maybe_process_partial_specialization (tree); +extern tree most_specialized_instantiation (tree); +extern void print_candidates (tree); +extern void instantiate_pending_templates (int); +extern tree tsubst_default_argument (tree, tree, tree); +extern tree tsubst (tree, tree, tsubst_flags_t, tree); +extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, + tree, bool, 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 struct tinst_level *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 dependent_scope_p (tree); +extern bool any_dependent_template_arguments_p (const_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 (const VEC(tree,gc) *); +extern bool type_dependent_expression_p_push (tree); +extern bool value_dependent_expression_p (tree); +extern bool any_value_dependent_elements_p (const_tree); +extern bool dependent_omp_for_p (tree, tree, tree, tree); +extern tree resolve_typename_type (tree, bool); +extern tree template_for_substitution (tree); +extern tree build_non_dependent_expr (tree); +extern void make_args_non_dependent (VEC(tree,gc) *); +extern bool reregister_specialization (tree, tree, tree); +extern tree fold_non_dependent_expr (tree); +extern bool explicit_class_specialization_p (tree); +extern int push_tinst_level (tree); +extern void pop_tinst_level (void); +extern struct tinst_level *outermost_tinst_level(void); +extern bool parameter_of_template_p (tree, tree); +extern void init_template_processing (void); +extern void print_template_statistics (void); +bool template_template_parameter_p (const_tree); +extern bool primary_template_instantiation_p (const_tree); +extern tree get_primary_template_innermost_parameters (const_tree); +extern tree get_template_parms_at_level (tree, int); +extern tree get_template_innermost_arguments (const_tree); +extern tree get_template_argument_pack_elems (const_tree); +extern tree get_function_template_decl (const_tree); +extern tree resolve_nondeduced_context (tree); +extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val); + +/* in repo.c */ +extern void init_repo (void); +extern int repo_emit_p (tree); +extern bool repo_export_class_p (const_tree); +extern void finish_repo (void); + +/* in rtti.c */ +/* A vector of all tinfo decls that haven't been emitted yet. */ +extern GTY(()) VEC(tree,gc) *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_headof (tree); +extern tree build_dynamic_cast (tree, tree, tsubst_flags_t); +extern void emit_support_tinfos (void); +extern bool emit_tinfo_decl (tree); + +/* in search.c */ +extern bool accessible_base_p (tree, tree, bool); +extern tree lookup_base (tree, tree, base_access, + base_kind *); +extern tree dcast_base_hint (tree, tree); +extern int accessible_p (tree, tree, bool); +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_slot (tree, tree); +extern int class_method_index_for_fn (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 print_search_statistics (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_from_vbase (tree); +extern tree binfo_for_vbase (tree, tree); +extern tree look_for_overrides_here (tree, tree); +#define dfs_skip_bases ((tree)1) +extern tree dfs_walk_all (tree, tree (*) (tree, void *), + tree (*) (tree, void *), void *); +extern tree dfs_walk_once (tree, tree (*) (tree, void *), + tree (*) (tree, void *), 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); +extern int shared_member_p (tree); + + +/* The representation of a deferred access check. */ + +typedef struct GTY(()) deferred_access_check { + /* The base class in which the declaration is referenced. */ + tree binfo; + /* The declaration whose access must be checked. */ + tree decl; + /* The declaration that should be used in the error message. */ + tree diag_decl; +} deferred_access_check; +DEF_VEC_O(deferred_access_check); +DEF_VEC_ALLOC_O(deferred_access_check,gc); + +/* 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 VEC (deferred_access_check,gc)* get_deferred_access_checks (void); +extern void pop_to_parent_deferring_access_checks (void); +extern void perform_access_checks (VEC (deferred_access_check,gc)*); +extern void perform_deferred_access_checks (void); +extern void perform_or_defer_access_check (tree, tree, tree); +extern bool speculative_access_check (tree, tree, tree, bool); +extern int stmts_are_full_exprs_p (void); +extern void init_cp_semantics (void); +extern tree do_poplevel (tree); +extern void add_decl_expr (tree); +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 (tree); +extern void finish_else_clause (tree); +extern void finish_if_stmt (tree); +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_scope (tree *); +extern tree begin_for_stmt (tree, tree); +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 begin_range_for_stmt (tree, tree); +extern void finish_range_for_decl (tree, tree, tree); +extern void finish_range_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_goto_stmt (tree); +extern tree begin_try_block (void); +extern void finish_try_block (tree); +extern void finish_handler_sequence (tree); +extern tree begin_function_try_block (tree *); +extern void finish_function_try_block (tree); +extern void finish_function_handler_sequence (tree, tree); +extern void finish_cleanup_try_block (tree); +extern tree begin_handler (void); +extern void finish_handler_parms (tree, tree); +extern void finish_handler (tree); +extern void finish_cleanup (tree, tree); +extern bool literal_type_p (tree); +extern tree validate_constexpr_fundecl (tree); +extern tree register_constexpr_fundef (tree, tree); +extern bool check_constexpr_ctor_body (tree, tree); +extern tree ensure_literal_type_for_constexpr_object (tree); +extern bool potential_constant_expression (tree); +extern bool potential_rvalue_constant_expression (tree); +extern bool require_potential_constant_expression (tree); +extern bool require_potential_rvalue_constant_expression (tree); +extern tree cxx_constant_value (tree); +extern tree maybe_constant_value (tree); +extern tree maybe_constant_init (tree); +extern bool is_sub_constant_expr (tree); +extern bool reduced_constant_expression_p (tree); +extern VEC(tree,heap)* cx_error_context (void); + +enum { + BCS_NO_SCOPE = 1, + BCS_TRY_BLOCK = 2, + BCS_FN_BODY = 4 +}; +extern tree begin_compound_stmt (unsigned int); + +extern void finish_compound_stmt (tree); +extern tree finish_asm_stmt (int, tree, tree, tree, tree, + tree); +extern tree finish_label_stmt (tree); +extern void finish_label_decl (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, tree); +extern tree finish_stmt_expr (tree, bool); +extern tree stmt_expr_value_expr (tree); +bool empty_expr_stmt_p (tree); +extern tree perform_koenig_lookup (tree, VEC(tree,gc) *, bool); +extern tree finish_call_expr (tree, VEC(tree,gc) **, bool, + bool, tsubst_flags_t); +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 void finish_translation_unit (void); +extern tree finish_template_type_parm (tree, tree); +extern tree finish_template_template_parm (tree, tree); +extern tree begin_class_definition (tree, 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 tree finish_id_expression (tree, tree, tree, + cp_id_kind *, + bool, bool, bool *, + bool, bool, bool, bool, + const char **, + location_t); +extern tree finish_typeof (tree); +extern tree finish_offsetof (tree); +extern void finish_decl_cleanup (tree, tree); +extern void finish_eh_cleanup (tree); +extern void emit_associated_thunks (tree); +extern void finish_mem_initializers (tree); +extern tree check_template_template_default_arg (tree); +extern bool expand_or_defer_fn_1 (tree); +extern void expand_or_defer_fn (tree); +extern void add_typedef_to_current_template_for_access_check (tree, tree, + location_t); +extern void check_accessibility_of_qualified_id (tree, tree, tree); +extern tree finish_qualified_id_expr (tree, tree, bool, bool, + bool, bool); +extern void simplify_aggr_init_expr (tree *); +extern void finalize_nrv (tree *, tree, tree); +extern void note_decl_for_pch (tree); +extern tree finish_omp_clauses (tree); +extern void finish_omp_threadprivate (tree); +extern tree begin_omp_structured_block (void); +extern tree finish_omp_structured_block (tree); +extern tree begin_omp_parallel (void); +extern tree finish_omp_parallel (tree, tree); +extern tree begin_omp_task (void); +extern tree finish_omp_task (tree, tree); +extern tree finish_omp_for (location_t, tree, tree, + tree, tree, tree, tree, tree); +extern void finish_omp_atomic (enum tree_code, tree, tree); +extern void finish_omp_barrier (void); +extern void finish_omp_flush (void); +extern void finish_omp_taskwait (void); +extern bool cxx_omp_create_clause_info (tree, tree, bool, bool, bool); +extern tree baselink_for_fns (tree); +extern void finish_static_assert (tree, tree, location_t, + bool); +extern tree describable_type (tree); +extern tree finish_decltype_type (tree, bool, tsubst_flags_t); +extern tree finish_trait_expr (enum cp_trait_kind, tree, tree); +extern tree build_lambda_expr (void); +extern tree build_lambda_object (tree); +extern tree begin_lambda_type (tree); +extern tree lambda_capture_field_type (tree); +extern tree lambda_return_type (tree); +extern tree lambda_function (tree); +extern void apply_lambda_return_type (tree, tree); +extern tree add_capture (tree, tree, tree, bool, bool); +extern tree add_default_capture (tree, tree, tree); +extern void register_capture_members (tree); +extern tree lambda_expr_this_capture (tree); +extern tree nonlambda_method_basetype (void); +extern void maybe_add_lambda_conv_op (tree); + +/* in tree.c */ +void cp_free_lang_data (tree t); +extern tree force_target_expr (tree, tree); +extern tree build_target_expr_with_type (tree, tree); +extern void lang_check_failed (const char *, int, + const char *) ATTRIBUTE_NORETURN; +extern tree stabilize_expr (tree, tree *); +extern void stabilize_call (tree, tree *); +extern void stabilize_aggr_init (tree, tree *); +extern bool stabilize_init (tree, tree *); +extern tree add_stmt_to_compound (tree, tree); +extern void init_tree (void); +extern bool pod_type_p (const_tree); +extern bool layout_pod_type_p (const_tree); +extern bool std_layout_type_p (const_tree); +extern bool trivial_type_p (const_tree); +extern bool trivially_copyable_p (const_tree); +extern bool type_has_nontrivial_default_init (const_tree); +extern bool type_has_nontrivial_copy_init (const_tree); +extern bool class_tmpl_impl_spec_p (const_tree); +extern int zero_init_p (const_tree); +extern tree strip_typedefs (tree); +extern tree copy_binfo (tree, tree, tree, + tree *, int); +extern int member_p (const_tree); +extern cp_lvalue_kind real_lvalue_p (const_tree); +extern cp_lvalue_kind lvalue_kind (const_tree); +extern bool lvalue_or_rvalue_with_address_p (const_tree); +extern bool builtin_valid_in_constant_expr_p (const_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_min_non_dep_call_vec (tree, tree, VEC(tree,gc) *); +extern tree build_cplus_new (tree, tree); +extern tree build_aggr_init_expr (tree, tree); +extern tree get_target_expr (tree); +extern tree build_cplus_array_type (tree, tree); +extern tree build_array_of_n_type (tree, int); +extern tree build_array_copy (tree); +extern tree build_vec_init_expr (tree, tree); +extern void diagnose_non_constexpr_vec_init (tree); +extern tree hash_tree_cons (tree, tree, tree); +extern tree hash_tree_chain (tree, tree); +extern tree build_qualified_name (tree, tree, tree, bool); +extern int is_overloaded_fn (tree); +extern tree get_fns (tree); +extern tree get_first_fn (tree); +extern tree ovl_cons (tree, tree); +extern tree build_overload (tree, tree); +extern bool non_static_member_function_p (tree); +extern const char *cxx_printable_name (tree, int); +extern const char *cxx_printable_name_translate (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 decl_namespace_context (tree); +extern bool decl_anon_ns_mem_p (const_tree); +extern tree lvalue_type (tree); +extern tree error_type (tree); +extern int varargs_function_p (const_tree); +extern bool really_overloaded_fn (tree); +extern bool cp_tree_equal (tree, tree); +extern tree no_linkage_check (tree, bool); +extern void debug_binfo (tree); +extern tree build_dummy_object (tree); +extern tree maybe_dummy_object (tree, tree *); +extern int is_dummy_object (const_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_reference_type (tree, bool); +extern tree move (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_warning_or_error) +extern bool cv_qualified_p (const_tree); +extern tree cv_unqualified (tree); +extern special_function_kind special_function_p (const_tree); +extern int count_trees (tree); +extern int char_type_p (tree); +extern void verify_stmt_tree (tree); +extern linkage_kind decl_linkage (tree); +extern duration_kind decl_storage_duration (tree); +extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn, + void*, struct pointer_set_t*); +#define cp_walk_tree(a,b,c,d) \ + walk_tree_1 (a, b, c, d, cp_walk_subtrees) +#define cp_walk_tree_without_duplicates(a,b,c) \ + walk_tree_without_duplicates_1 (a, b, c, cp_walk_subtrees) +extern tree fold_if_not_in_template (tree); +extern tree rvalue (tree); +extern tree convert_bitfield_to_declared_type (tree); +extern tree cp_save_expr (tree); +extern bool cast_valid_in_integral_constant_expression_p (tree); +extern bool cxx_type_hash_eq (const_tree, const_tree); + +extern void cxx_print_statistics (void); + +/* in ptree.c */ +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 (diagnostic_context *, + const char *, + struct diagnostic_info *); + +/* in typeck.c */ +extern bool cxx_mark_addressable (tree); +extern int string_conv_p (const_tree, const_tree, int); +extern tree cp_truthvalue_conversion (tree); +extern tree condition_conversion (tree); +extern tree require_complete_type (tree); +extern tree require_complete_type_sfinae (tree, tsubst_flags_t); +extern tree complete_type (tree); +extern tree complete_type_or_else (tree, tree); +extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t); +extern int type_unknown_p (const_tree); +enum { ce_derived, ce_normal, ce_exact }; +extern bool comp_except_specs (const_tree, const_tree, int); +extern bool comptypes (tree, tree, int); +extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree); +extern bool compparms (const_tree, const_tree); +extern int comp_cv_qualification (const_tree, const_tree); +extern int comp_cv_qual_signature (tree, tree); +extern tree cxx_sizeof_or_alignof_expr (tree, enum tree_code, bool); +extern tree cxx_sizeof_or_alignof_type (tree, enum tree_code, bool); +extern tree cxx_sizeof_nowarn (tree); +extern tree is_bitfield_expr_with_lowered_type (const_tree); +extern tree unlowered_expr_type (const_tree); +extern tree decay_conversion (tree); +extern tree build_class_member_access_expr (tree, tree, tree, bool, + tsubst_flags_t); +extern tree finish_class_member_access_expr (tree, tree, bool, + tsubst_flags_t); +extern tree build_x_indirect_ref (tree, ref_operator, + tsubst_flags_t); +extern tree cp_build_indirect_ref (tree, ref_operator, + tsubst_flags_t); +extern tree build_array_ref (location_t, tree, tree); +extern tree cp_build_array_ref (location_t, tree, tree, + tsubst_flags_t); +extern tree get_member_function_from_ptrfunc (tree *, tree); +extern tree cp_build_function_call (tree, tree, tsubst_flags_t); +extern tree cp_build_function_call_nary (tree, tsubst_flags_t, ...) + ATTRIBUTE_SENTINEL; +extern tree cp_build_function_call_vec (tree, VEC(tree,gc) **, + tsubst_flags_t); +extern tree build_x_binary_op (enum tree_code, tree, + enum tree_code, tree, + enum tree_code, bool *, + tsubst_flags_t); +extern tree build_x_array_ref (tree, tree, tsubst_flags_t); +extern tree build_x_unary_op (enum tree_code, tree, + tsubst_flags_t); +extern tree cp_build_addr_expr (tree, tsubst_flags_t); +extern tree cp_build_addr_expr_strict (tree, tsubst_flags_t); +extern tree cp_build_unary_op (enum tree_code, tree, int, + tsubst_flags_t); +extern tree unary_complex_lvalue (enum tree_code, tree); +extern tree build_x_conditional_expr (tree, tree, tree, + tsubst_flags_t); +extern tree build_x_compound_expr_from_list (tree, expr_list_kind, + tsubst_flags_t); +extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *); +extern tree build_x_compound_expr (tree, tree, tsubst_flags_t); +extern tree build_compound_expr (location_t, tree, tree); +extern tree cp_build_compound_expr (tree, tree, tsubst_flags_t); +extern tree build_static_cast (tree, tree, tsubst_flags_t); +extern tree build_reinterpret_cast (tree, tree, tsubst_flags_t); +extern tree build_const_cast (tree, tree, tsubst_flags_t); +extern tree build_c_cast (location_t, tree, tree); +extern tree cp_build_c_cast (tree, tree, tsubst_flags_t); +extern tree build_x_modify_expr (tree, enum tree_code, tree, + tsubst_flags_t); +extern tree cp_build_modify_expr (tree, enum tree_code, tree, + tsubst_flags_t); +extern tree convert_for_initialization (tree, tree, tree, int, + impl_conv_rhs, tree, int, + tsubst_flags_t); +extern int comp_ptr_ttypes (tree, tree); +extern bool comp_ptr_ttypes_const (tree, tree); +extern bool error_type_p (const_tree); +extern int ptr_reasonably_similar (const_tree, const_tree); +extern tree build_ptrmemfunc (tree, tree, int, bool, + tsubst_flags_t); +extern int cp_type_quals (const_tree); +extern int type_memfn_quals (const_tree); +extern tree apply_memfn_quals (tree, cp_cv_quals); +extern bool cp_has_mutable_p (const_tree); +extern bool at_least_as_qualified_p (const_tree, const_tree); +extern void cp_apply_type_quals_to_decl (int, tree); +extern tree build_ptrmemfunc1 (tree, tree, tree); +extern void expand_ptrmemfunc_cst (tree, tree *, tree *); +extern tree type_after_usual_arithmetic_conversions (tree, tree); +extern tree common_pointer_type (tree, tree); +extern tree composite_pointer_type (tree, tree, tree, tree, + composite_pointer_operation, + tsubst_flags_t); +extern tree merge_types (tree, tree); +extern tree strip_array_domain (tree); +extern tree check_return_expr (tree, bool *); +extern tree cp_build_binary_op (location_t, + enum tree_code, tree, tree, + tsubst_flags_t); +#define cxx_sizeof(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true) +extern tree build_ptrmemfunc_access_expr (tree, tree); +extern tree build_address (tree); +extern tree build_typed_address (tree, tree); +extern tree build_nop (tree, tree); +extern tree non_reference (tree); +extern tree lookup_anon_field (tree, tree); +extern bool invalid_nonstatic_memfn_p (const_tree, tsubst_flags_t); +extern tree convert_member_func_to_ptr (tree, tree); +extern tree convert_ptrmem (tree, tree, bool, bool, + tsubst_flags_t); +extern int lvalue_or_else (tree, enum lvalue_use, + tsubst_flags_t); +extern void check_template_keyword (tree); + +/* in typeck2.c */ +extern void require_complete_eh_spec_types (tree, tree); +extern void cxx_incomplete_type_diagnostic (const_tree, const_tree, diagnostic_t); +#undef cxx_incomplete_type_error +extern void cxx_incomplete_type_error (const_tree, const_tree); +#define cxx_incomplete_type_error(V,T) \ + (cxx_incomplete_type_diagnostic ((V), (T), DK_ERROR)) +extern tree error_not_base_type (tree, tree); +extern tree binfo_or_else (tree, tree); +extern void cxx_readonly_error (tree, enum lvalue_use); +extern void complete_type_check_abstract (tree); +extern int abstract_virtuals_error (tree, tree); + +extern tree store_init_value (tree, tree, int); +extern void check_narrowing (tree, tree); +extern tree digest_init (tree, tree); +extern tree digest_init_flags (tree, tree, int); +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, tsubst_flags_t); +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_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); + +/* In cp/cp-objcp-common.c. */ + +extern alias_set_type cxx_get_alias_set (tree); +extern bool cxx_warn_unused_global_decl (const_tree); +extern size_t cp_tree_size (enum tree_code); +extern bool cp_var_mod_type_p (tree, tree); +extern void cxx_initialize_diagnostics (diagnostic_context *); +extern int cxx_types_compatible_p (tree, tree); +extern void init_shadowed_var_for_decl (void); + +/* in cp-gimplify.c */ +extern int cp_gimplify_expr (tree *, gimple_seq *, + gimple_seq *); +extern void cp_genericize (tree); +extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree); +extern tree cxx_omp_clause_default_ctor (tree, tree, tree); +extern tree cxx_omp_clause_copy_ctor (tree, tree, tree); +extern tree cxx_omp_clause_assign_op (tree, tree, tree); +extern tree cxx_omp_clause_dtor (tree, tree); +extern void cxx_omp_finish_clause (tree); +extern bool cxx_omp_privatize_by_reference (const_tree); + +/* in name-lookup.c */ +extern void suggest_alternatives_for (location_t, tree); + +/* -- end of C++ */ + +#endif /* ! GCC_CP_TREE_H */ diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c new file mode 100644 index 000000000..d26d870a7 --- /dev/null +++ b/gcc/cp/cvt.c @@ -0,0 +1,1680 @@ +/* Language-level data type conversion for GNU C++. + Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 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 3, 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 COPYING3. If not see +. */ + + +/* 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" +#include "intl.h" +#include "convert.h" +#include "decl.h" +#include "target.h" + +static tree cp_convert_to_pointer (tree, tree); +static tree convert_to_pointer_force (tree, tree); +static tree build_type_conversion (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 + assumes that no other conversions can be NOP_EXPRs. + + Conversion between integer and pointer is represented with CONVERT_EXPR. + Converting integer to real uses FLOAT_EXPR + and real to integer uses FIX_TRUNC_EXPR. + + Here is a list of all the functions that assume that widening and + narrowing is always done with a NOP_EXPR: + In convert.c, convert_to_integer. + In c-typeck.c, build_binary_op_nodefault (boolean ops), + and c_common_truthvalue_conversion. + In expr.c: expand_expr, for operands of a MULT_EXPR. + In fold-const.c: fold. + In tree.c: get_narrower and get_unwidened. + + C++: in multiple-inheritance, converting between pointers may involve + adjusting them by a delta stored within the class definition. */ + +/* Subroutines of `convert'. */ + +/* if converting pointer to pointer + if dealing with classes, check for derived->base or vice versa + else if dealing with method pointers, delegate + else convert blindly + else if converting class, pass off to build_type_conversion + else try C-style pointer conversion. */ + +static tree +cp_convert_to_pointer (tree type, tree expr) +{ + tree intype = TREE_TYPE (expr); + enum tree_code form; + tree rval; + if (intype == error_mark_node) + return error_mark_node; + + if (MAYBE_CLASS_TYPE_P (intype)) + { + intype = complete_type (intype); + if (!COMPLETE_TYPE_P (intype)) + { + error ("can%'t convert from incomplete type %qT to %qT", + intype, type); + return error_mark_node; + } + + rval = build_type_conversion (type, expr); + if (rval) + { + if (rval == error_mark_node) + error ("conversion of %qE from %qT to %qT is ambiguous", + expr, intype, type); + return rval; + } + } + + /* Handle anachronistic conversions from (::*)() to cv void* or (*)(). */ + if (TREE_CODE (type) == POINTER_TYPE + && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE + || VOID_TYPE_P (TREE_TYPE (type)))) + { + if (TYPE_PTRMEMFUNC_P (intype) + || TREE_CODE (intype) == METHOD_TYPE) + return convert_member_func_to_ptr (type, expr); + if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE) + return build_nop (type, expr); + intype = TREE_TYPE (expr); + } + + if (expr == error_mark_node) + return error_mark_node; + + form = TREE_CODE (intype); + + if (POINTER_TYPE_P (intype)) + { + intype = TYPE_MAIN_VARIANT (intype); + + if (TYPE_MAIN_VARIANT (type) != intype + && TREE_CODE (type) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE + && MAYBE_CLASS_TYPE_P (TREE_TYPE (type)) + && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype)) + && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE) + { + enum tree_code code = PLUS_EXPR; + tree binfo; + tree intype_class; + tree type_class; + bool same_p; + + intype_class = TREE_TYPE (intype); + type_class = TREE_TYPE (type); + + same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class), + TYPE_MAIN_VARIANT (type_class)); + binfo = NULL_TREE; + /* Try derived to base conversion. */ + if (!same_p) + binfo = lookup_base (intype_class, type_class, ba_check, NULL); + if (!same_p && !binfo) + { + /* Try base to derived conversion. */ + binfo = lookup_base (type_class, intype_class, ba_check, NULL); + code = MINUS_EXPR; + } + if (binfo == error_mark_node) + return error_mark_node; + if (binfo || same_p) + { + if (binfo) + expr = build_base_path (code, expr, binfo, 0); + /* Add any qualifier conversions. */ + return build_nop (type, expr); + } + } + + if (TYPE_PTRMEMFUNC_P (type)) + { + error ("cannot convert %qE from type %qT to type %qT", + expr, intype, type); + return error_mark_node; + } + + return build_nop (type, expr); + } + else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)) + || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype))) + return convert_ptrmem (type, expr, /*allow_inverse_p=*/false, + /*c_cast_p=*/false, tf_warning_or_error); + 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)); + 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 %qE from type %qT to type %qT", + expr, intype, type); + return error_mark_node; + } + + if (null_ptr_cst_p (expr)) + { + if (TYPE_PTRMEMFUNC_P (type)) + return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0, + /*c_cast_p=*/false, tf_warning_or_error); + + if (TYPE_PTRMEM_P (type)) + { + /* A NULL pointer-to-member is represented by -1, not by + zero. */ + expr = build_int_cst_type (type, -1); + } + else + expr = build_int_cst (type, 0); + + return expr; + } + else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form)) + { + error ("invalid conversion from %qT to %qT", intype, type); + return error_mark_node; + } + + if (INTEGRAL_CODE_P (form)) + { + if (TYPE_PRECISION (intype) == POINTER_SIZE) + return build1 (CONVERT_EXPR, type, expr); + expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0), expr); + /* Modes may be different but sizes should be the same. There + is supposed to be some integral type that is the same width + as a pointer. */ + gcc_assert (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))) + == GET_MODE_SIZE (TYPE_MODE (type))); + + return convert_to_pointer (type, expr); + } + + if (type_unknown_p (expr)) + return instantiate_type (type, expr, tf_warning_or_error); + + error ("cannot convert %qE from type %qT to type %qT", + expr, intype, type); + return error_mark_node; +} + +/* Like convert, except permit conversions to take place which + are not normally allowed due to access restrictions + (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) + { + intype = TYPE_MAIN_VARIANT (intype); + + if (TYPE_MAIN_VARIANT (type) != intype + && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE + && MAYBE_CLASS_TYPE_P (TREE_TYPE (type)) + && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype)) + && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE) + { + enum tree_code code = PLUS_EXPR; + tree binfo; + + binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type), + ba_unique, NULL); + if (!binfo) + { + binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype), + ba_unique, NULL); + code = MINUS_EXPR; + } + if (binfo == error_mark_node) + return error_mark_node; + if (binfo) + { + expr = build_base_path (code, expr, binfo, 0); + if (expr == error_mark_node) + return error_mark_node; + /* Add any qualifier conversions. */ + if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)), + TREE_TYPE (type))) + expr = build_nop (type, expr); + return expr; + } + } + } + + return cp_convert_to_pointer (type, expr); +} + +/* We are passing something to a function which requires a reference. + The type we are interested in is in TYPE. The initial + value we have to begin with is in ARG. + + FLAGS controls how we manage access checking. + DIRECT_BIND in FLAGS controls how any temporaries are generated. + 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); + tree target_type = TREE_TYPE (type); + + gcc_assert (TREE_CODE (type) == REFERENCE_TYPE); + + if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg)) + { + /* Create a new temporary variable. We can't just use a TARGET_EXPR + here because it needs to live as long as DECL. */ + tree targ = arg; + + arg = make_temporary_var_for_ref_to_temp (decl, target_type); + + /* Process the initializer for the declaration. */ + DECL_INITIAL (arg) = targ; + cp_finish_decl (arg, targ, /*init_const_expr_p=*/false, NULL_TREE, + LOOKUP_ONLYCONVERTING|DIRECT_BIND); + } + else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg)) + return get_target_expr (arg); + + /* If we had a way to wrap this up, and say, if we ever needed its + address, transform all occurrences of the register, into a memory + reference we could win better. */ + rval = cp_build_addr_expr (arg, tf_warning_or_error); + if (rval == error_mark_node) + return error_mark_node; + + if ((flags & LOOKUP_PROTECT) + && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type) + && MAYBE_CLASS_TYPE_P (argtype) + && MAYBE_CLASS_TYPE_P (target_type)) + { + /* We go through lookup_base for the access control. */ + tree binfo = lookup_base (argtype, target_type, ba_check, NULL); + if (binfo == error_mark_node) + return error_mark_node; + if (binfo == NULL_TREE) + return error_not_base_type (target_type, argtype); + rval = build_base_path (PLUS_EXPR, rval, binfo, 1); + } + else + rval + = convert_to_pointer_force (build_pointer_type (target_type), rval); + return build_nop (type, rval); +} + +/* Subroutine of convert_to_reference. REFTYPE is the target reference type. + INTYPE is the original rvalue type and DECL is an optional _DECL node + for diagnostics. + + [dcl.init.ref] says that if an rvalue is used to + initialize a reference, then the reference must be to a + non-volatile const type. */ + +static void +warn_ref_binding (tree reftype, tree intype, tree decl) +{ + tree ttl = TREE_TYPE (reftype); + + if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl)) + { + const char *msg; + + if (CP_TYPE_VOLATILE_P (ttl) && decl) + msg = G_("initialization of volatile reference type %q#T from " + "rvalue of type %qT"); + else if (CP_TYPE_VOLATILE_P (ttl)) + msg = G_("conversion to volatile reference type %q#T " + "from rvalue of type %qT"); + else if (decl) + msg = G_("initialization of non-const reference type %q#T from " + "rvalue of type %qT"); + else + msg = G_("conversion to non-const reference type %q#T from " + "rvalue of type %qT"); + + permerror (input_location, msg, reftype, intype); + } +} + +/* For C++: Only need to do one-level references, but cannot + get tripped up on signed/unsigned differences. + + DECL is either NULL_TREE or the _DECL node for a reference that is being + initialized. It can be error_mark_node if we don't know the _DECL but + 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_warning_or_error : tf_none); + + if (expr == error_mark_node) + return error_mark_node; + + intype = TREE_TYPE (expr); + + gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE); + gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE); + + intype = TYPE_MAIN_VARIANT (intype); + + can_convert_intype_to_type = can_convert (type, intype); + if (!can_convert_intype_to_type + && (convtype & CONV_IMPLICIT) && MAYBE_CLASS_TYPE_P (intype) + && ! (flags & LOOKUP_NO_CONVERSION)) + { + /* Look for a user-defined conversion to lvalue that we can use. */ + + rval_as_conversion + = build_type_conversion (reftype, expr); + + if (rval_as_conversion && rval_as_conversion != error_mark_node + && real_lvalue_p (rval_as_conversion)) + { + 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) + { + tree ttl = TREE_TYPE (reftype); + tree ttr = lvalue_type (expr); + + if (! real_lvalue_p (expr)) + warn_ref_binding (reftype, intype, decl); + + if (! (convtype & CONV_CONST) + && !at_least_as_qualified_p (ttl, ttr)) + permerror (input_location, "conversion from %qT to %qT discards qualifiers", + ttr, reftype); + } + + return build_up_reference (reftype, expr, flags, decl); + } + else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr)) + { + /* When casting an lvalue to a reference type, just convert into + a pointer to the new type and deference it. This is allowed + by San Diego WP section 5.2.9 paragraph 12, though perhaps it + should be done directly (jason). (int &)ri ---> *(int*)&ri */ + + /* 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 (0, "casting %qT to %qT does not dereference pointer", + intype, reftype); + + rval = cp_build_addr_expr (expr, tf_warning_or_error); + if (rval != error_mark_node) + rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), + rval, 0); + if (rval != error_mark_node) + rval = build1 (NOP_EXPR, reftype, rval); + } + else + { + rval = convert_for_initialization (NULL_TREE, type, expr, flags, + ICR_CONVERTING, 0, 0, + tf_warning_or_error); + if (rval == NULL_TREE || rval == error_mark_node) + return rval; + warn_ref_binding (reftype, intype, decl); + rval = build_up_reference (reftype, rval, flags, decl); + } + + if (rval) + { + /* If we found a way to convert earlier, then use it. */ + return rval; + } + + if (flags & LOOKUP_COMPLAIN) + error ("cannot convert type %qT to type %qT", intype, reftype); + + return error_mark_node; +} + +/* We are using a reference VAL for its value. Bash that reference all the + way down to its lowest form. */ + +tree +convert_from_reference (tree val) +{ + if (TREE_TYPE (val) + && TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE) + { + tree t = TREE_TYPE (TREE_TYPE (val)); + tree ref = build1 (INDIRECT_REF, t, val); + + mark_exp_read (val); + /* We *must* set TREE_READONLY when dereferencing a pointer to const, + so that we get the proper error message if the result is used + to assign to. Also, &* is supposed to be a no-op. */ + TREE_READONLY (ref) = CP_TYPE_CONST_P (t); + TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t); + TREE_SIDE_EFFECTS (ref) + = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val)); + REFERENCE_REF_P (ref) = 1; + val = ref; + } + + return val; +} + +/* Really perform an lvalue-to-rvalue conversion, including copying an + argument of class type into a temporary. */ + +tree +force_rvalue (tree expr) +{ + if (MAYBE_CLASS_TYPE_P (TREE_TYPE (expr)) && TREE_CODE (expr) != TARGET_EXPR) + expr = ocp_convert (TREE_TYPE (expr), expr, + CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL); + else + expr = decay_conversion (expr); + + return expr; +} + + +/* If EXPR and ORIG are INTEGER_CSTs, return a version of EXPR that has + TREE_OVERFLOW set only if it is set in ORIG. Otherwise, return EXPR + unchanged. */ + +static tree +ignore_overflows (tree expr, tree orig) +{ + if (TREE_CODE (expr) == INTEGER_CST + && TREE_CODE (orig) == INTEGER_CST + && TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig)) + { + gcc_assert (!TREE_OVERFLOW (orig)); + /* Ensure constant sharing. */ + expr = build_int_cst_wide (TREE_TYPE (expr), + TREE_INT_CST_LOW (expr), + TREE_INT_CST_HIGH (expr)); + } + return expr; +} + +/* Fold away simple conversions, but make sure TREE_OVERFLOW is set + properly. */ + +tree +cp_fold_convert (tree type, tree expr) +{ + tree conv = fold_convert (type, expr); + conv = ignore_overflows (conv, expr); + return conv; +} + +/* C++ conversions, preference to static cast conversions. */ + +tree +cp_convert (tree type, tree expr) +{ + return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL); +} + +/* C++ equivalent of convert_and_check but using cp_convert as the + conversion function. + + Convert EXPR to TYPE, warning about conversion problems with constants. + Invoke this function on every expression that is converted implicitly, + i.e. because of language rules and not because of an explicit cast. */ + +tree +cp_convert_and_check (tree type, tree expr) +{ + tree result; + + if (TREE_TYPE (expr) == type) + return expr; + + result = cp_convert (type, expr); + + if (c_inhibit_evaluation_warnings == 0 + && !TREE_OVERFLOW_P (expr) + && result != error_mark_node) + warnings_for_convert_and_check (type, expr, result); + + return result; +} + +/* Conversion... + + 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); + const char *invalid_conv_diag; + tree e1; + + if (error_operand_p (e) || type == error_mark_node) + return error_mark_node; + + complete_type (type); + complete_type (TREE_TYPE (expr)); + + if ((invalid_conv_diag + = targetm.invalid_conversion (TREE_TYPE (expr), type))) + { + error (invalid_conv_diag); + return error_mark_node; + } + + /* FIXME remove when moving to c_fully_fold model. */ + /* FIXME do we still need this test? */ + if (!CLASS_TYPE_P (type)) + e = integral_constant_value (e); + if (error_operand_p (e)) + return error_mark_node; + + if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP)) + /* We need a new temporary; don't take this shortcut. */; + else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e))) + { + 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. */ + return e; + /* For complex data types, we need to perform componentwise + conversion. */ + else if (TREE_CODE (type) == COMPLEX_TYPE) + return fold_if_not_in_template (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. */ + TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type; + return e; + } + else + { + /* We shouldn't be treating objects of ADDRESSABLE type as + rvalues. */ + gcc_assert (!TREE_ADDRESSABLE (type)); + return fold_if_not_in_template (build_nop (type, e)); + } + } + + e1 = targetm.convert_to_type (type, e); + if (e1) + return e1; + + if (code == VOID_TYPE && (convtype & CONV_STATIC)) + { + e = convert_to_void (e, ICV_CAST, tf_warning_or_error); + return e; + } + + if (INTEGRAL_CODE_P (code)) + { + tree intype = TREE_TYPE (e); + tree converted; + + if (TREE_CODE (type) == ENUMERAL_TYPE) + { + /* enum = enum, enum = int, enum = float, (enum)pointer are all + errors. */ + if (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype) + || TREE_CODE (intype) == REAL_TYPE) + && ! (convtype & CONV_STATIC)) + || TREE_CODE (intype) == POINTER_TYPE) + { + if (flags & LOOKUP_COMPLAIN) + permerror (input_location, "conversion from %q#T to %q#T", intype, type); + + if (!flag_permissive) + return error_mark_node; + } + + /* [expr.static.cast] + + 8. A value of integral or enumeration type can be explicitly + converted to an enumeration type. The value is unchanged if + the original value is within the range of the enumeration + values. Otherwise, the resulting enumeration value is + unspecified. */ + if (TREE_CODE (expr) == INTEGER_CST + && !int_fits_type_p (expr, ENUM_UNDERLYING_TYPE (type))) + warning (OPT_Wconversion, + "the result of the conversion is unspecified because " + "%qE is outside the range of type %qT", + expr, type); + } + if (MAYBE_CLASS_TYPE_P (intype)) + { + tree rval; + rval = build_type_conversion (type, e); + if (rval) + return rval; + if (flags & LOOKUP_COMPLAIN) + error ("%q#T used where a %qT was expected", intype, type); + return error_mark_node; + } + if (code == BOOLEAN_TYPE) + { + /* We can't implicitly convert a scoped enum to bool, so convert + to the underlying type first. */ + if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC)) + e = build_nop (ENUM_UNDERLYING_TYPE (intype), e); + return cp_truthvalue_conversion (e); + } + + converted = fold_if_not_in_template (convert_to_integer (type, e)); + + /* Ignore any integer overflow caused by the conversion. */ + return ignore_overflows (converted, e); + } + if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e)) + return nullptr_node; + if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type)) + return fold_if_not_in_template (cp_convert_to_pointer (type, e)); + if (code == VECTOR_TYPE) + { + tree in_vtype = TREE_TYPE (e); + if (MAYBE_CLASS_TYPE_P (in_vtype)) + { + tree ret_val; + ret_val = build_type_conversion (type, e); + if (ret_val) + return ret_val; + if (flags & LOOKUP_COMPLAIN) + error ("%q#T used where a %qT was expected", in_vtype, type); + return error_mark_node; + } + return fold_if_not_in_template (convert_to_vector (type, e)); + } + if (code == REAL_TYPE || code == COMPLEX_TYPE) + { + if (MAYBE_CLASS_TYPE_P (TREE_TYPE (e))) + { + tree rval; + rval = build_type_conversion (type, e); + if (rval) + return rval; + else + if (flags & LOOKUP_COMPLAIN) + error ("%q#T used where a floating point value was expected", + TREE_TYPE (e)); + } + if (code == REAL_TYPE) + return fold_if_not_in_template (convert_to_real (type, e)); + else if (code == COMPLEX_TYPE) + return fold_if_not_in_template (convert_to_complex (type, e)); + } + + /* New C++ semantics: since assignment is now based on + memberwise copying, if the rhs type is derived from the + lhs type, then we may still do a conversion. */ + if (RECORD_OR_UNION_CODE_P (code)) + { + tree dtype = TREE_TYPE (e); + tree ctor = NULL_TREE; + + dtype = TYPE_MAIN_VARIANT (dtype); + + /* Conversion between aggregate types. New C++ semantics allow + objects of derived type to be cast to objects of base type. + Old semantics only allowed this between pointers. + + There may be some ambiguity between using a constructor + vs. using a type conversion operator when both apply. */ + + ctor = e; + + if (abstract_virtuals_error (NULL_TREE, type)) + return error_mark_node; + + if (BRACE_ENCLOSED_INITIALIZER_P (ctor)) + ctor = perform_implicit_conversion (type, ctor, tf_warning_or_error); + else if ((flags & LOOKUP_ONLYCONVERTING) + && ! (CLASS_TYPE_P (dtype) && DERIVED_FROM_P (type, dtype))) + /* For copy-initialization, first we create a temp of the proper type + with a user-defined conversion sequence, then we direct-initialize + the target with the temp (see [dcl.init]). */ + ctor = build_user_type_conversion (type, ctor, flags); + else + { + VEC(tree,gc) *ctor_vec = make_tree_vector_single (ctor); + ctor = build_special_member_call (NULL_TREE, + complete_ctor_identifier, + &ctor_vec, + type, flags, + tf_warning_or_error); + release_tree_vector (ctor_vec); + } + if (ctor) + return build_cplus_new (type, ctor); + } + + if (flags & LOOKUP_COMPLAIN) + { + /* If the conversion failed and expr was an invalid use of pointer to + member function, try to report a meaningful error. */ + if (invalid_nonstatic_memfn_p (expr, tf_warning_or_error)) + /* We displayed the error message. */; + else + error ("conversion from %qT to non-scalar type %qT requested", + TREE_TYPE (expr), type); + } + return error_mark_node; +} + +/* When an expression is used in a void context, its value is discarded and + 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++ + where ever possible. C leaves it implementation defined as to what + constitutes an access to a volatile. So, we interpret `*vp' as a read of + the volatile object `vp' points to, unless that is an incomplete type. For + volatile references we do not do this interpretation, because that would + make it impossible to ignore the reference return value from functions. We + issue warnings in the confusing cases. + + The IMPLICIT is ICV_CAST when the user is explicitly converting an expression + to void via a cast. If an expression is being implicitly converted, IMPLICIT + indicates the context of the implicit conversion. */ + +tree +convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain) +{ + if (expr == error_mark_node + || TREE_TYPE (expr) == error_mark_node) + return error_mark_node; + + if (implicit == ICV_CAST) + mark_exp_read (expr); + else + { + tree exprv = expr; + + while (TREE_CODE (exprv) == COMPOUND_EXPR) + exprv = TREE_OPERAND (exprv, 1); + if (DECL_P (exprv) + || handled_component_p (exprv) + || TREE_CODE (exprv) == INDIRECT_REF) + /* Expr is not being 'used' here, otherwise we whould have + called mark_{rl}value_use use here, which would have in turn + called mark_exp_read. Rather, we call mark_exp_read directly + to avoid some warnings when + -Wunused-but-set-{variable,parameter} is in effect. */ + mark_exp_read (exprv); + } + + if (!TREE_TYPE (expr)) + return expr; + if (invalid_nonstatic_memfn_p (expr, complain)) + return error_mark_node; + if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR) + { + if (complain & tf_error) + error ("pseudo-destructor is not called"); + return error_mark_node; + } + if (VOID_TYPE_P (TREE_TYPE (expr))) + return expr; + switch (TREE_CODE (expr)) + { + case COND_EXPR: + { + /* The two parts of a cond expr might be separate lvalues. */ + tree op1 = TREE_OPERAND (expr,1); + tree op2 = TREE_OPERAND (expr,2); + bool side_effects = ((op1 && TREE_SIDE_EFFECTS (op1)) + || TREE_SIDE_EFFECTS (op2)); + tree new_op1, new_op2; + new_op1 = NULL_TREE; + if (implicit != ICV_CAST && !side_effects) + { + if (op1) + new_op1 = convert_to_void (op1, ICV_SECOND_OF_COND, complain); + new_op2 = convert_to_void (op2, ICV_THIRD_OF_COND, complain); + } + else + { + if (op1) + new_op1 = convert_to_void (op1, ICV_CAST, complain); + new_op2 = convert_to_void (op2, ICV_CAST, complain); + } + + expr = build3 (COND_EXPR, TREE_TYPE (new_op2), + TREE_OPERAND (expr, 0), new_op1, new_op2); + break; + } + + case COMPOUND_EXPR: + { + /* The second part of a compound expr contains the value. */ + tree op1 = TREE_OPERAND (expr,1); + tree new_op1; + if (implicit != ICV_CAST && !TREE_NO_WARNING (expr)) + new_op1 = convert_to_void (op1, ICV_RIGHT_OF_COMMA, complain); + else + new_op1 = convert_to_void (op1, ICV_CAST, complain); + + if (new_op1 != op1) + { + tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1), + TREE_OPERAND (expr, 0), new_op1); + expr = t; + } + + break; + } + + case NON_LVALUE_EXPR: + case NOP_EXPR: + /* These have already decayed to rvalue. */ + break; + + case CALL_EXPR: /* We have a special meaning for volatile void fn(). */ + break; + + case INDIRECT_REF: + { + tree type = TREE_TYPE (expr); + int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) + == REFERENCE_TYPE; + int is_volatile = TYPE_VOLATILE (type); + int is_complete = COMPLETE_TYPE_P (complete_type (type)); + + /* Can't load the value if we don't know the type. */ + if (is_volatile && !is_complete) + { + if (complain & tf_warning) + switch (implicit) + { + case ICV_CAST: + warning (0, "conversion to void will not access " + "object of incomplete type %qT", type); + break; + case ICV_SECOND_OF_COND: + warning (0, "indirection will not access object of " + "incomplete type %qT in second operand " + "of conditional expression", type); + break; + case ICV_THIRD_OF_COND: + warning (0, "indirection will not access object of " + "incomplete type %qT in third operand " + "of conditional expression", type); + break; + case ICV_RIGHT_OF_COMMA: + warning (0, "indirection will not access object of " + "incomplete type %qT in right operand of " + "comma operator", type); + break; + case ICV_LEFT_OF_COMMA: + warning (0, "indirection will not access object of " + "incomplete type %qT in left operand of " + "comma operator", type); + break; + case ICV_STATEMENT: + warning (0, "indirection will not access object of " + "incomplete type %qT in statement", type); + break; + case ICV_THIRD_IN_FOR: + warning (0, "indirection will not access object of " + "incomplete type %qT in for increment " + "expression", type); + break; + default: + gcc_unreachable (); + } + } + /* Don't load the value if this is an implicit dereference, or if + the type needs to be handled by ctors/dtors. */ + else if (is_volatile && is_reference) + { + if (complain & tf_warning) + switch (implicit) + { + case ICV_CAST: + warning (0, "conversion to void will not access " + "object of type %qT", type); + break; + case ICV_SECOND_OF_COND: + warning (0, "implicit dereference will not access object " + "of type %qT in second operand of " + "conditional expression", type); + break; + case ICV_THIRD_OF_COND: + warning (0, "implicit dereference will not access object " + "of type %qT in third operand of " + "conditional expression", type); + break; + case ICV_RIGHT_OF_COMMA: + warning (0, "implicit dereference will not access object " + "of type %qT in right operand of " + "comma operator", type); + break; + case ICV_LEFT_OF_COMMA: + warning (0, "implicit dereference will not access object " + "of type %qT in left operand of comma operator", + type); + break; + case ICV_STATEMENT: + warning (0, "implicit dereference will not access object " + "of type %qT in statement", type); + break; + case ICV_THIRD_IN_FOR: + warning (0, "implicit dereference will not access object " + "of type %qT in for increment expression", + type); + break; + default: + gcc_unreachable (); + } + } + else if (is_volatile && TREE_ADDRESSABLE (type)) + { + if (complain & tf_warning) + switch (implicit) + { + case ICV_CAST: + warning (0, "conversion to void will not access " + "object of non-trivially-copyable type %qT", + type); + break; + case ICV_SECOND_OF_COND: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in second " + "operand of conditional expression", type); + break; + case ICV_THIRD_OF_COND: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in third " + "operand of conditional expression", type); + break; + case ICV_RIGHT_OF_COMMA: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in right " + "operand of comma operator", type); + break; + case ICV_LEFT_OF_COMMA: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in left " + "operand of comma operator", type); + break; + case ICV_STATEMENT: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in statement", + type); + break; + case ICV_THIRD_IN_FOR: + warning (0, "indirection will not access object of " + "non-trivially-copyable type %qT in for " + "increment expression", type); + break; + default: + gcc_unreachable (); + } + } + if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type)) + { + /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF + operation is stripped off. Note that we don't warn about + - an expression with TREE_NO_WARNING set. (For an example of + such expressions, see build_over_call in call.c.) + - automatic dereferencing of references, since the user cannot + control it. (See also warn_if_unused_value() in stmt.c.) */ + if (warn_unused_value + && implicit != ICV_CAST + && (complain & tf_warning) + && !TREE_NO_WARNING (expr) + && !is_reference) + warning (OPT_Wunused_value, "value computed is not used"); + expr = TREE_OPERAND (expr, 0); + } + + break; + } + + case VAR_DECL: + { + /* External variables might be incomplete. */ + tree type = TREE_TYPE (expr); + int is_complete = COMPLETE_TYPE_P (complete_type (type)); + + if (TYPE_VOLATILE (type) && !is_complete && (complain & tf_warning)) + switch (implicit) + { + case ICV_CAST: + warning (0, "conversion to void will not access " + "object %qE of incomplete type %qT", expr, type); + break; + case ICV_SECOND_OF_COND: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in second operand of " + "conditional expression", expr, type); + break; + case ICV_THIRD_OF_COND: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in third operand of " + "conditional expression", expr, type); + break; + case ICV_RIGHT_OF_COMMA: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in right operand of comma operator", + expr, type); + break; + case ICV_LEFT_OF_COMMA: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in left operand of comma operator", + expr, type); + break; + case ICV_STATEMENT: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in statement", expr, type); + break; + case ICV_THIRD_IN_FOR: + warning (0, "variable %qE of incomplete type %qT will not " + "be accessed in for increment expression", + expr, type); + break; + default: + gcc_unreachable (); + } + + break; + } + + case TARGET_EXPR: + /* Don't bother with the temporary object returned from a function if + we don't use it and don't need to destroy it. We'll still + allocate space for it in expand_call or declare_return_variable, + but we don't need to track it through all the tree phases. */ + if (TARGET_EXPR_IMPLICIT_P (expr) + && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (expr))) + { + tree init = TARGET_EXPR_INITIAL (expr); + if (TREE_CODE (init) == AGGR_INIT_EXPR + && !AGGR_INIT_VIA_CTOR_P (init)) + { + tree fn = AGGR_INIT_EXPR_FN (init); + expr = build_call_array_loc (input_location, + TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))), + fn, + aggr_init_expr_nargs (init), + AGGR_INIT_EXPR_ARGP (init)); + } + } + break; + + default:; + } + expr = resolve_nondeduced_context (expr); + { + tree probe = expr; + + if (TREE_CODE (probe) == ADDR_EXPR) + probe = TREE_OPERAND (expr, 0); + if (type_unknown_p (probe)) + { + /* [over.over] enumerates the places where we can take the address + of an overloaded function, and this is not one of them. */ + if (complain & tf_error) + switch (implicit) + { + case ICV_CAST: + error ("conversion to void " + "cannot resolve address of overloaded function"); + break; + case ICV_SECOND_OF_COND: + error ("second operand of conditional expression " + "cannot resolve address of overloaded function"); + break; + case ICV_THIRD_OF_COND: + error ("third operand of conditional expression " + "cannot resolve address of overloaded function"); + break; + case ICV_RIGHT_OF_COMMA: + error ("right operand of comma operator " + "cannot resolve address of overloaded function"); + break; + case ICV_LEFT_OF_COMMA: + error ("left operand of comma operator " + "cannot resolve address of overloaded function"); + break; + case ICV_STATEMENT: + error ("statement " + "cannot resolve address of overloaded function"); + break; + case ICV_THIRD_IN_FOR: + error ("for increment expression " + "cannot resolve address of overloaded function"); + break; + } + else + return error_mark_node; + expr = void_zero_node; + } + else if (implicit != ICV_CAST && probe == expr && is_overloaded_fn (probe)) + { + /* Only warn when there is no &. */ + if (complain & tf_warning) + switch (implicit) + { + case ICV_SECOND_OF_COND: + warning (OPT_Waddress, + "second operand of conditional expression " + "is a reference, not call, to function %qE", expr); + break; + case ICV_THIRD_OF_COND: + warning (OPT_Waddress, + "third operand of conditional expression " + "is a reference, not call, to function %qE", expr); + break; + case ICV_RIGHT_OF_COMMA: + warning (OPT_Waddress, + "right operand of comma operator " + "is a reference, not call, to function %qE", expr); + break; + case ICV_LEFT_OF_COMMA: + warning (OPT_Waddress, + "left operand of comma operator " + "is a reference, not call, to function %qE", expr); + break; + case ICV_STATEMENT: + warning (OPT_Waddress, + "statement is a reference, not call, to function %qE", + expr); + break; + case ICV_THIRD_IN_FOR: + warning (OPT_Waddress, + "for increment expression " + "is a reference, not call, to function %qE", expr); + break; + default: + gcc_unreachable (); + } + + if (TREE_CODE (expr) == COMPONENT_REF) + expr = TREE_OPERAND (expr, 0); + } + } + + if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr))) + { + if (implicit != ICV_CAST + && warn_unused_value + && !TREE_NO_WARNING (expr) + && !processing_template_decl) + { + /* The middle end does not warn about expressions that have + been explicitly cast to void, so we must do so here. */ + if (!TREE_SIDE_EFFECTS (expr)) { + if (complain & tf_warning) + switch (implicit) + { + case ICV_SECOND_OF_COND: + warning (OPT_Wunused_value, + "second operand of conditional expression has no effect"); + break; + case ICV_THIRD_OF_COND: + warning (OPT_Wunused_value, + "third operand of conditional expression has no effect"); + break; + case ICV_RIGHT_OF_COMMA: + warning (OPT_Wunused_value, + "right operand of comma operator has no effect"); + break; + case ICV_LEFT_OF_COMMA: + warning (OPT_Wunused_value, + "left operand of comma operator has no effect"); + break; + case ICV_STATEMENT: + warning (OPT_Wunused_value, + "statement has no effect"); + break; + case ICV_THIRD_IN_FOR: + warning (OPT_Wunused_value, + "for increment expression has no effect"); + break; + default: + gcc_unreachable (); + } + } + else + { + tree e; + enum tree_code code; + enum tree_code_class tclass; + + e = expr; + /* We might like to warn about (say) "(int) f()", as the + cast has no effect, but the compiler itself will + generate implicit conversions under some + circumstances. (For example a block copy will be + turned into a call to "__builtin_memcpy", with a + conversion of the return value to an appropriate + type.) So, to avoid false positives, we strip + conversions. Do not use STRIP_NOPs because it will + not strip conversions to "void", as that is not a + mode-preserving conversion. */ + while (TREE_CODE (e) == NOP_EXPR) + e = TREE_OPERAND (e, 0); + + code = TREE_CODE (e); + tclass = TREE_CODE_CLASS (code); + if ((tclass == tcc_comparison + || tclass == tcc_unary + || (tclass == tcc_binary + && !(code == MODIFY_EXPR + || code == INIT_EXPR + || code == PREDECREMENT_EXPR + || code == PREINCREMENT_EXPR + || code == POSTDECREMENT_EXPR + || code == POSTINCREMENT_EXPR))) + && (complain & tf_warning)) + warning (OPT_Wunused_value, "value computed is not used"); + } + } + expr = build1 (CONVERT_EXPR, void_type_node, expr); + } + if (! TREE_SIDE_EFFECTS (expr)) + expr = void_zero_node; + return expr; +} + +/* Create an expression whose value is that of EXPR, + converted to type TYPE. The TREE_TYPE of the value + is always TYPE. This function implements all reasonable + conversions; callers should filter out those that are + not permitted by the language being compiled. + + Most of this routine is from build_reinterpret_cast. + + The back end cannot call cp_convert (what was convert) because + conversions to/from basetypes may involve memory references + (vbases) and adding or subtracting small values (multiple + inheritance), but it calls convert from the constant folding code + on subtrees of already built trees after it has ripped them apart. + + Also, if we ever support range variables, we'll probably also have to + do a little bit more work. */ + +tree +convert (tree type, tree expr) +{ + tree intype; + + if (type == error_mark_node || expr == error_mark_node) + return error_mark_node; + + intype = TREE_TYPE (expr); + + if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype)) + return fold_if_not_in_template (build_nop (type, expr)); + + return ocp_convert (type, expr, CONV_OLD_CONVERT, + LOOKUP_NORMAL|LOOKUP_NO_CONVERSION); +} + +/* Like cp_convert, except permit conversions to take place which + are not normally allowed due to access restrictions + (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_if_not_in_template + (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN, + NULL_TREE))); + + if (code == POINTER_TYPE) + return fold_if_not_in_template (convert_to_pointer_force (type, e)); + + /* From typeck.c convert_for_assignment */ + if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR + && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE + && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE) + || integer_zerop (e) + || TYPE_PTRMEMFUNC_P (TREE_TYPE (e))) + && TYPE_PTRMEMFUNC_P (type)) + /* compatible pointer to member functions. */ + return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1, + /*c_cast_p=*/1, tf_warning_or_error); + + return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL); +} + +/* Convert an aggregate EXPR to type XTYPE. If a conversion + exists, return the attempted conversion. This may + return ERROR_MARK_NODE if the conversion is not + allowed (references private members, etc). + If no conversion exists, NULL_TREE is returned. + + FIXME: Ambiguity checking is wrong. Should choose one by the implicit + object parameter, or by the second standard conversion sequence if + that doesn't do it. This will probably wait for an overloading rewrite. + (jason 8/9/95) */ + +static tree +build_type_conversion (tree xtype, tree expr) +{ + /* C++: check to see if we can convert this aggregate type + into the required type. */ + return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL); +} + +/* 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; + tree winner = NULL_TREE; + + if (expr == null_node + && (desires & WANT_INT) + && !(desires & WANT_NULL)) + warning_at (input_location, OPT_Wconversion_null, + "converting NULL to non-pointer type"); + + basetype = TREE_TYPE (expr); + + if (basetype == error_mark_node) + return error_mark_node; + + if (! MAYBE_CLASS_TYPE_P (basetype)) + switch (TREE_CODE (basetype)) + { + case INTEGER_TYPE: + if ((desires & WANT_NULL) && null_ptr_cst_p (expr)) + return expr; + /* else fall through... */ + + case BOOLEAN_TYPE: + return (desires & WANT_INT) ? expr : NULL_TREE; + case ENUMERAL_TYPE: + return (desires & WANT_ENUM) ? expr : NULL_TREE; + case REAL_TYPE: + return (desires & WANT_FLOAT) ? expr : NULL_TREE; + case POINTER_TYPE: + return (desires & WANT_POINTER) ? expr : NULL_TREE; + + case FUNCTION_TYPE: + case ARRAY_TYPE: + return (desires & WANT_POINTER) ? decay_conversion (expr) + : NULL_TREE; + + case COMPLEX_TYPE: + case VECTOR_TYPE: + if ((desires & WANT_VECTOR_OR_COMPLEX) == 0) + return NULL_TREE; + switch (TREE_CODE (TREE_TYPE (basetype))) + { + case INTEGER_TYPE: + case BOOLEAN_TYPE: + return (desires & WANT_INT) ? expr : NULL_TREE; + case ENUMERAL_TYPE: + return (desires & WANT_ENUM) ? expr : NULL_TREE; + case REAL_TYPE: + return (desires & WANT_FLOAT) ? expr : NULL_TREE; + default: + return NULL_TREE; + } + + default: + return NULL_TREE; + } + + /* 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_maybe_complain (basetype, expr, complain)) + return error_mark_node; + if (!TYPE_HAS_CONVERSION (basetype)) + return NULL_TREE; + + for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv)) + { + int win = 0; + tree candidate; + tree cand = TREE_VALUE (conv); + cand = OVL_CURRENT (cand); + + if (winner && winner == cand) + continue; + + if (DECL_NONCONVERTING_P (cand)) + continue; + + candidate = non_reference (TREE_TYPE (TREE_TYPE (cand))); + + switch (TREE_CODE (candidate)) + { + case BOOLEAN_TYPE: + case INTEGER_TYPE: + win = (desires & WANT_INT); break; + case ENUMERAL_TYPE: + win = (desires & WANT_ENUM); break; + case REAL_TYPE: + win = (desires & WANT_FLOAT); break; + case POINTER_TYPE: + win = (desires & WANT_POINTER); break; + + case COMPLEX_TYPE: + case VECTOR_TYPE: + if ((desires & WANT_VECTOR_OR_COMPLEX) == 0) + break; + switch (TREE_CODE (TREE_TYPE (candidate))) + { + case BOOLEAN_TYPE: + case INTEGER_TYPE: + win = (desires & WANT_INT); break; + case ENUMERAL_TYPE: + win = (desires & WANT_ENUM); break; + case REAL_TYPE: + win = (desires & WANT_FLOAT); break; + default: + break; + } + break; + + default: + break; + } + + if (win) + { + if (winner) + { + if (complain) + { + error ("ambiguous default type conversion from %qT", + basetype); + error (" candidate conversions include %qD and %qD", + winner, cand); + } + return error_mark_node; + } + else + winner = cand; + } + } + + if (winner) + { + tree type = non_reference (TREE_TYPE (TREE_TYPE (winner))); + return build_user_type_conversion (type, expr, LOOKUP_NORMAL); + } + + return NULL_TREE; +} + +/* Implements integral promotion (4.1) and float->double promotion. */ + +tree +type_promotes_to (tree type) +{ + tree promoted_type; + + if (type == error_mark_node) + return error_mark_node; + + type = TYPE_MAIN_VARIANT (type); + + /* Check for promotions of target-defined types first. */ + promoted_type = targetm.promoted_type (type); + if (promoted_type) + return promoted_type; + + /* bool always promotes to int (not unsigned), even if it's the same + size. */ + if (TREE_CODE (type) == BOOLEAN_TYPE) + type = integer_type_node; + + /* Normally convert enums to int, but convert wide enums to something + wider. */ + else if (TREE_CODE (type) == ENUMERAL_TYPE + || type == char16_type_node + || type == char32_type_node + || type == wchar_type_node) + { + int precision = MAX (TYPE_PRECISION (type), + TYPE_PRECISION (integer_type_node)); + tree totype = c_common_type_for_size (precision, 0); + if (SCOPED_ENUM_P (type)) + warning (OPT_Wabi, "scoped enum %qT will not promote to an integral " + "type in a future version of GCC", type); + if (TREE_CODE (type) == ENUMERAL_TYPE) + type = ENUM_UNDERLYING_TYPE (type); + if (TYPE_UNSIGNED (type) + && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype)) + type = c_common_type_for_size (precision, 1); + else + type = totype; + } + else if (c_promoting_integer_type_p (type)) + { + /* Retain unsignedness if really not getting bigger. */ + if (TYPE_UNSIGNED (type) + && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) + type = unsigned_type_node; + else + type = integer_type_node; + } + else if (type == float_type_node) + type = double_type_node; + + return type; +} + +/* The routines below this point are carefully written to conform to + the standard. They use the same terminology, and follow the rules + closely. Although they are used only in pt.c at the moment, they + should presumably be used everywhere in the future. */ + +/* Attempt to perform qualification conversions on EXPR to convert it + to TYPE. Return the resulting expression, or error_mark_node if + the conversion was impossible. */ + +tree +perform_qualification_conversions (tree type, tree expr) +{ + tree expr_type; + + expr_type = TREE_TYPE (expr); + + if (same_type_p (type, expr_type)) + return expr; + else 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 --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c new file mode 100644 index 000000000..a3e91462d --- /dev/null +++ b/gcc/cp/cxx-pretty-print.c @@ -0,0 +1,2426 @@ +/* Implementation of subroutines for the GNU C++ pretty-printer. + Copyright (C) 2003, 2004, 2005, 2007, 2008, + 2009, 2010 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 3, 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 COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "intl.h" +#include "cp-tree.h" +#include "cxx-pretty-print.h" +#include "tree-pretty-print.h" + +/* Translate if being used for diagnostics, but not for dump files or + __PRETTY_FUNCTION. */ +#define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid)) + +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_parameter_declaration_clause (cxx_pretty_printer *, tree); +static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree); +static void pp_cxx_statement (cxx_pretty_printer *, tree); +static void pp_cxx_template_parameter (cxx_pretty_printer *, tree); +static void pp_cxx_cast_expression (cxx_pretty_printer *, tree); +static void pp_cxx_typeid_expression (cxx_pretty_printer *, tree); + + +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_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) + +void +pp_cxx_colon_colon (cxx_pretty_printer *pp) +{ + pp_colon_colon (pp); + pp_base (pp)->padding = pp_none; +} + +void +pp_cxx_begin_template_argument_list (cxx_pretty_printer *pp) +{ + pp_cxx_nonconsecutive_character (pp, '<'); +} + +void +pp_cxx_end_template_argument_list (cxx_pretty_printer *pp) +{ + pp_cxx_nonconsecutive_character (pp, '>'); +} + +void +pp_cxx_separate_with (cxx_pretty_printer *pp, int c) +{ + pp_separate_with (pp, c); + 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_ws_string (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); +} + +/* Prints the unqualified part of the id-expression T. + + 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_ws_string (pp, M_("")); + 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_ws_string (pp, M_("")); + 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 BASELINK: + pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t)); + break; + + case RECORD_TYPE: + case UNION_TYPE: + case ENUMERAL_TYPE: + case TYPENAME_TYPE: + case UNBOUND_CLASS_TEMPLATE: + pp_cxx_unqualified_id (pp, TYPE_NAME (t)); + if (CLASS_TYPE_P (t) && CLASSTYPE_USE_TEMPLATE (t)) + { + pp_cxx_begin_template_argument_list (pp); + pp_cxx_template_argument_list (pp, INNERMOST_TEMPLATE_ARGS + (CLASSTYPE_TI_ARGS (t))); + pp_cxx_end_template_argument_list (pp); + } + break; + + case BIT_NOT_EXPR: + pp_cxx_complement (pp); + pp_cxx_unqualified_id (pp, TREE_OPERAND (t, 0)); + break; + + case TEMPLATE_TYPE_PARM: + case TEMPLATE_TEMPLATE_PARM: + if (TYPE_IDENTIFIER (t)) + pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t)); + else + pp_cxx_canonical_template_parameter (pp, t); + break; + + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, TEMPLATE_PARM_DECL (t)); + break; + + case BOUND_TEMPLATE_TEMPLATE_PARM: + pp_cxx_cv_qualifier_seq (pp, t); + pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t)); + pp_cxx_begin_template_argument_list (pp); + pp_cxx_template_argument_list (pp, TYPE_TI_ARGS (t)); + pp_cxx_end_template_argument_list (pp); + break; + + default: + pp_unsupported_tree (pp, t); + break; + } +} + +/* Pretty-print out the token sequence ":: template" in template codes + where it is needed to "inline declare" the (following) member as + a template. This situation arises when SCOPE of T is dependent + on template parameters. */ + +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_ws_string (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 (!SCOPE_FILE_SCOPE_P (t) && 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)) + { + /* A pointer-to-member is always qualified. */ + case PTRMEM_CST: + pp_cxx_nested_name_specifier (pp, PTRMEM_CST_CLASS (t)); + pp_cxx_unqualified_id (pp, PTRMEM_CST_MEMBER (t)); + break; + + /* In Standard C++, functions cannot possibly be used as + nested-name-specifiers. However, there are situations where + is "makes sense" to output the surrounding function name for the + purpose of emphasizing on the scope kind. Just printing the + function name might not be sufficient as it may be overloaded; so, + we decorate the function with its signature too. + FIXME: This is probably the wrong pretty-printing for conversion + functions and some function templates. */ + 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); + pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (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; + } +} + + +static void +pp_cxx_constant (cxx_pretty_printer *pp, tree t) +{ + switch (TREE_CODE (t)) + { + case STRING_CST: + { + const bool in_parens = PAREN_STRING_LITERAL_P (t); + if (in_parens) + pp_cxx_left_paren (pp); + pp_c_constant (pp_c_base (pp), t); + if (in_parens) + pp_cxx_right_paren (pp); + } + break; + + case INTEGER_CST: + if (NULLPTR_TYPE_P (TREE_TYPE (t))) + { + pp_string (pp, "nullptr"); + break; + } + /* else fall through. */ + + default: + pp_c_constant (pp_c_base (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 + + GNU Extensions: + __builtin_va_arg ( assignment-expression , type-id ) + __builtin_offsetof ( type-id, offsetof-expression ) + + __has_nothrow_assign ( type-id ) + __has_nothrow_constructor ( type-id ) + __has_nothrow_copy ( type-id ) + __has_trivial_assign ( type-id ) + __has_trivial_constructor ( type-id ) + __has_trivial_copy ( type-id ) + __has_trivial_destructor ( type-id ) + __has_virtual_destructor ( type-id ) + __is_abstract ( type-id ) + __is_base_of ( type-id , type-id ) + __is_class ( type-id ) + __is_convertible_to ( type-id , type-id ) + __is_empty ( type-id ) + __is_enum ( type-id ) + __is_pod ( type-id ) + __is_polymorphic ( type-id ) + __is_union ( type-id ) */ + +static void +pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t) +{ + switch (TREE_CODE (t)) + { + case INTEGER_CST: + case REAL_CST: + case COMPLEX_CST: + case STRING_CST: + pp_cxx_constant (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_TEMPLATE_PARM: + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, t); + break; + + case STMT_EXPR: + pp_cxx_left_paren (pp); + pp_cxx_statement (pp, STMT_EXPR_STMT (t)); + pp_cxx_right_paren (pp); + break; + + case TRAIT_EXPR: + pp_cxx_trait_expression (pp, t); + break; + + case VA_ARG_EXPR: + pp_cxx_va_arg_expression (pp, t); + break; + + case OFFSETOF_EXPR: + pp_cxx_offsetof_expression (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 ) + typeid ( 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 = (code == AGGR_INIT_EXPR ? AGGR_INIT_EXPR_FN (t) + : CALL_EXPR_FN (t)); + tree saved_scope = pp->enclosing_scope; + bool skipfirst = false; + tree arg; + + 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) + ? AGGR_INIT_EXPR_SLOT (t) + : AGGR_INIT_EXPR_ARG (t, 0)) + : CALL_EXPR_ARG (t, 0)); + + 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); + } + skipfirst = true; + pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object)); + } + + pp_cxx_postfix_expression (pp, fun); + pp->enclosing_scope = saved_scope; + pp_cxx_left_paren (pp); + if (code == AGGR_INIT_EXPR) + { + aggr_init_expr_arg_iterator iter; + FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t) + { + if (skipfirst) + skipfirst = false; + else + { + pp_cxx_expression (pp, arg); + if (more_aggr_init_expr_args_p (&iter)) + pp_cxx_separate_with (pp, ','); + } + } + } + else + { + call_expr_arg_iterator iter; + FOR_EACH_CALL_EXPR_ARG (arg, iter, t) + { + if (skipfirst) + skipfirst = false; + else + { + pp_cxx_expression (pp, arg); + if (more_call_expr_args_p (&iter)) + pp_cxx_separate_with (pp, ','); + } + } + } + pp_cxx_right_paren (pp); + } + if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t)) + { + pp_cxx_separate_with (pp, ','); + pp_cxx_postfix_expression (pp, AGGR_INIT_EXPR_SLOT (t)); + } + 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_cxx_ws_string (pp, "dynamic_cast"); + else if (code == STATIC_CAST_EXPR) + pp_cxx_ws_string (pp, "static_cast"); + else if (code == REINTERPRET_CAST_EXPR) + pp_cxx_ws_string (pp, "reinterpret_cast"); + else + pp_cxx_ws_string (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: + pp_cxx_typeid_expression (pp, t); + 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; + + case ARROW_EXPR: + pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_arrow (pp); + 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); + tree type = TREE_OPERAND (t, 1); + tree init = TREE_OPERAND (t, 2); + switch (code) + { + case NEW_EXPR: + case VEC_NEW_EXPR: + if (NEW_EXPR_USE_GLOBAL (t)) + pp_cxx_colon_colon (pp); + pp_cxx_ws_string (pp, "new"); + if (TREE_OPERAND (t, 0)) + { + pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0)); + pp_space (pp); + } + if (TREE_CODE (type) == ARRAY_REF) + type = build_cplus_array_type + (TREE_OPERAND (type, 0), + build_index_type (fold_build2_loc (input_location, + MINUS_EXPR, integer_type_node, + TREE_OPERAND (type, 1), + integer_one_node))); + pp_cxx_type_id (pp, type); + if (init) + { + pp_left_paren (pp); + if (TREE_CODE (init) == TREE_LIST) + pp_c_expression_list (pp_c_base (pp), init); + else if (init == void_zero_node) + ; /* OK, empty initializer list. */ + else + pp_cxx_expression (pp, init); + 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_ws_string (pp, "delete"); + pp_space (pp); + if (code == VEC_DELETE_EXPR + || DELETE_EXPR_USE_VEC (t)) + { + pp_left_bracket (pp); + pp_right_bracket (pp); + pp_space (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 ) + sizeof ... ( identifier ) + 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; + + case SIZEOF_EXPR: + if (PACK_EXPANSION_P (TREE_OPERAND (t, 0))) + { + pp_cxx_ws_string (pp, "sizeof"); + pp_cxx_ws_string (pp, "..."); + pp_cxx_whitespace (pp); + pp_cxx_left_paren (pp); + if (TYPE_P (TREE_OPERAND (t, 0))) + pp_cxx_type_id (pp, TREE_OPERAND (t, 0)); + else + pp_unary_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_right_paren (pp); + break; + } + /* Fall through */ + + case ALIGNOF_EXPR: + pp_cxx_ws_string (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__"); + pp_cxx_whitespace (pp); + if (TYPE_P (TREE_OPERAND (t, 0))) + { + pp_cxx_left_paren (pp); + pp_cxx_type_id (pp, TREE_OPERAND (t, 0)); + pp_cxx_right_paren (pp); + } + else + pp_unary_expression (pp, TREE_OPERAND (t, 0)); + break; + + case AT_ENCODE_EXPR: + pp_cxx_ws_string (pp, "@encode"); + pp_cxx_whitespace (pp); + pp_cxx_left_paren (pp); + pp_cxx_type_id (pp, TREE_OPERAND (t, 0)); + pp_cxx_right_paren (pp); + break; + + case NOEXCEPT_EXPR: + pp_cxx_ws_string (pp, "noexcept"); + pp_cxx_whitespace (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_right_paren (pp); + break; + + case UNARY_PLUS_EXPR: + pp_plus (pp); + pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0)); + 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 OFFSET_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)); + if (TREE_CODE (t) == MEMBER_REF) + pp_cxx_arrow (pp); + else + 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); +} + +/* Pretty-print a compound assignment operator token as indicated by T. */ + +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_ws_string (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_ws_string (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: + case COMPLEX_CST: + pp_cxx_constant (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: + case TEMPLATE_TEMPLATE_PARM: + case STMT_EXPR: + 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: + case ARROW_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 SIZEOF_EXPR: + case ALIGNOF_EXPR: + case NOEXCEPT_EXPR: + pp_cxx_unary_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; + + case NON_DEPENDENT_EXPR: + case MUST_NOT_THROW_EXPR: + pp_cxx_expression (pp, TREE_OPERAND (t, 0)); + break; + + case EXPR_PACK_EXPANSION: + pp_cxx_expression (pp, PACK_EXPANSION_PATTERN (t)); + pp_cxx_ws_string (pp, "..."); + break; + + case TEMPLATE_ID_EXPR: + pp_cxx_template_id (pp, t); + break; + + case NONTYPE_ARGUMENT_PACK: + { + tree args = ARGUMENT_PACK_ARGS (t); + int i, len = TREE_VEC_LENGTH (args); + for (i = 0; i < len; ++i) + { + if (i > 0) + pp_cxx_separate_with (pp, ','); + pp_cxx_expression (pp, TREE_VEC_ELT (args, i)); + } + } + 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_ws_string (pp, "virtual"); + else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t)) + pp_cxx_ws_string (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_ws_string (pp, "typedef"); + pp_cxx_decl_specifier_seq (pp, TREE_TYPE (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_TEMPLATE_PARM: + case TEMPLATE_PARM_INDEX: + pp_cxx_unqualified_id (pp, t); + break; + + case TYPENAME_TYPE: + pp_cxx_ws_string (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 TEMPLATE_TEMPLATE_PARM: + case TYPE_DECL: + case BOUND_TEMPLATE_TEMPLATE_PARM: + pp_cxx_cv_qualifier_seq (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; + + case DECLTYPE_TYPE: + pp_cxx_ws_string (pp, "decltype"); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, DECLTYPE_TYPE_EXPR (t)); + pp_cxx_right_paren (pp); + 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; + } + /* else fall through */ + + 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)) + { + if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) + pp_cxx_left_paren (pp); + 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_cxx_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); + bool need_comma = false; + + if (ex_spec == NULL) + return; + if (TREE_PURPOSE (ex_spec)) + { + pp_cxx_ws_string (pp, "noexcept"); + pp_cxx_whitespace (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, TREE_PURPOSE (ex_spec)); + pp_cxx_right_paren (pp); + return; + } + pp_cxx_ws_string (pp, "throw"); + pp_cxx_left_paren (pp); + for (; ex_spec && TREE_VALUE (ex_spec); ex_spec = TREE_CHAIN (ex_spec)) + { + tree type = TREE_VALUE (ex_spec); + tree argpack = NULL_TREE; + int i, len = 1; + + if (ARGUMENT_PACK_P (type)) + { + argpack = ARGUMENT_PACK_ARGS (type); + len = TREE_VEC_LENGTH (argpack); + } + + for (i = 0; i < len; ++i) + { + if (argpack) + type = TREE_VEC_ELT (argpack, i); + + if (need_comma) + pp_cxx_separate_with (pp, ','); + else + need_comma = true; + + pp_cxx_type_id (pp, type); + } + } + 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)); + + if ((TREE_CODE (t) == PARM_DECL && FUNCTION_PARAMETER_PACK_P (t)) + || template_parameter_pack_p (t)) + /* A function parameter pack or non-type template + parameter pack. */ + pp_cxx_ws_string (pp, "..."); + + 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: + case TEMPLATE_TEMPLATE_PARM: + 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)) + { + tree purpose = TREE_PURPOSE (t); + bool is_pack = PACK_EXPANSION_P (purpose); + + if (is_pack) + pp_cxx_primary_expression (pp, PACK_EXPANSION_PATTERN (purpose)); + else + pp_cxx_primary_expression (pp, purpose); + pp_cxx_call_argument_list (pp, TREE_VALUE (t)); + if (is_pack) + pp_cxx_ws_string (pp, "..."); + if (TREE_CHAIN (t)) + pp_cxx_separate_with (pp, ','); + } +} + +/* function-definition: + decl-specifier-seq(opt) declarator ctor-initializer(opt) function-body + decl-specifier-seq(opt) declarator function-try-block */ + +static 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)) + pp_cxx_statement (pp, DECL_SAVED_TREE (t)); + 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 DECLTYPE_TYPE: + case TEMPLATE_ID_EXPR: + pp_cxx_type_specifier_seq (pp, t); + break; + + case TYPE_PACK_EXPANSION: + pp_cxx_type_id (pp, PACK_EXPANSION_PATTERN (t)); + pp_cxx_ws_string (pp, "..."); + break; + + default: + pp_c_type_id (pp_c_base (pp), t); + break; + } + + pp_c_base (pp)->flags = saved_flags; +} + +/* template-argument-list: + template-argument ...(opt) + template-argument-list, template-argument ...(opt) + + template-argument: + assignment-expression + type-id + template-name */ + +static void +pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t) +{ + int i; + bool need_comma = false; + + if (t == NULL) + return; + for (i = 0; i < TREE_VEC_LENGTH (t); ++i) + { + tree arg = TREE_VEC_ELT (t, i); + tree argpack = NULL_TREE; + int idx, len = 1; + + if (ARGUMENT_PACK_P (arg)) + { + argpack = ARGUMENT_PACK_ARGS (arg); + len = TREE_VEC_LENGTH (argpack); + } + + for (idx = 0; idx < len; idx++) + { + if (argpack) + arg = TREE_VEC_ELT (argpack, idx); + + if (need_comma) + pp_cxx_separate_with (pp, ','); + else + need_comma = true; + + 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_EXPR_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. */ + +static void +pp_cxx_statement (cxx_pretty_printer *pp, tree t) +{ + switch (TREE_CODE (t)) + { + case CTOR_INITIALIZER: + pp_cxx_ctor_initializer (pp, t); + break; + + case USING_STMT: + pp_cxx_ws_string (pp, "using"); + pp_cxx_ws_string (pp, "namespace"); + if (DECL_CONTEXT (t)) + pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t)); + pp_cxx_qualified_id (pp, USING_STMT_NAMESPACE (t)); + break; + + case USING_DECL: + pp_cxx_ws_string (pp, "using"); + pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (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_ws_string (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_ws_string (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; + + /* selection-statement: + if ( expression ) statement + if ( expression ) statement else statement */ + case IF_STMT: + pp_cxx_ws_string (pp, "if"); + pp_cxx_whitespace (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, IF_COND (t)); + pp_cxx_right_paren (pp); + pp_newline_and_indent (pp, 2); + pp_cxx_statement (pp, THEN_CLAUSE (t)); + pp_newline_and_indent (pp, -2); + if (ELSE_CLAUSE (t)) + { + tree else_clause = ELSE_CLAUSE (t); + pp_cxx_ws_string (pp, "else"); + if (TREE_CODE (else_clause) == IF_STMT) + pp_cxx_whitespace (pp); + else + pp_newline_and_indent (pp, 2); + pp_cxx_statement (pp, else_clause); + if (TREE_CODE (else_clause) != IF_STMT) + pp_newline_and_indent (pp, -2); + } + break; + + case SWITCH_STMT: + pp_cxx_ws_string (pp, "switch"); + pp_space (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, SWITCH_STMT_COND (t)); + pp_cxx_right_paren (pp); + pp_indentation (pp) += 3; + pp_needs_newline (pp) = true; + pp_cxx_statement (pp, SWITCH_STMT_BODY (t)); + pp_newline_and_indent (pp, -3); + break; + + /* iteration-statement: + while ( expression ) statement + do statement while ( expression ) ; + for ( expression(opt) ; expression(opt) ; expression(opt) ) statement + for ( declaration expression(opt) ; expression(opt) ) statement */ + case WHILE_STMT: + pp_cxx_ws_string (pp, "while"); + pp_space (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, WHILE_COND (t)); + pp_cxx_right_paren (pp); + pp_newline_and_indent (pp, 3); + pp_cxx_statement (pp, WHILE_BODY (t)); + pp_indentation (pp) -= 3; + pp_needs_newline (pp) = true; + break; + + case DO_STMT: + pp_cxx_ws_string (pp, "do"); + pp_newline_and_indent (pp, 3); + pp_cxx_statement (pp, DO_BODY (t)); + pp_newline_and_indent (pp, -3); + pp_cxx_ws_string (pp, "while"); + pp_space (pp); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, DO_COND (t)); + pp_cxx_right_paren (pp); + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = true; + break; + + case FOR_STMT: + pp_cxx_ws_string (pp, "for"); + pp_space (pp); + pp_cxx_left_paren (pp); + if (FOR_INIT_STMT (t)) + pp_cxx_statement (pp, FOR_INIT_STMT (t)); + else + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = false; + pp_cxx_whitespace (pp); + if (FOR_COND (t)) + pp_cxx_expression (pp, FOR_COND (t)); + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = false; + pp_cxx_whitespace (pp); + if (FOR_EXPR (t)) + pp_cxx_expression (pp, FOR_EXPR (t)); + pp_cxx_right_paren (pp); + pp_newline_and_indent (pp, 3); + pp_cxx_statement (pp, FOR_BODY (t)); + pp_indentation (pp) -= 3; + pp_needs_newline (pp) = true; + break; + + case RANGE_FOR_STMT: + pp_cxx_ws_string (pp, "for"); + pp_space (pp); + pp_cxx_left_paren (pp); + pp_cxx_statement (pp, RANGE_FOR_DECL (t)); + pp_space (pp); + pp_needs_newline (pp) = false; + pp_colon (pp); + pp_space (pp); + pp_cxx_statement (pp, RANGE_FOR_EXPR (t)); + pp_cxx_right_paren (pp); + pp_newline_and_indent (pp, 3); + pp_cxx_statement (pp, FOR_BODY (t)); + pp_indentation (pp) -= 3; + pp_needs_newline (pp) = true; + break; + + /* jump-statement: + goto identifier; + continue ; + return expression(opt) ; */ + case BREAK_STMT: + case CONTINUE_STMT: + pp_string (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue"); + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = true; + break; + + /* expression-statement: + expression(opt) ; */ + case EXPR_STMT: + pp_cxx_expression (pp, EXPR_STMT_EXPR (t)); + pp_cxx_semicolon (pp); + pp_needs_newline (pp) = true; + break; + + case CLEANUP_STMT: + pp_cxx_ws_string (pp, "try"); + pp_newline_and_indent (pp, 2); + pp_cxx_statement (pp, CLEANUP_BODY (t)); + pp_newline_and_indent (pp, -2); + pp_cxx_ws_string (pp, CLEANUP_EH_ONLY (t) ? "catch" : "finally"); + pp_newline_and_indent (pp, 2); + pp_cxx_statement (pp, CLEANUP_EXPR (t)); + pp_newline_and_indent (pp, -2); + break; + + case STATIC_ASSERT: + pp_cxx_declaration (pp, t); + 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_ws_string (pp, "namespace"); + if (DECL_CONTEXT (t)) + pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t)); + 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_ws_string (pp, "namespace"); + if (DECL_CONTEXT (t)) + pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t)); + pp_cxx_unqualified_id (pp, t); + pp_cxx_whitespace (pp); + pp_equal (pp); + pp_cxx_whitespace (pp); + if (DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t))) + pp_cxx_nested_name_specifier (pp, + DECL_CONTEXT (DECL_NAMESPACE_ALIAS (t))); + 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_cxx_separate_with (pp, ','); + pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i)); + } +} + +/* template-parameter: + type-parameter + parameter-declaration + + type-parameter: + class ...(opt) identifier(opt) + class identifier(opt) = type-id + typename identifier(opt) + typename ...(opt) identifier(opt) = type-id + template < template-parameter-list > class ...(opt) 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_ws_string (pp, "class"); + if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t))) + pp_cxx_ws_string (pp, "..."); + if (DECL_NAME (parameter)) + pp_cxx_tree_identifier (pp, DECL_NAME (parameter)); + /* FIXME: Check 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_ws_string (pp, M_("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_ws_string (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 + static_assert-declaration */ +void +pp_cxx_declaration (cxx_pretty_printer *pp, tree t) +{ + if (TREE_CODE (t) == STATIC_ASSERT) + { + pp_cxx_ws_string (pp, "static_assert"); + pp_cxx_left_paren (pp); + pp_cxx_expression (pp, STATIC_ASSERT_CONDITION (t)); + pp_cxx_separate_with (pp, ','); + pp_cxx_expression (pp, STATIC_ASSERT_MESSAGE (t)); + pp_cxx_right_paren (pp); + } + else 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; + } +} + +static void +pp_cxx_typeid_expression (cxx_pretty_printer *pp, tree t) +{ + t = TREE_OPERAND (t, 0); + pp_cxx_ws_string (pp, "typeid"); + pp_cxx_left_paren (pp); + if (TYPE_P (t)) + pp_cxx_type_id (pp, t); + else + pp_cxx_expression (pp, t); + pp_cxx_right_paren (pp); +} + +void +pp_cxx_va_arg_expression (cxx_pretty_printer *pp, tree t) +{ + pp_cxx_ws_string (pp, "va_arg"); + pp_cxx_left_paren (pp); + pp_cxx_assignment_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_separate_with (pp, ','); + pp_cxx_type_id (pp, TREE_TYPE (t)); + pp_cxx_right_paren (pp); +} + +static bool +pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t) +{ + switch (TREE_CODE (t)) + { + case ARROW_EXPR: + if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR + && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0)))) + { + pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)))); + pp_cxx_separate_with (pp, ','); + return true; + } + return false; + case COMPONENT_REF: + if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0))) + return false; + if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR) + pp_cxx_dot (pp); + pp_cxx_expression (pp, TREE_OPERAND (t, 1)); + return true; + case ARRAY_REF: + if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0))) + return false; + pp_left_bracket (pp); + pp_cxx_expression (pp, TREE_OPERAND (t, 1)); + pp_right_bracket (pp); + return true; + default: + return false; + } +} + +void +pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t) +{ + pp_cxx_ws_string (pp, "offsetof"); + pp_cxx_left_paren (pp); + if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0))) + pp_cxx_expression (pp, TREE_OPERAND (t, 0)); + pp_cxx_right_paren (pp); +} + +void +pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t) +{ + cp_trait_kind kind = TRAIT_EXPR_KIND (t); + + switch (kind) + { + case CPTK_HAS_NOTHROW_ASSIGN: + pp_cxx_ws_string (pp, "__has_nothrow_assign"); + break; + case CPTK_HAS_TRIVIAL_ASSIGN: + pp_cxx_ws_string (pp, "__has_trivial_assign"); + break; + case CPTK_HAS_NOTHROW_CONSTRUCTOR: + pp_cxx_ws_string (pp, "__has_nothrow_constructor"); + break; + case CPTK_HAS_TRIVIAL_CONSTRUCTOR: + pp_cxx_ws_string (pp, "__has_trivial_constructor"); + break; + case CPTK_HAS_NOTHROW_COPY: + pp_cxx_ws_string (pp, "__has_nothrow_copy"); + break; + case CPTK_HAS_TRIVIAL_COPY: + pp_cxx_ws_string (pp, "__has_trivial_copy"); + break; + case CPTK_HAS_TRIVIAL_DESTRUCTOR: + pp_cxx_ws_string (pp, "__has_trivial_destructor"); + break; + case CPTK_HAS_VIRTUAL_DESTRUCTOR: + pp_cxx_ws_string (pp, "__has_virtual_destructor"); + break; + case CPTK_IS_ABSTRACT: + pp_cxx_ws_string (pp, "__is_abstract"); + break; + case CPTK_IS_BASE_OF: + pp_cxx_ws_string (pp, "__is_base_of"); + break; + case CPTK_IS_CLASS: + pp_cxx_ws_string (pp, "__is_class"); + break; + case CPTK_IS_CONVERTIBLE_TO: + pp_cxx_ws_string (pp, "__is_convertible_to"); + break; + case CPTK_IS_EMPTY: + pp_cxx_ws_string (pp, "__is_empty"); + break; + case CPTK_IS_ENUM: + pp_cxx_ws_string (pp, "__is_enum"); + break; + case CPTK_IS_POD: + pp_cxx_ws_string (pp, "__is_pod"); + break; + case CPTK_IS_POLYMORPHIC: + pp_cxx_ws_string (pp, "__is_polymorphic"); + break; + case CPTK_IS_STD_LAYOUT: + pp_cxx_ws_string (pp, "__is_std_layout"); + break; + case CPTK_IS_TRIVIAL: + pp_cxx_ws_string (pp, "__is_trivial"); + break; + case CPTK_IS_UNION: + pp_cxx_ws_string (pp, "__is_union"); + break; + case CPTK_IS_LITERAL_TYPE: + pp_cxx_ws_string (pp, "__is_literal_type"); + break; + + default: + gcc_unreachable (); + } + + pp_cxx_left_paren (pp); + pp_cxx_type_id (pp, TRAIT_EXPR_TYPE1 (t)); + + if (kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO) + { + pp_cxx_separate_with (pp, ','); + pp_cxx_type_id (pp, TRAIT_EXPR_TYPE2 (t)); + } + + pp_cxx_right_paren (pp); +} + +typedef c_pretty_print_fn pp_fun; + +/* Initialization of a C++ pretty-printer object. */ + +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.constant = (pp_fun) pp_cxx_constant; + 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 --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h new file mode 100644 index 000000000..d12506e62 --- /dev/null +++ b/gcc/cp/cxx-pretty-print.h @@ -0,0 +1,78 @@ +/* Interface for the GNU C++ pretty-printer. + Copyright (C) 2003, 2004, 2005, 2007, 2009, 2010 + 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 3, 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 COPYING3. If not see +. */ + +#ifndef GCC_CXX_PRETTY_PRINT_H +#define GCC_CXX_PRETTY_PRINT_H + +#include "c-family/c-pretty-print.h" + +#undef pp_c_base +#define pp_c_base(PP) (&(PP)->c_base) + +typedef enum +{ + /* Ask for a 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; + +#define pp_cxx_cv_qualifier_seq(PP, T) \ + pp_c_type_qualifier_list (pp_c_base (PP), T) + +#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_left_bracket(PP) pp_c_left_bracket (pp_c_base (PP)) +#define pp_cxx_right_bracket(PP) pp_c_right_bracket (pp_c_base (PP)) +#define pp_cxx_dot(PP) pp_c_dot (pp_c_base (PP)) +#define pp_cxx_ampersand(PP) pp_c_ampersand (pp_c_base (PP)) +#define pp_cxx_star(PP) pp_c_star (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)) +#define pp_cxx_complement(PP) pp_c_complement (pp_c_base (PP)) + +#define pp_cxx_ws_string(PP, I) pp_c_ws_string (pp_c_base (PP), I) +#define pp_cxx_identifier(PP, I) pp_c_identifier (pp_c_base (PP), I) +#define pp_cxx_tree_identifier(PP, T) \ + pp_c_tree_identifier (pp_c_base (PP), T) + +void pp_cxx_pretty_printer_init (cxx_pretty_printer *); +void pp_cxx_begin_template_argument_list (cxx_pretty_printer *); +void pp_cxx_end_template_argument_list (cxx_pretty_printer *); +void pp_cxx_colon_colon (cxx_pretty_printer *); +void pp_cxx_separate_with (cxx_pretty_printer *, int); + +void pp_cxx_declaration (cxx_pretty_printer *, tree); +void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree); +void pp_cxx_trait_expression (cxx_pretty_printer *, tree); +void pp_cxx_va_arg_expression (cxx_pretty_printer *, tree); +void pp_cxx_offsetof_expression (cxx_pretty_printer *, tree); + +#endif /* GCC_CXX_PRETTY_PRINT_H */ diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c new file mode 100644 index 000000000..ee1d8dfd2 --- /dev/null +++ b/gcc/cp/decl.c @@ -0,0 +1,13532 @@ +/* Process declarations and variables for C++ compiler. + Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + 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 3, 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 COPYING3. If not see +. */ + + +/* 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. */ + +/* ??? not all decl nodes are given the most useful possible + line numbers. For example, the CONST_DECLs for enum values. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "flags.h" +#include "cp-tree.h" +#include "tree-iterator.h" +#include "tree-inline.h" +#include "decl.h" +#include "intl.h" +#include "output.h" +#include "toplev.h" +#include "hashtab.h" +#include "tm_p.h" +#include "target.h" +#include "c-family/c-common.h" +#include "c-family/c-objc.h" +#include "c-family/c-pragma.h" +#include "diagnostic.h" +#include "intl.h" +#include "debug.h" +#include "timevar.h" +#include "pointer-set.h" +#include "splay-tree.h" +#include "plugin.h" + +/* Possible cases of bad specifiers type used by bad_specifiers. */ +enum bad_spec_place { + BSP_VAR, /* variable */ + BSP_PARM, /* parameter */ + BSP_TYPE, /* type */ + BSP_FIELD /* field */ +}; + +static tree grokparms (tree parmlist, 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 grokvardecl (tree, tree, const cp_decl_specifier_seq *, + int, int, tree); +static void record_unknown_type (tree, const char *); +static tree builtin_function_1 (tree, tree, bool); +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, enum bad_spec_place, 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); +static tree lookup_and_check_tag (enum tag_types, tree, tag_scope, bool); +static int walk_namespaces_r (tree, walk_namespaces_fn, void *); +static void maybe_deduce_size_from_array_init (tree, tree); +static void layout_var_decl (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 copy_type_enum (tree , tree); +static void check_function_type (tree, tree); +static void finish_constructor_body (void); +static void begin_destructor_body (void); +static void finish_destructor_body (void); +static void record_key_method_defined (tree); +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 (location_t, 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 void initialize_local_var (tree, tree); +static void expand_static_init (tree, tree); + +/* The following symbols are subsumed in the cp_global_trees array, and + listed here individually for documentation purposes. + + C++ extensions + tree wchar_decl_node; + + tree vtable_entry_type; + tree delta_type_node; + tree __t_desc_type_node; + + tree class_type_node; + tree unknown_type_node; + + Array type `vtable_entry_type[]' + + tree vtbl_type_node; + tree vtbl_ptr_type_node; + + Namespaces, + + tree std_node; + tree abi_node; + + A FUNCTION_DECL which can call `abort'. Not necessarily the + one that the user will declare, but sufficient to be called + by routines that want to abort the program. + + tree abort_fndecl; + + The FUNCTION_DECL for the default `::operator delete'. + + tree global_delete_fndecl; + + Used by RTTI + tree type_info_type_node, tinfo_decl_id, tinfo_decl_type; + tree tinfo_var_id; */ + +tree cp_global_trees[CPTI_MAX]; + +/* 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; + +#define local_names cp_function_chain->x_local_names + +/* A list of objects which have constructors or destructors + which reside in the global scope. The decl is stored in + the TREE_VALUE slot and the initializer is stored + in the TREE_PURPOSE slot. */ +tree static_aggregates; + +/* -- end of C++ */ + +/* A node for the integer constant 2. */ + +tree integer_two_node; + +/* Used only for jumps to as-yet undefined labels, since jumps to + defined labels can have their validity checked immediately. */ + +struct GTY((chain_next ("%h.next"))) named_label_use_entry { + struct named_label_use_entry *next; + /* The binding level to which this entry is *currently* attached. + This is initially the binding level in which the goto appeared, + but is modified as scopes are closed. */ + struct cp_binding_level *binding_level; + /* The head of the names list that was current when the goto appeared, + or the inner scope popped. These are the decls that will *not* be + skipped when jumping to the label. */ + tree names_in_scope; + /* The location of the goto, for error reporting. */ + location_t o_goto_locus; + /* True if an OpenMP structured block scope has been closed since + the goto appeared. This means that the branch from the label will + illegally exit an OpenMP scope. */ + bool in_omp_scope; +}; + +/* 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. */ + +struct GTY(()) named_label_entry { + /* The decl itself. */ + tree label_decl; + + /* The binding level to which the label is *currently* attached. + This is initially set to the binding level in which the label + is defined, but is modified as scopes are closed. */ + struct cp_binding_level *binding_level; + /* The head of the names list that was current when the label was + defined, or the inner scope popped. These are the decls that will + be skipped when jumping to the label. */ + tree names_in_scope; + /* A vector of all decls from all binding levels that would be + crossed by a backward branch to the label. */ + VEC(tree,gc) *bad_decls; + + /* A list of uses of the label, before the label is defined. */ + struct named_label_use_entry *uses; + + /* The following bits are set after the label is defined, and are + updated as scopes are popped. They indicate that a backward jump + to the label will illegally enter a scope of the given flavor. */ + bool in_try_scope; + bool in_catch_scope; + bool in_omp_scope; +}; + +#define named_labels cp_function_chain->x_named_labels + +/* 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.) */ +int function_depth; + +/* To avoid unwanted recursion, finish_function defers all mark_used calls + encountered during its execution until it finishes. */ +bool defer_mark_used_calls; +VEC(tree, gc) *deferred_mark_used_calls; + +/* States indicating how grokdeclarator() should handle declspecs marked + with __attribute__((deprecated)). An object declared as + __attribute__((deprecated)) suppresses warnings of uses of other + deprecated items. */ +enum deprecated_states deprecated_state = DEPRECATED_NORMAL; + + +/* A list of VAR_DECLs whose type was incomplete at the time the + variable was declared. */ + +typedef struct GTY(()) incomplete_var_d { + tree decl; + tree incomplete_type; +} incomplete_var; + +DEF_VEC_O(incomplete_var); +DEF_VEC_ALLOC_O(incomplete_var,gc); + +static GTY(()) VEC(incomplete_var,gc) *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; + int innermost_specialization_p = 0; + 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 + like: + + template template <> ... + + 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; + else + seen_specialization_p = 1; + } + else if (seen_specialization_p == 1) + return tsk_invalid_member_spec; + + ++n_template_parm_scopes; + } + + /* Handle explicit instantiations. */ + if (processing_explicit_instantiation) + { + if (n_template_parm_scopes != 0) + /* We've seen a template parameter list during an explicit + instantiation. For example: + + template template void f(int); + + This is erroneous. */ + return tsk_invalid_expl_inst; + else + return tsk_expl_inst; + } + + if (n_template_parm_scopes < n_class_scopes) + /* We've not seen enough template headers to match all the + specialized classes present. For example: + + template void R::S::f(int); + + This is invalid; there needs to be one set of template + parameters for each class. */ + return tsk_insufficient_parms; + else if (n_template_parm_scopes == n_class_scopes) + /* We're processing a non-template declaration (even though it may + be a member of a template class.) For example: + + template void S::f(int); + + The `class T' matches the `S', leaving no template headers + corresponding to the `f'. */ + return tsk_none; + else if (n_template_parm_scopes > n_class_scopes + 1) + /* We've got too many template headers. For example: + + template <> template void f (T); + + There need to be more enclosing classes. */ + return tsk_excessive_parms; + else + /* This must be a template. It's of the form: + + template template void S::f(U); + + This is a specialization if the innermost level was a + specialization; otherwise it's just a definition of the + template. */ + 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; + + error ("label %q+D used but not defined", label); + location = input_location; /* FIXME want (input_filename, (line)0) */ + /* Avoid crashing later. */ + define_label (location, DECL_NAME (label)); + } + else + warn_for_unused_label (label); + } + + SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), old_value); +} + +/* At the end of a function, all labels declared within the function + go out of scope. BLOCK is the top-level block for the + function. */ + +static int +pop_labels_1 (void **slot, void *data) +{ + struct named_label_entry *ent = (struct named_label_entry *) *slot; + tree block = (tree) data; + + pop_label (ent->label_decl, NULL_TREE); + + /* Put the labels into the "variables" of the top-level block, + so debugger can see them. */ + DECL_CHAIN (ent->label_decl) = BLOCK_VARS (block); + BLOCK_VARS (block) = ent->label_decl; + + htab_clear_slot (named_labels, slot); + + return 1; +} + +static void +pop_labels (tree block) +{ + if (named_labels) + { + htab_traverse (named_labels, pop_labels_1, block); + named_labels = NULL; + } +} + +/* At the end of a block with local labels, restore the outer definition. */ + +static void +pop_local_label (tree label, tree old_value) +{ + struct named_label_entry dummy; + void **slot; + + pop_label (label, old_value); + + dummy.label_decl = label; + slot = htab_find_slot (named_labels, &dummy, NO_INSERT); + htab_clear_slot (named_labels, slot); +} + +/* The following two routines are used to interface to Objective-C++. + The binding level is purposely treated as an opaque type. */ + +void * +objc_get_current_scope (void) +{ + return current_binding_level; +} + +/* The following routine is used by the NeXT-style SJLJ exceptions; + variables get marked 'volatile' so as to not be clobbered by + _setjmp()/_longjmp() calls. All variables in the current scope, + as well as parent scopes up to (but not including) ENCLOSING_BLK + shall be thusly marked. */ + +void +objc_mark_locals_volatile (void *enclosing_blk) +{ + struct cp_binding_level *scope; + + for (scope = current_binding_level; + scope && scope != enclosing_blk; + scope = scope->level_chain) + { + tree decl; + + for (decl = scope->names; decl; decl = TREE_CHAIN (decl)) + objc_volatilize_decl (decl); + + /* Do not climb up past the current function. */ + if (scope->kind == sk_function_parms) + break; + } +} + +/* Update data for defined and undefined labels when leaving a scope. */ + +static int +poplevel_named_label_1 (void **slot, void *data) +{ + struct named_label_entry *ent = (struct named_label_entry *) *slot; + struct cp_binding_level *bl = (struct cp_binding_level *) data; + struct cp_binding_level *obl = bl->level_chain; + + if (ent->binding_level == bl) + { + tree decl; + + /* ENT->NAMES_IN_SCOPE may contain a mixture of DECLs and + TREE_LISTs representing OVERLOADs, so be careful. */ + for (decl = ent->names_in_scope; decl; decl = (DECL_P (decl) + ? DECL_CHAIN (decl) + : TREE_CHAIN (decl))) + if (decl_jump_unsafe (decl)) + VEC_safe_push (tree, gc, ent->bad_decls, decl); + + ent->binding_level = obl; + ent->names_in_scope = obl->names; + switch (bl->kind) + { + case sk_try: + ent->in_try_scope = true; + break; + case sk_catch: + ent->in_catch_scope = true; + break; + case sk_omp: + ent->in_omp_scope = true; + break; + default: + break; + } + } + else if (ent->uses) + { + struct named_label_use_entry *use; + + for (use = ent->uses; use ; use = use->next) + if (use->binding_level == bl) + { + use->binding_level = obl; + use->names_in_scope = obl->names; + if (bl->kind == sk_omp) + use->in_omp_scope = true; + } + } + + return 1; +} + +/* Saved errorcount to avoid -Wunused-but-set-{parameter,variable} warnings + when errors were reported, except for -Werror-unused-but-set-*. */ +static int unused_but_set_errorcount; + +/* Exit a binding level. + Pop the level off, and restore the state of the identifier-decl mappings + that were in effect when this level was entered. + + If KEEP == 1, this level had explicit declarations, so + and create a "block" (a BLOCK node) for the level + to record its declarations and subblocks for symbol table output. + + If FUNCTIONBODY is nonzero, this level is the body of a function, + so create a block as if KEEP were set and also clear out all + label names. + + If REVERSE is nonzero, reverse the order of decls before putting + 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; + tree subblocks; + tree block; + tree decl; + int leaving_for_scope; + scope_kind kind; + unsigned ix; + cp_label_binding *label_bind; + + timevar_push (TV_NAME_LOOKUP); + restart: + + block = NULL_TREE; + + gcc_assert (current_binding_level->kind != sk_class); + + if (current_binding_level->kind == sk_cleanup) + functionbody = 0; + subblocks = functionbody >= 0 ? current_binding_level->blocks : 0; + + gcc_assert (!VEC_length(cp_class_binding, + current_binding_level->class_shadowed)); + + /* We used to use KEEP == 2 to indicate that the new block should go + at the beginning of the list of blocks at this binding level, + rather than the end. This hack is no longer used. */ + gcc_assert (keep == 0 || keep == 1); + + if (current_binding_level->keep) + keep = 1; + + /* Any uses of undefined labels, and any defined labels, now operate + under constraints of next binding contour. */ + if (cfun && !functionbody && named_labels) + htab_traverse (named_labels, poplevel_named_label_1, + current_binding_level); + + /* Get the decls in the order they were written. + Usually current_binding_level->names is in reverse order. + But parameter decls were previously put in forward order. */ + + if (reverse) + current_binding_level->names + = decls = nreverse (current_binding_level->names); + else + decls = current_binding_level->names; + + /* If there were any declarations or structure tags in that level, + or if this level is a function body, + create a BLOCK to record them for the life of this function. */ + block = NULL_TREE; + if (keep == 1 || functionbody) + block = make_node (BLOCK); + if (block != NULL_TREE) + { + BLOCK_VARS (block) = decls; + BLOCK_SUBBLOCKS (block) = subblocks; + } + + /* In each subblock, record that this is its superior. */ + if (keep >= 0) + for (link = subblocks; link; link = BLOCK_CHAIN (link)) + BLOCK_SUPERCONTEXT (link) = block; + + /* 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; + + /* Before we remove the declarations first check for unused variables. */ + if ((warn_unused_variable || warn_unused_but_set_variable) + && !processing_template_decl) + for (decl = getdecls (); decl; decl = TREE_CHAIN (decl)) + if (TREE_CODE (decl) == VAR_DECL + && (! TREE_USED (decl) || !DECL_READ_P (decl)) + && ! DECL_IN_SYSTEM_HEADER (decl) + && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl)) + { + if (! TREE_USED (decl)) + warning (OPT_Wunused_variable, "unused variable %q+D", decl); + else if (DECL_CONTEXT (decl) == current_function_decl + && TREE_TYPE (decl) != error_mark_node + && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE + && errorcount == unused_but_set_errorcount + && (!CLASS_TYPE_P (TREE_TYPE (decl)) + || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) + { + warning (OPT_Wunused_but_set_variable, + "variable %q+D set but not used", decl); + unused_but_set_errorcount = errorcount; + } + } + + /* Remove declarations for all the DECLs in this level. */ + for (link = decls; link; link = TREE_CHAIN (link)) + { + if (leaving_for_scope && TREE_CODE (link) == VAR_DECL + && DECL_NAME (link)) + { + tree name = DECL_NAME (link); + cxx_binding *ob; + tree ns_binding; + + ob = outer_binding (name, + IDENTIFIER_BINDING (name), + /*class_p=*/true); + if (!ob) + ns_binding = IDENTIFIER_NAMESPACE_VALUE (name); + else + ns_binding = NULL_TREE; + + if (ob && ob->scope == current_binding_level->level_chain) + /* We have something like: + + int i; + for (int i; ;); + + and we are leaving the `for' scope. There's no reason to + keep the binding of the inner `i' in this case. */ + pop_binding (name, link); + else if ((ob && (TREE_CODE (ob->value) == TYPE_DECL)) + || (ns_binding && TREE_CODE (ns_binding) == TYPE_DECL)) + /* Here, we have something like: + + typedef int I; + + void f () { + for (int I; ;); + } + + We must pop the for-scope binding so we know what's a + type and what isn't. */ + pop_binding (name, link); + else + { + /* Mark this VAR_DECL as dead so that we can tell we left it + there only for backward compatibility. */ + DECL_DEAD_FOR_LOCAL (link) = 1; + + /* Keep track of what should have happened when we + popped the binding. */ + if (ob && ob->value) + { + SET_DECL_SHADOWED_FOR_VAR (link, ob->value); + DECL_HAS_SHADOWED_FOR_VAR_P (link) = 1; + } + + /* Add it to the list of dead variables in the next + outermost binding to that we can remove these when we + leave that binding. */ + VEC_safe_push (tree, gc, + current_binding_level->level_chain->dead_vars_from_for, + link); + + /* Although we don't pop the cxx_binding, we do clear + its SCOPE since the scope is going away now. */ + IDENTIFIER_BINDING (name)->scope + = current_binding_level->level_chain; + } + } + else + { + tree name; + + /* Remove the binding. */ + decl = link; + + if (TREE_CODE (decl) == TREE_LIST) + decl = TREE_VALUE (decl); + name = decl; + + if (TREE_CODE (name) == OVERLOAD) + name = OVL_FUNCTION (name); + + gcc_assert (DECL_P (name)); + pop_binding (DECL_NAME (name), decl); + } + } + + /* Remove declarations for any `for' variables from inner scopes + that we kept around. */ + FOR_EACH_VEC_ELT_REVERSE (tree, current_binding_level->dead_vars_from_for, + ix, decl) + pop_binding (DECL_NAME (decl), decl); + + /* Restore the IDENTIFIER_TYPE_VALUEs. */ + for (link = current_binding_level->type_shadowed; + link; link = TREE_CHAIN (link)) + SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link), TREE_VALUE (link)); + + /* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */ + FOR_EACH_VEC_ELT_REVERSE (cp_label_binding, + current_binding_level->shadowed_labels, + ix, label_bind) + pop_local_label (label_bind->label, label_bind->prev_value); + + /* There may be OVERLOADs (wrapped in TREE_LISTs) on the BLOCK_VARs + list if a `using' declaration put them there. The debugging + back ends won't understand OVERLOAD, so we remove them here. + Because the BLOCK_VARS are (temporarily) shared with + CURRENT_BINDING_LEVEL->NAMES we must do this fixup after we have + popped all the bindings. */ + if (block) + { + tree* d; + + for (d = &BLOCK_VARS (block); *d; ) + { + if (TREE_CODE (*d) == TREE_LIST) + *d = TREE_CHAIN (*d); + else + d = &DECL_CHAIN (*d); + } + } + + /* If the level being exited is the top level of a function, + check over all the labels. */ + if (functionbody) + { + /* Since this is the top level block of a function, the vars are + the function's parameters. Don't leave them in the BLOCK + because they are found in the FUNCTION_DECL instead. */ + BLOCK_VARS (block) = 0; + pop_labels (block); + } + + kind = current_binding_level->kind; + if (kind == sk_cleanup) + { + tree stmt; + + /* If this is a temporary binding created for a cleanup, then we'll + have pushed a statement list level. Pop that, create a new + BIND_EXPR for the block, and insert it into the stream. */ + stmt = pop_stmt_list (current_binding_level->statement_list); + stmt = c_build_bind_expr (input_location, block, stmt); + add_stmt (stmt); + } + + leave_scope (); + if (functionbody) + { + /* The current function is being defined, so its DECL_INITIAL + should be error_mark_node. */ + gcc_assert (DECL_INITIAL (current_function_decl) == error_mark_node); + DECL_INITIAL (current_function_decl) = block; + } + else if (block) + current_binding_level->blocks + = chainon (current_binding_level->blocks, block); + + /* If we did not make a block for the level just exited, + any blocks made for inner levels + (since they cannot be recorded as subblocks in that level) + must be carried forward so they will later become subblocks + of something else. */ + else if (subblocks) + current_binding_level->blocks + = chainon (current_binding_level->blocks, subblocks); + + /* Each and every BLOCK node created here in `poplevel' is important + (e.g. for proper debugging information) so if we created one + earlier, mark it as "used". */ + if (block) + TREE_USED (block) = 1; + + /* All temporary bindings created for cleanups are popped silently. */ + if (kind == sk_cleanup) + goto restart; + + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, block); +} + +/* Walk all the namespaces contained NAMESPACE, including NAMESPACE + itself, calling F for each. The DATA is passed to F as well. */ + +static int +walk_namespaces_r (tree name_space, walk_namespaces_fn f, void* data) +{ + int result = 0; + tree current = NAMESPACE_LEVEL (name_space)->namespaces; + + result |= (*f) (name_space, data); + + for (; current; current = DECL_CHAIN (current)) + result |= walk_namespaces_r (current, f, data); + + return result; +} + +/* Walk all the namespaces, calling F for each. The DATA is passed to + F as well. */ + +int +walk_namespaces (walk_namespaces_fn f, void* data) +{ + return walk_namespaces_r (global_namespace, f, data); +} + +/* Call wrapup_globals_declarations for the globals in NAMESPACE. If + DATA is non-NULL, this is the last time we will call + wrapup_global_declarations for this NAMESPACE. */ + +int +wrapup_globals_for_namespace (tree name_space, void* data) +{ + struct cp_binding_level *level = NAMESPACE_LEVEL (name_space); + VEC(tree,gc) *statics = level->static_decls; + tree *vec = VEC_address (tree, statics); + int len = VEC_length (tree, statics); + int last_time = (data != 0); + + if (last_time) + { + check_global_declarations (vec, len); + emit_debug_global_declarations (vec, len); + return 0; + } + + /* Write out any globals that need to be output. */ + return wrapup_global_declarations (vec, len); +} + + +/* 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; + + decl = build_decl (input_location, TYPE_DECL, name, type); + DECL_ARTIFICIAL (decl) = 1; + /* There are other implicit type declarations, like the one *within* + a class that allows you to write `S::S'. We must distinguish + amongst these. */ + SET_DECL_IMPLICIT_TYPEDEF_P (decl); + TYPE_NAME (type) = decl; + TYPE_STUB_DECL (type) = decl; + + return decl; +} + +/* 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); + + name = DECL_NAME (decl); + + nelts = VEC_length (tree, local_names); + for (i = 0; i < nelts; i++) + { + t = VEC_index (tree, local_names, i); + if (DECL_NAME (t) == name) + { + if (!DECL_LANG_SPECIFIC (decl)) + retrofit_lang_decl (decl); + DECL_LANG_SPECIFIC (decl)->u.base.u2sel = 1; + if (DECL_LANG_SPECIFIC (t)) + DECL_DISCRIMINATOR (decl) = DECL_DISCRIMINATOR (t) + 1; + else + DECL_DISCRIMINATOR (decl) = 1; + + VEC_replace (tree, local_names, i, decl); + timevar_pop (TV_NAME_LOOKUP); + return; + } + } + + VEC_safe_push (tree, gc, local_names, decl); + timevar_pop (TV_NAME_LOOKUP); +} + +/* Subroutine of duplicate_decls: return truthvalue of whether + or not types of these decls match. + + For C++, we must compare the parameter list so that `int' can match + `int&' in a parameter position, but `int&' is not confused with + `const int&'. */ + +int +decls_match (tree newdecl, tree olddecl) +{ + int types_match; + + if (newdecl == olddecl) + return 1; + + if (TREE_CODE (newdecl) != TREE_CODE (olddecl)) + /* If the two DECLs are not even the same kind of thing, we're not + interested in their types. */ + return 0; + + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + tree f1 = TREE_TYPE (newdecl); + tree f2 = TREE_TYPE (olddecl); + tree p1 = TYPE_ARG_TYPES (f1); + tree p2 = TYPE_ARG_TYPES (f2); + + /* Specializations of different templates are different functions + even if they have the same type. */ + tree t1 = (DECL_USE_TEMPLATE (newdecl) + ? DECL_TI_TEMPLATE (newdecl) + : NULL_TREE); + tree t2 = (DECL_USE_TEMPLATE (olddecl) + ? DECL_TI_TEMPLATE (olddecl) + : NULL_TREE); + if (t1 != t2) + return 0; + + if (CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl) + && ! (DECL_EXTERN_C_P (newdecl) + && DECL_EXTERN_C_P (olddecl))) + return 0; + +#ifdef NO_IMPLICIT_EXTERN_C + /* A new declaration doesn't match a built-in one unless it + is also extern "C". */ + if (DECL_IS_BUILTIN (olddecl) + && DECL_EXTERN_C_P (olddecl) && !DECL_EXTERN_C_P (newdecl)) + return 0; +#endif + + if (TREE_CODE (f1) != TREE_CODE (f2)) + return 0; + + if (same_type_p (TREE_TYPE (f1), TREE_TYPE (f2))) + { + if (!prototype_p (f2) && DECL_EXTERN_C_P (olddecl) + && (DECL_BUILT_IN (olddecl) +#ifndef NO_IMPLICIT_EXTERN_C + || (DECL_IN_SYSTEM_HEADER (newdecl) && !DECL_CLASS_SCOPE_P (newdecl)) + || (DECL_IN_SYSTEM_HEADER (olddecl) && !DECL_CLASS_SCOPE_P (olddecl)) +#endif + )) + { + types_match = self_promoting_args_p (p1); + if (p1 == void_list_node) + TREE_TYPE (newdecl) = TREE_TYPE (olddecl); + } +#ifndef NO_IMPLICIT_EXTERN_C + else if (!prototype_p (f1) + && (DECL_EXTERN_C_P (olddecl) + && DECL_IN_SYSTEM_HEADER (olddecl) + && !DECL_CLASS_SCOPE_P (olddecl)) + && (DECL_EXTERN_C_P (newdecl) + && DECL_IN_SYSTEM_HEADER (newdecl) + && !DECL_CLASS_SCOPE_P (newdecl))) + { + types_match = self_promoting_args_p (p2); + TREE_TYPE (newdecl) = TREE_TYPE (olddecl); + } +#endif + else + types_match = + compparms (p1, p2) + && (TYPE_ATTRIBUTES (TREE_TYPE (newdecl)) == NULL_TREE + || targetm.comp_type_attributes (TREE_TYPE (newdecl), + TREE_TYPE (olddecl)) != 0); + } + else + types_match = 0; + } + 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)); + } + else + { + /* Need to check scope for variable declaration (VAR_DECL). + For typedef (TYPE_DECL), scope is ignored. */ + if (TREE_CODE (newdecl) == VAR_DECL + && CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl) + /* [dcl.link] + Two declarations for an object with C language linkage + with the same name (ignoring the namespace that qualify + it) that appear in different namespace scopes refer to + the same object. */ + && !(DECL_EXTERN_C_P (olddecl) && DECL_EXTERN_C_P (newdecl))) + return 0; + + if (TREE_TYPE (newdecl) == error_mark_node) + types_match = TREE_TYPE (olddecl) == error_mark_node; + else if (TREE_TYPE (olddecl) == NULL_TREE) + types_match = TREE_TYPE (newdecl) == NULL_TREE; + else if (TREE_TYPE (newdecl) == NULL_TREE) + types_match = 0; + else + types_match = comptypes (TREE_TYPE (newdecl), + TREE_TYPE (olddecl), + COMPARE_REDECLARATION); + } + + return types_match; +} + +/* If NEWDECL is `static' and an `extern' was seen previously, + warn about it. OLDDECL is the previous declaration. + + Note that this does not apply to the C++ case of declaring + a variable `extern const' and then later `const'. + + Don't complain about built-in functions, since they are beyond + the user's control. */ + +void +warn_extern_redeclared_static (tree newdecl, tree olddecl) +{ + 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 + use of `static'. */ + if (TREE_CODE (newdecl) == FUNCTION_DECL + && DECL_STATIC_FUNCTION_P (newdecl)) + return; + + /* If the old declaration was `static', or the new one isn't, then + then everything is OK. */ + if (DECL_THIS_STATIC (olddecl) || !DECL_THIS_STATIC (newdecl)) + return; + + /* It's OK to declare a builtin function as `static'. */ + if (TREE_CODE (olddecl) == FUNCTION_DECL + && DECL_ARTIFICIAL (olddecl)) + return; + + permerror (input_location, "%qD was declared % and later %", newdecl); + permerror (input_location, "previous declaration of %q+D", olddecl); +} + +/* NEW_DECL is a redeclaration of OLD_DECL; both are functions or + function templates. If their exception specifications do not + match, issue a diagnostic. */ + +static void +check_redeclaration_exception_specification (tree new_decl, + tree old_decl) +{ + tree new_type; + tree old_type; + tree new_exceptions; + tree old_exceptions; + + new_type = TREE_TYPE (new_decl); + new_exceptions = TYPE_RAISES_EXCEPTIONS (new_type); + old_type = TREE_TYPE (old_decl); + old_exceptions = TYPE_RAISES_EXCEPTIONS (old_type); + + /* [except.spec] + + If any declaration of a function has an exception-specification, + all declarations, including the definition and an explicit + specialization, of that function shall have an + exception-specification with the same set of type-ids. */ + if ((pedantic || ! DECL_IN_SYSTEM_HEADER (old_decl)) + && ! DECL_IS_BUILTIN (old_decl) + && flag_exceptions + && !comp_except_specs (new_exceptions, old_exceptions, ce_normal)) + { + error ("declaration of %qF has a different exception specifier", + new_decl); + error ("from previous declaration %q+F", old_decl); + } +} + +/* Return true if OLD_DECL and NEW_DECL agree on constexprness. + Otherwise issue diagnostics. */ + +static bool +validate_constexpr_redeclaration (tree old_decl, tree new_decl) +{ + old_decl = STRIP_TEMPLATE (old_decl); + new_decl = STRIP_TEMPLATE (new_decl); + if (!VAR_OR_FUNCTION_DECL_P (old_decl) + || !VAR_OR_FUNCTION_DECL_P (new_decl)) + return true; + if (DECL_DECLARED_CONSTEXPR_P (old_decl) + == DECL_DECLARED_CONSTEXPR_P (new_decl)) + return true; + if (TREE_CODE (old_decl) == FUNCTION_DECL && DECL_BUILT_IN (old_decl)) + { + /* Hide a built-in declaration. */ + DECL_DECLARED_CONSTEXPR_P (old_decl) + = DECL_DECLARED_CONSTEXPR_P (new_decl); + return true; + } + error ("redeclaration %qD differs in %", new_decl); + error ("from previous declaration %q+D", old_decl); + return false; +} + +#define GNU_INLINE_P(fn) (DECL_DECLARED_INLINE_P (fn) \ + && lookup_attribute ("gnu_inline", \ + DECL_ATTRIBUTES (fn))) + +/* 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. + + NEWDECL_IS_FRIEND is true if NEWDECL was declared as a friend. */ + +tree +duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) +{ + unsigned olddecl_uid = DECL_UID (olddecl); + int olddecl_friend = 0, types_match = 0, hidden_friend = 0; + int new_defines_function = 0; + tree new_template_info; + + if (newdecl == olddecl) + return olddecl; + + types_match = decls_match (newdecl, olddecl); + + /* If either the type of the new decl or the type of the old decl is an + error_mark_node, then that implies that we have already issued an + error (earlier) for some bogus type specification, and in that case, + it is rather pointless to harass the user with yet more error message + about the same declaration, so just pretend the types match here. */ + if (TREE_TYPE (newdecl) == error_mark_node + || TREE_TYPE (olddecl) == error_mark_node) + return error_mark_node; + + if (DECL_P (olddecl) + && TREE_CODE (newdecl) == FUNCTION_DECL + && TREE_CODE (olddecl) == FUNCTION_DECL + && (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl))) + { + if (DECL_DECLARED_INLINE_P (newdecl) + && DECL_UNINLINABLE (newdecl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) + /* Already warned elsewhere. */; + else if (DECL_DECLARED_INLINE_P (olddecl) + && DECL_UNINLINABLE (olddecl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) + /* Already warned. */; + else if (DECL_DECLARED_INLINE_P (newdecl) + && DECL_UNINLINABLE (olddecl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) + { + warning (OPT_Wattributes, "function %q+D redeclared as inline", + newdecl); + warning (OPT_Wattributes, "previous declaration of %q+D " + "with attribute noinline", olddecl); + } + else if (DECL_DECLARED_INLINE_P (olddecl) + && DECL_UNINLINABLE (newdecl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) + { + warning (OPT_Wattributes, "function %q+D redeclared with " + "attribute noinline", newdecl); + warning (OPT_Wattributes, "previous declaration of %q+D was inline", + olddecl); + } + } + + /* Check for redeclaration and other discrepancies. */ + if (TREE_CODE (olddecl) == FUNCTION_DECL + && DECL_ARTIFICIAL (olddecl)) + { + gcc_assert (!DECL_HIDDEN_FRIEND_P (olddecl)); + if (TREE_CODE (newdecl) != FUNCTION_DECL) + { + /* Avoid warnings redeclaring built-ins which have not been + explicitly declared. */ + 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 + bad choice of name. */ + if (! TREE_PUBLIC (newdecl)) + { + warning (OPT_Wshadow, + DECL_BUILT_IN (olddecl) + ? G_("shadowing built-in function %q#D") + : G_("shadowing library function %q#D"), 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. */ + else if (! DECL_BUILT_IN (olddecl)) + warning (0, "library function %q#D redeclared as non-function %q#D", + olddecl, newdecl); + else + { + error ("declaration of %q#D", newdecl); + error ("conflicts with built-in declaration %q#D", + olddecl); + } + return NULL_TREE; + } + else if (!types_match) + { + /* Avoid warnings redeclaring built-ins which have not been + explicitly declared. */ + if (DECL_ANTICIPATED (olddecl)) + { + /* Deal with fileptr_type_node. FILE type is not known + at the time we create the builtins. */ + tree t1, t2; + + for (t1 = TYPE_ARG_TYPES (TREE_TYPE (newdecl)), + t2 = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); + t1 || t2; + t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2)) + if (!t1 || !t2) + break; + else if (TREE_VALUE (t2) == fileptr_type_node) + { + tree t = TREE_VALUE (t1); + + if (TREE_CODE (t) == POINTER_TYPE + && TYPE_NAME (TREE_TYPE (t)) + && DECL_NAME (TYPE_NAME (TREE_TYPE (t))) + == get_identifier ("FILE") + && compparms (TREE_CHAIN (t1), TREE_CHAIN (t2))) + { + tree oldargs = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); + + TYPE_ARG_TYPES (TREE_TYPE (olddecl)) + = TYPE_ARG_TYPES (TREE_TYPE (newdecl)); + types_match = decls_match (newdecl, olddecl); + if (types_match) + return duplicate_decls (newdecl, olddecl, + newdecl_is_friend); + TYPE_ARG_TYPES (TREE_TYPE (olddecl)) = oldargs; + } + } + else if (! same_type_p (TREE_VALUE (t1), TREE_VALUE (t2))) + break; + } + else if ((DECL_EXTERN_C_P (newdecl) + && DECL_EXTERN_C_P (olddecl)) + || compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), + TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) + { + /* A near match; override the builtin. */ + + if (TREE_PUBLIC (newdecl)) + { + warning (0, "new declaration %q#D", newdecl); + warning (0, "ambiguates built-in declaration %q#D", + olddecl); + } + else + warning (OPT_Wshadow, + DECL_BUILT_IN (olddecl) + ? G_("shadowing built-in function %q#D") + : G_("shadowing library function %q#D"), olddecl); + } + else + /* Discard the old built-in function. */ + return NULL_TREE; + + /* Replace the old RTL to avoid problems with inlining. */ + COPY_DECL_RTL (newdecl, olddecl); + } + /* Even if the types match, prefer the new declarations type for + built-ins which have not been explicitly declared, for + exception lists, etc... */ + else if (DECL_IS_BUILTIN (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; + } + + /* If a function is explicitly declared "throw ()", propagate that to + the corresponding builtin. */ + if (DECL_BUILT_IN_CLASS (olddecl) == BUILT_IN_NORMAL + && DECL_ANTICIPATED (olddecl) + && TREE_NOTHROW (newdecl) + && !TREE_NOTHROW (olddecl) + && built_in_decls [DECL_FUNCTION_CODE (olddecl)] != NULL_TREE + && built_in_decls [DECL_FUNCTION_CODE (olddecl)] != olddecl + && types_match) + TREE_NOTHROW (built_in_decls [DECL_FUNCTION_CODE (olddecl)]) = 1; + + /* Whether or not the builtin can throw exceptions has no + bearing on this declarator. */ + TREE_NOTHROW (olddecl) = 0; + + if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl)) + { + /* If a builtin function is redeclared as `static', merge + the declarations, but make the original one static. */ + DECL_THIS_STATIC (olddecl) = 1; + TREE_PUBLIC (olddecl) = 0; + + /* Make the old declaration consistent with the new one so + that all remnants of the builtin-ness of this function + will be banished. */ + SET_DECL_LANGUAGE (olddecl, DECL_LANGUAGE (newdecl)); + COPY_DECL_RTL (newdecl, olddecl); + } + } + else if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) + { + /* C++ Standard, 3.3, clause 4: + "[Note: a namespace name or a class template name must be unique + in its declarative region (7.3.2, clause 14). ]" */ + if (TREE_CODE (olddecl) != NAMESPACE_DECL + && TREE_CODE (newdecl) != NAMESPACE_DECL + && (TREE_CODE (olddecl) != TEMPLATE_DECL + || TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) != TYPE_DECL) + && (TREE_CODE (newdecl) != TEMPLATE_DECL + || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) != TYPE_DECL)) + { + if ((TREE_CODE (olddecl) == TYPE_DECL && DECL_ARTIFICIAL (olddecl) + && TREE_CODE (newdecl) != TYPE_DECL) + || (TREE_CODE (newdecl) == TYPE_DECL && DECL_ARTIFICIAL (newdecl) + && TREE_CODE (olddecl) != TYPE_DECL)) + { + /* We do nothing special here, because C++ does such nasty + things with TYPE_DECLs. Instead, just let the TYPE_DECL + 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 ("%q#D redeclared as different kind of symbol", newdecl); + if (TREE_CODE (olddecl) == TREE_LIST) + olddecl = TREE_VALUE (olddecl); + error ("previous declaration of %q+#D", olddecl); + + return error_mark_node; + } + 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) + { + /* The name of a class template may not be declared to refer to + any other template, class, function, object, namespace, value, + or type in the same scope. */ + if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == TYPE_DECL + || TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) + { + error ("declaration of template %q#D", newdecl); + error ("conflicts with previous declaration %q+#D", olddecl); + } + else if (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) == FUNCTION_DECL + && TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == FUNCTION_DECL + && compparms (TYPE_ARG_TYPES (TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl))), + TYPE_ARG_TYPES (TREE_TYPE (DECL_TEMPLATE_RESULT (newdecl)))) + && comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), + DECL_TEMPLATE_PARMS (olddecl)) + /* Template functions can be disambiguated by + return type. */ + && same_type_p (TREE_TYPE (TREE_TYPE (newdecl)), + TREE_TYPE (TREE_TYPE (olddecl)))) + { + error ("new declaration %q#D", newdecl); + error ("ambiguates old declaration %q+#D", olddecl); + } + return NULL_TREE; + } + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + if (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl)) + { + error ("declaration of C function %q#D conflicts with", + newdecl); + error ("previous declaration %q+#D here", olddecl); + } + else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)), + TYPE_ARG_TYPES (TREE_TYPE (olddecl)))) + { + error ("new declaration %q#D", newdecl); + error ("ambiguates old declaration %q+#D", olddecl); + return error_mark_node; + } + else + return NULL_TREE; + } + else + { + error ("conflicting declaration %q#D", newdecl); + error ("%q+D has a previous declaration as %q#D", olddecl, olddecl); + return error_mark_node; + } + } + else if (TREE_CODE (newdecl) == FUNCTION_DECL + && ((DECL_TEMPLATE_SPECIALIZATION (olddecl) + && (!DECL_TEMPLATE_INFO (newdecl) + || (DECL_TI_TEMPLATE (newdecl) + != DECL_TI_TEMPLATE (olddecl)))) + || (DECL_TEMPLATE_SPECIALIZATION (newdecl) + && (!DECL_TEMPLATE_INFO (olddecl) + || (DECL_TI_TEMPLATE (olddecl) + != DECL_TI_TEMPLATE (newdecl)))))) + /* It's OK to have a template specialization and a non-template + with the same type, or to have specializations of two + different templates with the same type. Note that if one is a + specialization, and the other is an instantiation of the same + template, that we do not exit at this point. That situation + 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)) + || (DECL_TEMPLATE_INSTANTIATION (newdecl) + && !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) + { + /* 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. */ + if (DECL_NAMESPACE_ALIAS (newdecl) + && (DECL_NAMESPACE_ALIAS (newdecl) + == DECL_NAMESPACE_ALIAS (olddecl))) + return olddecl; + /* [namespace.alias] + + A namespace-name or namespace-alias shall not be declared as + the name of any other entity in the same declarative region. + A namespace-name defined at global scope shall not be + declared as the name of any other entity in any global scope + of the program. */ + error ("declaration of namespace %qD conflicts with", newdecl); + error ("previous declaration of namespace %q+D here", olddecl); + return error_mark_node; + } + else + { + const char *errmsg = redeclaration_error_message (newdecl, olddecl); + if (errmsg) + { + error_at (DECL_SOURCE_LOCATION (newdecl), errmsg, newdecl); + if (DECL_NAME (olddecl) != NULL_TREE) + error ((DECL_INITIAL (olddecl) && namespace_bindings_p ()) + ? "%q+#D previously defined here" + : "%q+#D previously declared here", olddecl); + return error_mark_node; + } + else if (TREE_CODE (olddecl) == FUNCTION_DECL + && DECL_INITIAL (olddecl) != NULL_TREE + && !prototype_p (TREE_TYPE (olddecl)) + && prototype_p (TREE_TYPE (newdecl))) + { + /* Prototype decl follows defn w/o prototype. */ + warning_at (input_location, 0, "prototype for %q+#D", newdecl); + warning_at (DECL_SOURCE_LOCATION (olddecl), 0, + "follows non-prototype definition here"); + } + else if ((TREE_CODE (olddecl) == FUNCTION_DECL + || TREE_CODE (olddecl) == VAR_DECL) + && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)) + { + /* [dcl.link] + If two declarations of the same function or object + specify different linkage-specifications ..., the program + is ill-formed.... Except for functions with C++ linkage, + a function declaration without a linkage specification + shall not precede the first linkage specification for + that function. A function can be declared without a + linkage specification after an explicit linkage + specification has been seen; the linkage explicitly + specified in the earlier declaration is not affected by + such a function declaration. + + DR 563 raises the question why the restrictions on + functions should not also apply to objects. Older + versions of G++ silently ignore the linkage-specification + for this example: + + namespace N { + extern int i; + extern "C" int i; + } + + which is clearly wrong. Therefore, we now treat objects + like functions. */ + if (current_lang_depth () == 0) + { + /* There is no explicit linkage-specification, so we use + the linkage from the previous declaration. */ + if (!DECL_LANG_SPECIFIC (newdecl)) + retrofit_lang_decl (newdecl); + SET_DECL_LANGUAGE (newdecl, DECL_LANGUAGE (olddecl)); + } + else + { + error ("previous declaration of %q+#D with %qL linkage", + olddecl, DECL_LANGUAGE (olddecl)); + error ("conflicts with new declaration with %qL linkage", + DECL_LANGUAGE (newdecl)); + } + } + + if (DECL_LANG_SPECIFIC (olddecl) && DECL_USE_TEMPLATE (olddecl)) + ; + else if (TREE_CODE (olddecl) == FUNCTION_DECL) + { + tree t1 = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); + tree t2 = TYPE_ARG_TYPES (TREE_TYPE (newdecl)); + int i = 1; + + if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE) + t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2); + + for (; t1 && t1 != void_list_node; + t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++) + if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2)) + { + if (1 == simple_cst_equal (TREE_PURPOSE (t1), + TREE_PURPOSE (t2))) + { + permerror (input_location, "default argument given for parameter %d of %q#D", + i, newdecl); + permerror (input_location, "after previous specification in %q+#D", olddecl); + } + else + { + error ("default argument given for parameter %d of %q#D", + i, newdecl); + error ("after previous specification in %q+#D", + olddecl); + } + } + } + } + + /* Do not merge an implicit typedef with an explicit one. In: + + class A; + ... + typedef class A A __attribute__ ((foo)); + + the attribute should apply only to the typedef. */ + 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. */ + warn_extern_redeclared_static (newdecl, olddecl); + + if (!validate_constexpr_redeclaration (olddecl, newdecl)) + return error_mark_node; + + /* We have committed to returning 1 at this point. */ + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + /* Now that functions must hold information normally held + by field decls, there is extra work to do so that + declaration information does not get destroyed during + definition. */ + if (DECL_VINDEX (olddecl)) + DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl); + if (DECL_CONTEXT (olddecl)) + DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl); + DECL_STATIC_CONSTRUCTOR (newdecl) |= DECL_STATIC_CONSTRUCTOR (olddecl); + DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl); + DECL_PURE_VIRTUAL_P (newdecl) |= DECL_PURE_VIRTUAL_P (olddecl); + DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl); + DECL_INVALID_OVERRIDER_P (newdecl) |= DECL_INVALID_OVERRIDER_P (olddecl); + DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl); + if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK) + SET_OVERLOADED_OPERATOR_CODE + (newdecl, DECL_OVERLOADED_OPERATOR_P (olddecl)); + new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE; + + /* Optionally warn about more than one declaration for the same + name, but don't warn about a function declaration followed by a + definition. */ + if (warn_redundant_decls && ! DECL_ARTIFICIAL (olddecl) + && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE) + /* Don't warn about extern decl followed by definition. */ + && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)) + /* Don't warn about friends, let add_friend take care of it. */ + && ! (newdecl_is_friend || DECL_FRIEND_P (olddecl))) + { + warning (OPT_Wredundant_decls, "redundant redeclaration of %qD in same scope", newdecl); + warning (OPT_Wredundant_decls, "previous declaration of %q+D", olddecl); + } + + if (DECL_DELETED_FN (newdecl)) + { + error ("deleted definition of %qD", newdecl); + error ("after previous declaration %q+D", olddecl); + } + DECL_DELETED_FN (newdecl) |= DECL_DELETED_FN (olddecl); + } + + /* 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); + } + + /* Copy all the DECL_... slots specified in the new decl + except for any that we copy here from the old type. */ + DECL_ATTRIBUTES (newdecl) + = (*targetm.merge_decl_attributes) (olddecl, newdecl); + + if (TREE_CODE (newdecl) == TEMPLATE_DECL) + { + tree old_result; + tree new_result; + old_result = DECL_TEMPLATE_RESULT (olddecl); + new_result = DECL_TEMPLATE_RESULT (newdecl); + TREE_TYPE (olddecl) = TREE_TYPE (old_result); + DECL_TEMPLATE_SPECIALIZATIONS (olddecl) + = chainon (DECL_TEMPLATE_SPECIALIZATIONS (olddecl), + DECL_TEMPLATE_SPECIALIZATIONS (newdecl)); + + DECL_ATTRIBUTES (old_result) + = (*targetm.merge_decl_attributes) (old_result, new_result); + + if (DECL_FUNCTION_TEMPLATE_P (newdecl)) + { + if (GNU_INLINE_P (old_result) != GNU_INLINE_P (new_result) + && DECL_INITIAL (new_result)) + { + if (DECL_INITIAL (old_result)) + DECL_UNINLINABLE (old_result) = 1; + else + DECL_UNINLINABLE (old_result) = DECL_UNINLINABLE (new_result); + DECL_EXTERNAL (old_result) = DECL_EXTERNAL (new_result); + DECL_NOT_REALLY_EXTERN (old_result) + = DECL_NOT_REALLY_EXTERN (new_result); + DECL_INTERFACE_KNOWN (old_result) + = DECL_INTERFACE_KNOWN (new_result); + DECL_DECLARED_INLINE_P (old_result) + = DECL_DECLARED_INLINE_P (new_result); + DECL_DISREGARD_INLINE_LIMITS (old_result) + |= DECL_DISREGARD_INLINE_LIMITS (new_result); + + } + else + { + DECL_DECLARED_INLINE_P (old_result) + |= DECL_DECLARED_INLINE_P (new_result); + DECL_DISREGARD_INLINE_LIMITS (old_result) + |= DECL_DISREGARD_INLINE_LIMITS (new_result); + check_redeclaration_exception_specification (newdecl, olddecl); + } + } + + /* If the new declaration is a definition, update the file and + line information on the declaration, and also make + the old declaration the same definition. */ + if (DECL_INITIAL (new_result) != NULL_TREE) + { + DECL_SOURCE_LOCATION (olddecl) + = DECL_SOURCE_LOCATION (old_result) + = DECL_SOURCE_LOCATION (newdecl); + DECL_INITIAL (old_result) = DECL_INITIAL (new_result); + if (DECL_FUNCTION_TEMPLATE_P (newdecl)) + { + tree parm; + DECL_ARGUMENTS (old_result) + = DECL_ARGUMENTS (new_result); + for (parm = DECL_ARGUMENTS (old_result); parm; + parm = DECL_CHAIN (parm)) + DECL_CONTEXT (parm) = old_result; + } + } + + return olddecl; + } + + if (types_match) + { + /* Automatically handles default parameters. */ + tree oldtype = TREE_TYPE (olddecl); + tree newtype; + + /* Merge the data types specified in the two decls. */ + newtype = merge_types (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); + + /* If merge_types produces a non-typedef type, just use the old type. */ + if (TREE_CODE (newdecl) == TYPE_DECL + && newtype == DECL_ORIGINAL_TYPE (newdecl)) + newtype = oldtype; + + if (TREE_CODE (newdecl) == VAR_DECL) + { + DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl); + DECL_INITIALIZED_P (newdecl) |= DECL_INITIALIZED_P (olddecl); + DECL_NONTRIVIALLY_INITIALIZED_P (newdecl) + |= DECL_NONTRIVIALLY_INITIALIZED_P (olddecl); + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (newdecl) + |= DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (olddecl); + + /* Merge the threadprivate attribute from OLDDECL into NEWDECL. */ + if (DECL_LANG_SPECIFIC (olddecl) + && CP_DECL_THREADPRIVATE_P (olddecl)) + { + /* Allocate a LANG_SPECIFIC structure for NEWDECL, if needed. */ + if (!DECL_LANG_SPECIFIC (newdecl)) + retrofit_lang_decl (newdecl); + + DECL_TLS_MODEL (newdecl) = DECL_TLS_MODEL (olddecl); + CP_DECL_THREADPRIVATE_P (newdecl) = 1; + } + } + + /* Do this after calling `merge_types' so that default + parameters don't confuse us. */ + else if (TREE_CODE (newdecl) == FUNCTION_DECL) + check_redeclaration_exception_specification (newdecl, olddecl); + TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype; + + if (TREE_CODE (newdecl) == FUNCTION_DECL) + check_default_args (newdecl); + + /* Lay the type out, unless already done. */ + if (! same_type_p (newtype, oldtype) + && TREE_TYPE (newdecl) != error_mark_node + && !(processing_template_decl && uses_template_parms (newdecl))) + layout_type (TREE_TYPE (newdecl)); + + if ((TREE_CODE (newdecl) == VAR_DECL + || TREE_CODE (newdecl) == PARM_DECL + || TREE_CODE (newdecl) == RESULT_DECL + || TREE_CODE (newdecl) == FIELD_DECL + || TREE_CODE (newdecl) == TYPE_DECL) + && !(processing_template_decl && uses_template_parms (newdecl))) + layout_decl (newdecl, 0); + + /* Merge the type qualifiers. */ + if (TREE_READONLY (newdecl)) + TREE_READONLY (olddecl) = 1; + if (TREE_THIS_VOLATILE (newdecl)) + TREE_THIS_VOLATILE (olddecl) = 1; + if (TREE_NOTHROW (newdecl)) + TREE_NOTHROW (olddecl) = 1; + + /* Merge deprecatedness. */ + if (TREE_DEPRECATED (newdecl)) + TREE_DEPRECATED (olddecl) = 1; + + /* Preserve function specific target and optimization options */ + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + if (DECL_FUNCTION_SPECIFIC_TARGET (olddecl) + && !DECL_FUNCTION_SPECIFIC_TARGET (newdecl)) + DECL_FUNCTION_SPECIFIC_TARGET (newdecl) + = DECL_FUNCTION_SPECIFIC_TARGET (olddecl); + + if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (olddecl) + && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (newdecl)) + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (newdecl) + = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (olddecl); + } + + /* Merge the initialization information. */ + if (DECL_INITIAL (newdecl) == NULL_TREE + && DECL_INITIAL (olddecl) != NULL_TREE) + { + DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); + DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl); + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl); + DECL_STRUCT_FUNCTION (newdecl) = DECL_STRUCT_FUNCTION (olddecl); + } + } + + /* Merge the section attribute. + We want to issue an error if the sections conflict but that must be + done later in decl_attributes since we are called before attributes + are assigned. */ + if (DECL_SECTION_NAME (newdecl) == NULL_TREE) + DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl); + + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + 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_NOTHROW (newdecl) |= TREE_NOTHROW (olddecl); + DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl); + DECL_IS_OPERATOR_NEW (newdecl) |= DECL_IS_OPERATOR_NEW (olddecl); + DECL_PURE_P (newdecl) |= DECL_PURE_P (olddecl); + TREE_READONLY (newdecl) |= TREE_READONLY (olddecl); + DECL_LOOPING_CONST_OR_PURE_P (newdecl) + |= DECL_LOOPING_CONST_OR_PURE_P (olddecl); + /* Keep the old RTL. */ + COPY_DECL_RTL (olddecl, newdecl); + } + else if (TREE_CODE (newdecl) == VAR_DECL + && (DECL_SIZE (olddecl) || !DECL_SIZE (newdecl))) + { + /* Keep the old RTL. We cannot keep the old RTL if the old + declaration was for an incomplete object and the new + declaration is not since many attributes of the RTL will + change. */ + COPY_DECL_RTL (olddecl, newdecl); + } + } + /* If cannot merge, then use the new type and qualifiers, + and don't preserve the old rtl. */ + else + { + /* Clean out any memory we had of the old declaration. */ + tree oldstatic = value_member (olddecl, static_aggregates); + if (oldstatic) + TREE_VALUE (oldstatic) = error_mark_node; + + TREE_TYPE (olddecl) = TREE_TYPE (newdecl); + TREE_READONLY (olddecl) = TREE_READONLY (newdecl); + TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl); + TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl); + } + + /* Merge the storage class information. */ + merge_weak (newdecl, olddecl); + + if (DECL_ONE_ONLY (olddecl)) + DECL_COMDAT_GROUP (newdecl) = DECL_COMDAT_GROUP (olddecl); + + DECL_DEFER_OUTPUT (newdecl) |= DECL_DEFER_OUTPUT (olddecl); + TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); + TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl); + if (! DECL_EXTERNAL (olddecl)) + DECL_EXTERNAL (newdecl) = 0; + + new_template_info = NULL_TREE; + if (DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl)) + { + bool new_redefines_gnu_inline = false; + + if (new_defines_function + && ((DECL_INTERFACE_KNOWN (olddecl) + && TREE_CODE (olddecl) == FUNCTION_DECL) + || (TREE_CODE (olddecl) == TEMPLATE_DECL + && (TREE_CODE (DECL_TEMPLATE_RESULT (olddecl)) + == FUNCTION_DECL)))) + { + tree fn = olddecl; + + if (TREE_CODE (fn) == TEMPLATE_DECL) + fn = DECL_TEMPLATE_RESULT (olddecl); + + new_redefines_gnu_inline = GNU_INLINE_P (fn) && DECL_INITIAL (fn); + } + + if (!new_redefines_gnu_inline) + { + DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl); + DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl); + DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl); + } + DECL_TEMPLATE_INSTANTIATED (newdecl) + |= DECL_TEMPLATE_INSTANTIATED (olddecl); + DECL_ODR_USED (newdecl) |= DECL_ODR_USED (olddecl); + + /* If the OLDDECL is an instantiation and/or specialization, + then the NEWDECL must be too. But, it may not yet be marked + as such if the caller has created NEWDECL, but has not yet + figured out that it is a redeclaration. */ + if (!DECL_USE_TEMPLATE (newdecl)) + DECL_USE_TEMPLATE (newdecl) = DECL_USE_TEMPLATE (olddecl); + + /* Don't really know how much of the language-specific + values we should copy from old to new. */ + DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl); + DECL_REPO_AVAILABLE_P (newdecl) = DECL_REPO_AVAILABLE_P (olddecl); + DECL_INITIALIZED_IN_CLASS_P (newdecl) + |= DECL_INITIALIZED_IN_CLASS_P (olddecl); + + if (LANG_DECL_HAS_MIN (newdecl)) + { + DECL_LANG_SPECIFIC (newdecl)->u.min.u2 = + DECL_LANG_SPECIFIC (olddecl)->u.min.u2; + if (DECL_TEMPLATE_INFO (newdecl)) + new_template_info = DECL_TEMPLATE_INFO (newdecl); + DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl); + } + /* Only functions have these fields. */ + if (TREE_CODE (newdecl) == FUNCTION_DECL + || DECL_FUNCTION_TEMPLATE_P (newdecl)) + { + DECL_NONCONVERTING_P (newdecl) = DECL_NONCONVERTING_P (olddecl); + olddecl_friend = DECL_FRIEND_P (olddecl); + hidden_friend = (DECL_ANTICIPATED (olddecl) + && DECL_HIDDEN_FRIEND_P (olddecl) + && newdecl_is_friend); + DECL_BEFRIENDING_CLASSES (newdecl) + = chainon (DECL_BEFRIENDING_CLASSES (newdecl), + DECL_BEFRIENDING_CLASSES (olddecl)); + /* DECL_THUNKS is only valid for virtual functions, + otherwise it is a DECL_FRIEND_CONTEXT. */ + if (DECL_VIRTUAL_P (newdecl)) + DECL_THUNKS (newdecl) = DECL_THUNKS (olddecl); + } + /* Only variables have this field. */ + else if (TREE_CODE (newdecl) == VAR_DECL + && VAR_HAD_UNKNOWN_BOUND (olddecl)) + SET_VAR_HAD_UNKNOWN_BOUND (newdecl); + } + + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + tree parm; + + /* Merge parameter attributes. */ + tree oldarg, newarg; + for (oldarg = DECL_ARGUMENTS(olddecl), + newarg = DECL_ARGUMENTS(newdecl); + oldarg && newarg; + oldarg = DECL_CHAIN(oldarg), newarg = DECL_CHAIN(newarg)) { + DECL_ATTRIBUTES (newarg) + = (*targetm.merge_decl_attributes) (oldarg, newarg); + DECL_ATTRIBUTES (oldarg) = DECL_ATTRIBUTES (newarg); + } + + if (DECL_TEMPLATE_INSTANTIATION (olddecl) + && !DECL_TEMPLATE_INSTANTIATION (newdecl)) + { + /* 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. */ + gcc_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl)); + + if (DECL_ODR_USED (olddecl)) + /* From [temp.expl.spec]: + + If a template, a member template or the member of a class + template is explicitly specialized then that + specialization shall be declared before the first use of + that specialization that would cause an implicit + instantiation to take place, in every translation unit in + which such a use occurs. */ + error ("explicit specialization of %qD after first use", + olddecl); + + SET_DECL_TEMPLATE_SPECIALIZATION (olddecl); + + /* Don't propagate visibility from the template to the + specialization here. We'll do that in determine_visibility if + appropriate. */ + DECL_VISIBILITY_SPECIFIED (olddecl) = 0; + + /* [temp.expl.spec/14] We don't inline explicit specialization + just because the primary template says so. */ + } + else if (new_defines_function && DECL_INITIAL (olddecl)) + { + /* Never inline re-defined extern inline functions. + FIXME: this could be better handled by keeping both + function as separate declarations. */ + DECL_UNINLINABLE (newdecl) = 1; + } + else + { + if (DECL_PENDING_INLINE_INFO (newdecl) == 0) + DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl); + + DECL_DECLARED_INLINE_P (newdecl) |= DECL_DECLARED_INLINE_P (olddecl); + + DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl) + = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl)); + + DECL_DISREGARD_INLINE_LIMITS (newdecl) + = DECL_DISREGARD_INLINE_LIMITS (olddecl) + = (DECL_DISREGARD_INLINE_LIMITS (newdecl) + || DECL_DISREGARD_INLINE_LIMITS (olddecl)); + } + + /* Preserve abstractness on cloned [cd]tors. */ + DECL_ABSTRACT (newdecl) = DECL_ABSTRACT (olddecl); + + /* Update newdecl's parms to point at olddecl. */ + for (parm = DECL_ARGUMENTS (newdecl); parm; + parm = DECL_CHAIN (parm)) + DECL_CONTEXT (parm) = olddecl; + + if (! types_match) + { + SET_DECL_LANGUAGE (olddecl, DECL_LANGUAGE (newdecl)); + COPY_DECL_ASSEMBLER_NAME (newdecl, olddecl); + COPY_DECL_RTL (newdecl, olddecl); + } + if (! types_match || new_defines_function) + { + /* These need to be copied so that the names are available. + Note that if the types do match, we'll preserve inline + info and other bits, but if not, we won't. */ + DECL_ARGUMENTS (olddecl) = DECL_ARGUMENTS (newdecl); + DECL_RESULT (olddecl) = DECL_RESULT (newdecl); + } + if (new_defines_function) + /* If defining a function declared with other language + linkage, use the previously declared language linkage. */ + SET_DECL_LANGUAGE (newdecl, DECL_LANGUAGE (olddecl)); + else if (types_match) + { + /* If redeclaring a builtin function, and not a definition, + it stays built in. */ + if (DECL_BUILT_IN (olddecl)) + { + DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl); + DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl); + /* If we're keeping the built-in definition, keep the rtl, + regardless of declaration matches. */ + COPY_DECL_RTL (olddecl, newdecl); + } + + DECL_RESULT (newdecl) = DECL_RESULT (olddecl); + /* Don't clear out the arguments if we're just redeclaring a + function. */ + if (DECL_ARGUMENTS (olddecl)) + DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); + } + } + else if (TREE_CODE (newdecl) == NAMESPACE_DECL) + NAMESPACE_LEVEL (newdecl) = NAMESPACE_LEVEL (olddecl); + + /* Now preserve various other info from the definition. */ + TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl); + TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl); + DECL_COMMON (newdecl) = DECL_COMMON (olddecl); + COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); + + /* Warn about conflicting visibility specifications. */ + if (DECL_VISIBILITY_SPECIFIED (olddecl) + && DECL_VISIBILITY_SPECIFIED (newdecl) + && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) + { + warning_at (input_location, OPT_Wattributes, + "%q+D: visibility attribute ignored because it", newdecl); + warning_at (DECL_SOURCE_LOCATION (olddecl), OPT_Wattributes, + "conflicts with previous declaration here"); + } + /* Choose the declaration which specified visibility. */ + if (DECL_VISIBILITY_SPECIFIED (olddecl)) + { + DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); + DECL_VISIBILITY_SPECIFIED (newdecl) = 1; + } + /* Init priority used to be merged from newdecl to olddecl by the memcpy, + so keep this behavior. */ + if (TREE_CODE (newdecl) == VAR_DECL && DECL_HAS_INIT_PRIORITY_P (newdecl)) + { + SET_DECL_INIT_PRIORITY (olddecl, DECL_INIT_PRIORITY (newdecl)); + DECL_HAS_INIT_PRIORITY_P (olddecl) = 1; + } + /* Likewise for DECL_ALIGN, DECL_USER_ALIGN and DECL_PACKED. */ + if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) + { + DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); + DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl); + } + DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl); + if (TREE_CODE (newdecl) == FIELD_DECL) + DECL_PACKED (olddecl) = DECL_PACKED (newdecl); + + /* The DECL_LANG_SPECIFIC information in OLDDECL will be replaced + with that from NEWDECL below. */ + if (DECL_LANG_SPECIFIC (olddecl)) + { + gcc_assert (DECL_LANG_SPECIFIC (olddecl) + != DECL_LANG_SPECIFIC (newdecl)); + ggc_free (DECL_LANG_SPECIFIC (olddecl)); + } + + /* Merge the USED information. */ + if (TREE_USED (olddecl)) + TREE_USED (newdecl) = 1; + else if (TREE_USED (newdecl)) + TREE_USED (olddecl) = 1; + if (TREE_CODE (newdecl) == VAR_DECL) + { + if (DECL_READ_P (olddecl)) + DECL_READ_P (newdecl) = 1; + else if (DECL_READ_P (newdecl)) + DECL_READ_P (olddecl) = 1; + } + if (DECL_PRESERVE_P (olddecl)) + DECL_PRESERVE_P (newdecl) = 1; + else if (DECL_PRESERVE_P (newdecl)) + DECL_PRESERVE_P (olddecl) = 1; + + if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + int function_size; + + function_size = sizeof (struct tree_decl_common); + + memcpy ((char *) olddecl + sizeof (struct tree_common), + (char *) newdecl + sizeof (struct tree_common), + function_size - sizeof (struct tree_common)); + + memcpy ((char *) olddecl + sizeof (struct tree_decl_common), + (char *) newdecl + sizeof (struct tree_decl_common), + sizeof (struct tree_function_decl) - sizeof (struct tree_decl_common)); + if (new_template_info) + /* 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, + new_template_info, + olddecl); + } + else + { + size_t size = tree_code_size (TREE_CODE (olddecl)); + memcpy ((char *) olddecl + sizeof (struct tree_common), + (char *) newdecl + sizeof (struct tree_common), + sizeof (struct tree_decl_common) - sizeof (struct tree_common)); + switch (TREE_CODE (olddecl)) + { + case LABEL_DECL: + case VAR_DECL: + case RESULT_DECL: + case PARM_DECL: + case FIELD_DECL: + case TYPE_DECL: + case CONST_DECL: + { + memcpy ((char *) olddecl + sizeof (struct tree_decl_common), + (char *) newdecl + sizeof (struct tree_decl_common), + size - sizeof (struct tree_decl_common) + + TREE_CODE_LENGTH (TREE_CODE (newdecl)) * sizeof (char *)); + } + break; + default: + memcpy ((char *) olddecl + sizeof (struct tree_decl_common), + (char *) newdecl + sizeof (struct tree_decl_common), + sizeof (struct tree_decl_non_common) - sizeof (struct tree_decl_common) + + TREE_CODE_LENGTH (TREE_CODE (newdecl)) * sizeof (char *)); + break; + } + } + DECL_UID (olddecl) = olddecl_uid; + if (olddecl_friend) + DECL_FRIEND_P (olddecl) = 1; + if (hidden_friend) + { + DECL_ANTICIPATED (olddecl) = 1; + DECL_HIDDEN_FRIEND_P (olddecl) = 1; + } + + /* NEWDECL contains the merged attribute lists. + Update OLDDECL to be the same. */ + 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); + + /* The NEWDECL will no longer be needed. Because every out-of-class + declaration of a member results in a call to duplicate_decls, + freeing these nodes represents in a significant savings. */ + ggc_free (newdecl); + + return olddecl; +} + +/* Return zero if the declaration NEWDECL is valid + when the declaration OLDDECL (assumed to be for the same name) + has already been seen. + Otherwise return an error message format string with a %s + where the identifier should go. */ + +static const char * +redeclaration_error_message (tree newdecl, tree olddecl) +{ + if (TREE_CODE (newdecl) == TYPE_DECL) + { + /* Because C++ can put things into name space for free, + constructs like "typedef struct foo { ... } foo" + would look like an erroneous redeclaration. */ + if (same_type_p (TREE_TYPE (newdecl), TREE_TYPE (olddecl))) + return NULL; + else + return G_("redefinition of %q#D"); + } + else if (TREE_CODE (newdecl) == FUNCTION_DECL) + { + /* If this is a pure function, its olddecl will actually be + the original initialization to `0' (which we force to call + abort()). Don't complain about redefinition in this case. */ + if (DECL_LANG_SPECIFIC (olddecl) && DECL_PURE_VIRTUAL_P (olddecl) + && DECL_INITIAL (olddecl) == NULL_TREE) + return NULL; + + /* If both functions come from different namespaces, this is not + a redeclaration - this is a conflict with a used function. */ + if (DECL_NAMESPACE_SCOPE_P (olddecl) + && DECL_CONTEXT (olddecl) != DECL_CONTEXT (newdecl) + && ! decls_match (olddecl, newdecl)) + return G_("%qD conflicts with used function"); + + /* We'll complain about linkage mismatches in + warn_extern_redeclared_static. */ + + /* Defining the same name twice is no good. */ + if (DECL_INITIAL (olddecl) != NULL_TREE + && DECL_INITIAL (newdecl) != NULL_TREE) + { + if (DECL_NAME (olddecl) == NULL_TREE) + return G_("%q#D not declared in class"); + else if (!GNU_INLINE_P (olddecl) + || GNU_INLINE_P (newdecl)) + return G_("redefinition of %q#D"); + } + + if (DECL_DECLARED_INLINE_P (olddecl) && DECL_DECLARED_INLINE_P (newdecl)) + { + bool olda = GNU_INLINE_P (olddecl); + bool newa = GNU_INLINE_P (newdecl); + + if (olda != newa) + { + if (newa) + return G_("%q+D redeclared inline with " + "% attribute"); + else + return G_("%q+D redeclared inline without " + "% attribute"); + } + } + + return NULL; + } + 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 G_("redefinition of %q#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) + && (!GNU_INLINE_P (ot) || GNU_INLINE_P (nt))) + return G_("redefinition of %q#D"); + + if (DECL_DECLARED_INLINE_P (ot) && DECL_DECLARED_INLINE_P (nt)) + { + bool olda = GNU_INLINE_P (ot); + bool newa = GNU_INLINE_P (nt); + + if (olda != newa) + { + if (newa) + return G_("%q+D redeclared inline with " + "% attribute"); + else + return G_("%q+D redeclared inline without " + "% attribute"); + } + } + + /* Core issue #226 (C++0x): + + If a friend function template declaration specifies a + default template-argument, that declaration shall be a + definition and shall be the only declaration of the + function template in the translation unit. */ + if ((cxx_dialect != cxx98) + && TREE_CODE (ot) == FUNCTION_DECL && DECL_FRIEND_P (ot) + && !check_default_tmpl_args (nt, DECL_TEMPLATE_PARMS (newdecl), + /*is_primary=*/1, /*is_partial=*/0, + /*is_friend_decl=*/2)) + return G_("redeclaration of friend %q#D " + "may not have default template arguments"); + + return NULL; + } + else if (TREE_CODE (newdecl) == VAR_DECL + && DECL_THREAD_LOCAL_P (newdecl) != DECL_THREAD_LOCAL_P (olddecl) + && (! DECL_LANG_SPECIFIC (olddecl) + || ! CP_DECL_THREADPRIVATE_P (olddecl) + || DECL_THREAD_LOCAL_P (newdecl))) + { + /* Only variables can be thread-local, and all declarations must + agree on this property. */ + if (DECL_THREAD_LOCAL_P (newdecl)) + return G_("thread-local declaration of %q#D follows " + "non-thread-local declaration"); + else + return G_("non-thread-local declaration of %q#D follows " + "thread-local declaration"); + } + else if (toplevel_bindings_p () || DECL_NAMESPACE_SCOPE_P (newdecl)) + { + /* The objects have been declared at namespace scope. If either + is a member of an anonymous union, then this is an invalid + redeclaration. For example: + + int i; + union { int i; }; + + is invalid. */ + if ((TREE_CODE (newdecl) == VAR_DECL && DECL_ANON_UNION_VAR_P (newdecl)) + || (TREE_CODE (olddecl) == VAR_DECL && DECL_ANON_UNION_VAR_P (olddecl))) + return G_("redeclaration of %q#D"); + /* If at least one declaration is a reference, there is no + conflict. For example: + + int i = 3; + extern int i; + + is valid. */ + if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl)) + return NULL; + /* Reject two definitions. */ + return G_("redefinition of %q#D"); + } + else + { + /* Objects declared with block scope: */ + /* Reject two definitions, and reject a definition + together with an external reference. */ + if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl))) + return G_("redeclaration of %q#D"); + return NULL; + } +} + +/* Hash and equality functions for the named_label table. */ + +static hashval_t +named_label_entry_hash (const void *data) +{ + const struct named_label_entry *ent = (const struct named_label_entry *) data; + return DECL_UID (ent->label_decl); +} + +static int +named_label_entry_eq (const void *a, const void *b) +{ + const struct named_label_entry *ent_a = (const struct named_label_entry *) a; + const struct named_label_entry *ent_b = (const struct named_label_entry *) b; + return ent_a->label_decl == ent_b->label_decl; +} + +/* Create a new label, named ID. */ + +static tree +make_label_decl (tree id, int local_p) +{ + struct named_label_entry *ent; + void **slot; + tree decl; + + decl = build_decl (input_location, LABEL_DECL, id, void_type_node); + + DECL_CONTEXT (decl) = current_function_decl; + DECL_MODE (decl) = VOIDmode; + C_DECLARED_LABEL_FLAG (decl) = local_p; + + /* 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); + + /* Create the label htab for the function on demand. */ + if (!named_labels) + named_labels = htab_create_ggc (13, named_label_entry_hash, + named_label_entry_eq, NULL); + + /* 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_named_label_entry (); + ent->label_decl = decl; + + slot = htab_find_slot (named_labels, ent, INSERT); + gcc_assert (*slot == NULL); + *slot = ent; + + return decl; +} + +/* Look for a label named ID in the current function. If one cannot + be found, create one. (We keep track of used, but undefined, + labels, and complain about them at the end of a function.) */ + +tree +lookup_label (tree id) +{ + tree decl; + + timevar_push (TV_NAME_LOOKUP); + /* You can't use labels at global scope. */ + if (current_function_decl == NULL_TREE) + { + error ("label %qE referenced outside of any function", id); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE); + } + + /* See if we've already got this label. */ + decl = IDENTIFIER_LABEL_VALUE (id); + if (decl != NULL_TREE && DECL_CONTEXT (decl) == current_function_decl) + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); + + decl = make_label_decl (id, /*local_p=*/0); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); +} + +/* Declare a local label named ID. */ + +tree +declare_local_label (tree id) +{ + tree decl; + cp_label_binding *bind; + + /* Add a new entry to the SHADOWED_LABELS list so that when we leave + this scope we can restore the old value of IDENTIFIER_TYPE_VALUE. */ + bind = VEC_safe_push (cp_label_binding, gc, + current_binding_level->shadowed_labels, NULL); + bind->prev_value = IDENTIFIER_LABEL_VALUE (id); + + decl = make_label_decl (id, /*local_p=*/1); + bind->label = decl; + + return decl; +} + +/* Returns nonzero if it is ill-formed to jump past the declaration of + DECL. Returns 2 if it's also a real problem. */ + +static int +decl_jump_unsafe (tree decl) +{ + /* [stmt.dcl]/3: A program that jumps from a point where a local variable + with automatic storage duration is not in scope to a point where it is + in scope is ill-formed unless the variable has scalar type, class type + with a trivial default constructor and a trivial destructor, a + cv-qualified version of one of these types, or an array of one of the + preceding types and is declared without an initializer (8.5). */ + tree type = TREE_TYPE (decl); + + if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl) + || type == error_mark_node) + return 0; + + type = strip_array_types (type); + + if (type_has_nontrivial_default_init (TREE_TYPE (decl)) + || DECL_NONTRIVIALLY_INITIALIZED_P (decl)) + return 2; + + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) + return 1; + + return 0; +} + +/* A subroutine of check_previous_goto_1 to identify a branch to the user. */ + +static void +identify_goto (tree decl, const location_t *locus) +{ + if (decl) + permerror (input_location, "jump to label %qD", decl); + else + permerror (input_location, "jump to case label"); + if (locus) + permerror (*locus, " from here"); +} + +/* Check that a single previously seen jump to a newly defined label + is OK. DECL is the LABEL_DECL or 0; LEVEL is the binding_level for + the jump context; NAMES are the names in scope in LEVEL at the jump + context; LOCUS is the source position of the jump or 0. Returns + true if all is well. */ + +static bool +check_previous_goto_1 (tree decl, struct cp_binding_level* level, tree names, + bool exited_omp, const location_t *locus) +{ + struct cp_binding_level *b; + bool identified = false, saw_eh = false, saw_omp = false; + + if (exited_omp) + { + identify_goto (decl, locus); + error (" exits OpenMP structured block"); + identified = saw_omp = true; + } + + for (b = current_binding_level; b ; b = b->level_chain) + { + tree new_decls, old_decls = (b == level ? names : NULL_TREE); + + for (new_decls = b->names; new_decls != old_decls; + new_decls = DECL_CHAIN (new_decls)) + { + int problem = decl_jump_unsafe (new_decls); + if (! problem) + continue; + + if (!identified) + { + identify_goto (decl, locus); + identified = true; + } + if (problem > 1) + error (" crosses initialization of %q+#D", new_decls); + else + permerror (input_location, " enters scope of %q+#D which has " + "non-trivial destructor", new_decls); + } + + if (b == level) + break; + if ((b->kind == sk_try || b->kind == sk_catch) && !saw_eh) + { + if (!identified) + { + identify_goto (decl, locus); + identified = true; + } + if (b->kind == sk_try) + error (" enters try block"); + else + error (" enters catch block"); + saw_eh = true; + } + if (b->kind == sk_omp && !saw_omp) + { + if (!identified) + { + identify_goto (decl, locus); + identified = true; + } + error (" enters OpenMP structured block"); + saw_omp = true; + } + } + + return !identified; +} + +static void +check_previous_goto (tree decl, struct named_label_use_entry *use) +{ + check_previous_goto_1 (decl, use->binding_level, + use->names_in_scope, use->in_omp_scope, + &use->o_goto_locus); +} + +static bool +check_switch_goto (struct cp_binding_level* level) +{ + return check_previous_goto_1 (NULL_TREE, level, level->names, false, NULL); +} + +/* Check that a new jump to a label DECL is OK. Called by + finish_goto_stmt. */ + +void +check_goto (tree decl) +{ + struct named_label_entry *ent, dummy; + bool saw_catch = false, identified = false; + tree bad; + unsigned ix; + + /* We can't know where a computed goto is jumping. + So we assume that it's OK. */ + if (TREE_CODE (decl) != LABEL_DECL) + return; + + /* We didn't record any information about this label when we created it, + and there's not much point since it's trivial to analyze as a return. */ + if (decl == cdtor_label) + return; + + dummy.label_decl = decl; + ent = (struct named_label_entry *) htab_find (named_labels, &dummy); + gcc_assert (ent != NULL); + + /* If the label hasn't been defined yet, defer checking. */ + if (! DECL_INITIAL (decl)) + { + struct named_label_use_entry *new_use; + + /* Don't bother creating another use if the last goto had the + same data, and will therefore create the same set of errors. */ + if (ent->uses + && ent->uses->names_in_scope == current_binding_level->names) + return; + + new_use = ggc_alloc_named_label_use_entry (); + new_use->binding_level = current_binding_level; + new_use->names_in_scope = current_binding_level->names; + new_use->o_goto_locus = input_location; + new_use->in_omp_scope = false; + + new_use->next = ent->uses; + ent->uses = new_use; + return; + } + + if (ent->in_try_scope || ent->in_catch_scope + || ent->in_omp_scope || !VEC_empty (tree, ent->bad_decls)) + { + permerror (input_location, "jump to label %q+D", decl); + permerror (input_location, " from here"); + identified = true; + } + + FOR_EACH_VEC_ELT (tree, ent->bad_decls, ix, bad) + { + int u = decl_jump_unsafe (bad); + + if (u > 1 && DECL_ARTIFICIAL (bad)) + { + /* Can't skip init of __exception_info. */ + error_at (DECL_SOURCE_LOCATION (bad), " enters catch block"); + saw_catch = true; + } + else if (u > 1) + error (" skips initialization of %q+#D", bad); + else + permerror (input_location, " enters scope of %q+#D which has " + "non-trivial destructor", bad); + } + + if (ent->in_try_scope) + error (" enters try block"); + else if (ent->in_catch_scope && !saw_catch) + error (" enters catch block"); + + if (ent->in_omp_scope) + error (" enters OpenMP structured block"); + else if (flag_openmp) + { + struct cp_binding_level *b; + for (b = current_binding_level; b ; b = b->level_chain) + { + if (b == ent->binding_level) + break; + if (b->kind == sk_omp) + { + if (!identified) + { + permerror (input_location, "jump to label %q+D", decl); + permerror (input_location, " from here"); + identified = true; + } + error (" exits OpenMP structured block"); + break; + } + } + } +} + +/* Check that a return is ok wrt OpenMP structured blocks. + Called by finish_return_stmt. Returns true if all is well. */ + +bool +check_omp_return (void) +{ + struct cp_binding_level *b; + for (b = current_binding_level; b ; b = b->level_chain) + if (b->kind == sk_omp) + { + error ("invalid exit from OpenMP structured block"); + return false; + } + else if (b->kind == sk_function_parms) + break; + return true; +} + +/* Define a label, specifying the location in the source file. + Return the LABEL_DECL node for the label. */ + +tree +define_label (location_t location, tree name) +{ + struct named_label_entry *ent, dummy; + struct cp_binding_level *p; + tree decl; + + timevar_push (TV_NAME_LOOKUP); + + decl = lookup_label (name); + + dummy.label_decl = decl; + ent = (struct named_label_entry *) htab_find (named_labels, &dummy); + gcc_assert (ent != NULL); + + /* 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")) + permerror (input_location, "label named wchar_t"); + + if (DECL_INITIAL (decl) != NULL_TREE) + { + error ("duplicate label %qD", decl); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + } + else + { + struct named_label_use_entry *use; + + /* Mark label as having been defined. */ + DECL_INITIAL (decl) = error_mark_node; + /* Say where in the source. */ + DECL_SOURCE_LOCATION (decl) = location; + + ent->binding_level = current_binding_level; + ent->names_in_scope = current_binding_level->names; + + for (use = ent->uses; use ; use = use->next) + check_previous_goto (decl, use); + ent->uses = NULL; + } + + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl); +} + +struct cp_switch +{ + struct cp_binding_level *level; + struct cp_switch *next; + /* The SWITCH_STMT being built. */ + tree switch_stmt; + /* A splay-tree mapping the low element of a case range to the high + element, or NULL_TREE if there is no high element. Used to + determine whether or not a new case label duplicates an old case + label. We need a tree, rather than simply a hash table, because + of the GNU case range extension. */ + splay_tree cases; +}; + +/* A stack of the currently active switch statements. The innermost + switch statement is on the top of the stack. There is no need to + mark the stack for garbage collection because it is only active + during the processing of the body of a function, and we never + collect at that point. */ + +static struct cp_switch *switch_stack; + +/* Called right after a switch-statement condition is parsed. + SWITCH_STMT is the switch statement being parsed. */ + +void +push_switch (tree switch_stmt) +{ + struct cp_switch *p = XNEW (struct cp_switch); + p->level = current_binding_level; + p->next = switch_stack; + p->switch_stmt = switch_stmt; + p->cases = splay_tree_new (case_compare, NULL, NULL); + switch_stack = p; +} + +void +pop_switch (void) +{ + struct cp_switch *cs = switch_stack; + location_t switch_location; + + /* Emit warnings as needed. */ + switch_location = EXPR_LOC_OR_HERE (cs->switch_stmt); + if (!processing_template_decl) + c_do_switch_warnings (cs->cases, switch_location, + SWITCH_STMT_TYPE (cs->switch_stmt), + SWITCH_STMT_COND (cs->switch_stmt)); + + splay_tree_delete (cs->cases); + switch_stack = switch_stack->next; + free (cs); +} + +/* Convert a case constant VALUE in a switch to the type TYPE of the switch + condition. Note that if TYPE and VALUE are already integral we don't + really do the conversion because the language-independent + warning/optimization code will work better that way. */ + +static tree +case_conversion (tree type, tree value) +{ + if (value == NULL_TREE) + return value; + + if (cxx_dialect >= cxx0x + && (SCOPED_ENUM_P (type) + || !INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (value)))) + { + if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type)) + type = type_promotes_to (type); + value = perform_implicit_conversion (type, value, tf_warning_or_error); + } + return cxx_constant_value (value); +} + +/* Note that we've seen a definition of a case label, and complain if this + is a bad place for one. */ + +tree +finish_case_label (location_t loc, tree low_value, tree high_value) +{ + tree cond, r; + struct cp_binding_level *p; + tree type; + + if (processing_template_decl) + { + tree label; + + /* For templates, just add the case label; we'll do semantic + analysis at instantiation-time. */ + label = build_decl (loc, LABEL_DECL, NULL_TREE, NULL_TREE); + return add_stmt (build_case_label (loc, low_value, high_value, label)); + } + + /* Find the condition on which this switch statement depends. */ + cond = SWITCH_STMT_COND (switch_stack->switch_stmt); + if (cond && TREE_CODE (cond) == TREE_LIST) + cond = TREE_VALUE (cond); + + if (!check_switch_goto (switch_stack->level)) + return error_mark_node; + + type = SWITCH_STMT_TYPE (switch_stack->switch_stmt); + + low_value = case_conversion (type, low_value); + high_value = case_conversion (type, high_value); + + r = c_add_case_label (loc, switch_stack->cases, cond, type, + low_value, high_value); + + /* 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; + const_tree const t = (const_tree) k; + + hash = (htab_hash_pointer (TYPE_CONTEXT (t)) + ^ htab_hash_pointer (DECL_NAME (TYPE_NAME (t)))); + + return hash; +} + +typedef struct typename_info { + tree scope; + tree name; + tree template_id; + bool enum_p; + bool class_p; +} typename_info; + +/* Compare two TYPENAME_TYPEs. K1 is really of type `tree', K2 is + really of type `typename_info*' */ + +static int +typename_compare (const void * k1, const void * k2) +{ + const_tree const t1 = (const_tree) k1; + const typename_info *const t2 = (const typename_info *) k2; + + return (DECL_NAME (TYPE_NAME (t1)) == t2->name + && TYPE_CONTEXT (t1) == t2->scope + && TYPENAME_TYPE_FULLNAME (t1) == t2->template_id + && TYPENAME_IS_ENUM_P (t1) == t2->enum_p + && TYPENAME_IS_CLASS_P (t1) == t2->class_p); +} + +/* Build a TYPENAME_TYPE. If the type is `typename T::t', CONTEXT is + the type of `T', NAME is the IDENTIFIER_NODE for `t'. + + Returns the new TYPENAME_TYPE. */ + +static GTY ((param_is (union tree_node))) htab_t typename_htab; + +static tree +build_typename_type (tree context, tree name, tree fullname, + enum tag_types tag_type) +{ + tree t; + tree d; + typename_info ti; + void **e; + hashval_t hash; + + if (typename_htab == NULL) + typename_htab = htab_create_ggc (61, &typename_hash, + &typename_compare, NULL); + + ti.scope = FROB_CONTEXT (context); + ti.name = name; + ti.template_id = fullname; + ti.enum_p = tag_type == enum_type; + ti.class_p = (tag_type == class_type + || tag_type == record_type + || tag_type == union_type); + hash = (htab_hash_pointer (ti.scope) + ^ htab_hash_pointer (ti.name)); + + /* See if we already have this type. */ + e = htab_find_slot_with_hash (typename_htab, &ti, hash, INSERT); + if (*e) + t = (tree) *e; + else + { + /* Build the TYPENAME_TYPE. */ + t = cxx_make_type (TYPENAME_TYPE); + TYPE_CONTEXT (t) = ti.scope; + TYPENAME_TYPE_FULLNAME (t) = ti.template_id; + TYPENAME_IS_ENUM_P (t) = ti.enum_p; + TYPENAME_IS_CLASS_P (t) = ti.class_p; + + /* Build the corresponding TYPE_DECL. */ + d = build_decl (input_location, TYPE_DECL, name, t); + TYPE_NAME (TREE_TYPE (d)) = d; + TYPE_STUB_DECL (TREE_TYPE (d)) = d; + DECL_CONTEXT (d) = FROB_CONTEXT (context); + DECL_ARTIFICIAL (d) = 1; + + /* Store it in the hash table. */ + *e = t; + + /* TYPENAME_TYPEs must always be compared structurally, because + they may or may not resolve down to another type depending on + the currently open classes. */ + SET_TYPE_STRUCTURAL_EQUALITY (t); + } + + return t; +} + +/* Resolve `typename CONTEXT::NAME'. TAG_TYPE indicates the tag + provided to name the type. Returns an appropriate type, unless an + error occurs, in which case error_mark_node is returned. If we + locate a non-artificial TYPE_DECL and TF_KEEP_TYPE_DECL is set, we + return that, rather than the _TYPE it corresponds to, in other + cases we look through the type decl. If TF_ERROR is set, complain + about errors, otherwise be quiet. */ + +tree +make_typename_type (tree context, tree name, enum tag_types tag_type, + tsubst_flags_t complain) +{ + tree fullname; + tree t; + bool want_template; + + 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) + && (CLASSTYPE_IS_TEMPLATE (name) + || CLASSTYPE_USE_TEMPLATE (name)))) + name = TYPE_IDENTIFIER (name); + else + /* Create a TEMPLATE_ID_EXPR for the type. */ + name = build_nt (TEMPLATE_ID_EXPR, + CLASSTYPE_TI_TEMPLATE (name), + CLASSTYPE_TI_ARGS (name)); + } + else if (TREE_CODE (name) == TYPE_DECL) + name = DECL_NAME (name); + + fullname = name; + + if (TREE_CODE (name) == TEMPLATE_ID_EXPR) + { + name = TREE_OPERAND (name, 0); + if (TREE_CODE (name) == TEMPLATE_DECL) + name = TREE_OPERAND (fullname, 0) = DECL_NAME (name); + else if (TREE_CODE (name) == OVERLOAD) + { + error ("%qD is not a type", name); + return error_mark_node; + } + } + if (TREE_CODE (name) == TEMPLATE_DECL) + { + error ("%qD used without template parameters", name); + return error_mark_node; + } + gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); + gcc_assert (TYPE_P (context)); + + if (!MAYBE_CLASS_TYPE_P (context)) + { + if (complain & tf_error) + error ("%q#T is not a class", context); + return error_mark_node; + } + + /* When the CONTEXT is a dependent type, NAME could refer to a + dependent base class of CONTEXT. But look inside it anyway + if CONTEXT is a currently open scope, in case it refers to a + member of the current instantiation or a non-dependent base; + lookup will stop when we hit a dependent base. */ + if (!dependent_scope_p (context)) + /* We should only set WANT_TYPE when we're a nested typename type. + Then we can give better diagnostics if we find a non-type. */ + t = lookup_field (context, name, 2, /*want_type=*/true); + else + t = NULL_TREE; + + if ((!t || TREE_CODE (t) == TREE_LIST) && dependent_type_p (context)) + return build_typename_type (context, name, fullname, tag_type); + + want_template = TREE_CODE (fullname) == TEMPLATE_ID_EXPR; + + if (!t) + { + if (complain & tf_error) + error (want_template ? "no class template named %q#T in %q#T" + : "no type named %q#T in %q#T", name, context); + return error_mark_node; + } + + /* Pull out the template from an injected-class-name (or multiple). */ + if (want_template) + t = maybe_get_template_decl_from_type_decl (t); + + if (TREE_CODE (t) == TREE_LIST) + { + if (complain & tf_error) + { + error ("lookup of %qT in %qT is ambiguous", name, context); + print_candidates (t); + } + return error_mark_node; + } + + if (want_template && !DECL_CLASS_TEMPLATE_P (t)) + { + if (complain & tf_error) + error ("% names %q#T, which is not a class template", + context, name, t); + return error_mark_node; + } + if (!want_template && TREE_CODE (t) != TYPE_DECL) + { + if (complain & tf_error) + error ("% names %q#T, which is not a type", + context, name, t); + return error_mark_node; + } + + if (complain & tf_error) + perform_or_defer_access_check (TYPE_BINFO (context), t, t); + + /* If we are currently parsing a template and if T is a typedef accessed + through CONTEXT then we need to remember and check access of T at + template instantiation time. */ + add_typedef_to_current_template_for_access_check (t, context, input_location); + + if (want_template) + return lookup_template_class (t, TREE_OPERAND (fullname, 1), + NULL_TREE, context, + /*entering_scope=*/0, + tf_warning_or_error | tf_user); + + if (DECL_ARTIFICIAL (t) || !(complain & tf_keep_type_decl)) + t = TREE_TYPE (t); + + return t; +} + +/* Resolve `CONTEXT::template NAME'. Returns a TEMPLATE_DECL if the name + can be resolved or an UNBOUND_CLASS_TEMPLATE, unless an error occurs, + in which case error_mark_node is returned. + + If PARM_LIST is non-NULL, also make sure that the template parameter + list of TEMPLATE_DECL matches. + + If COMPLAIN zero, don't complain about any errors that occur. */ + +tree +make_unbound_class_template (tree context, tree name, tree parm_list, + tsubst_flags_t complain) +{ + tree t; + tree d; + + if (TYPE_P (name)) + name = TYPE_IDENTIFIER (name); + else if (DECL_P (name)) + name = DECL_NAME (name); + gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); + + if (!dependent_type_p (context) + || currently_open_class (context)) + { + tree tmpl = NULL_TREE; + + if (MAYBE_CLASS_TYPE_P (context)) + tmpl = lookup_field (context, name, 0, false); + + if (tmpl && TREE_CODE (tmpl) == TYPE_DECL) + tmpl = maybe_get_template_decl_from_type_decl (tmpl); + + if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl)) + { + if (complain & tf_error) + error ("no class template named %q#T in %q#T", name, context); + return error_mark_node; + } + + if (parm_list + && !comp_template_parms (DECL_TEMPLATE_PARMS (tmpl), parm_list)) + { + if (complain & tf_error) + { + error ("template parameters do not match template"); + error ("%q+D declared here", tmpl); + } + return error_mark_node; + } + + if (complain & tf_error) + perform_or_defer_access_check (TYPE_BINFO (context), tmpl, tmpl); + + return tmpl; + } + + /* Build the UNBOUND_CLASS_TEMPLATE. */ + t = cxx_make_type (UNBOUND_CLASS_TEMPLATE); + TYPE_CONTEXT (t) = FROB_CONTEXT (context); + TREE_TYPE (t) = NULL_TREE; + SET_TYPE_STRUCTURAL_EQUALITY (t); + + /* Build the corresponding TEMPLATE_DECL. */ + d = build_decl (input_location, TEMPLATE_DECL, name, t); + TYPE_NAME (TREE_TYPE (d)) = d; + TYPE_STUB_DECL (TREE_TYPE (d)) = d; + DECL_CONTEXT (d) = FROB_CONTEXT (context); + DECL_ARTIFICIAL (d) = 1; + DECL_TEMPLATE_PARMS (d) = parm_list; + + return t; +} + + + +/* 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; + + if ((int) rid_index < (int) RID_MAX) + rname = ridpointers[(int) rid_index]; + 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 (BUILTINS_LOCATION, TYPE_DECL, tname, type); + DECL_ARTIFICIAL (tdecl) = 1; + SET_IDENTIFIER_GLOBAL_VALUE (tname, tdecl); + } + if (rname) + { + if (!tdecl) + { + tdecl = build_decl (BUILTINS_LOCATION, TYPE_DECL, rname, type); + DECL_ARTIFICIAL (tdecl) = 1; + } + SET_IDENTIFIER_GLOBAL_VALUE (rname, tdecl); + } + + if (!TYPE_NAME (type)) + TYPE_NAME (type) = tdecl; + + if (tdecl) + debug_hooks->type_decl (tdecl, 0); +} + +/* Record one of the standard Java types. + * Declare it as having the given NAME. + * If SIZE > 0, it is the size of one of the integral types; + * 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) + { + type = build_nonstandard_integer_type (size, 0); + type = build_distinct_type_copy (type); + } + else if (size > -32) + { + tree stype; + /* "__java_char" or ""__java_boolean". */ + type = build_nonstandard_integer_type (-size, 1); + type = build_distinct_type_copy (type); + /* Get the signed type cached and attached to the unsigned type, + so it doesn't get garbage-collected at "random" times, + causing potential codegen differences out of different UIDs + and different alias set numbers. */ + stype = build_nonstandard_integer_type (-size, 0); + stype = build_distinct_type_copy (stype); + TREE_CHAIN (type) = stype; + /*if (size == -1) TREE_SET_CODE (type, BOOLEAN_TYPE);*/ + } + else + { /* "__java_float" or ""__java_double". */ + type = make_node (REAL_TYPE); + TYPE_PRECISION (type) = - size; + layout_type (type); + } + record_builtin_type (RID_MAX, name, type); + decl = TYPE_NAME (type); + + /* Suppress generate debug symbol entries for these types, + since for normal C++ they are just clutter. + However, push_lang_context undoes this if extern "Java" is seen. */ + DECL_IGNORED_P (decl) = 1; + + TYPE_FOR_JAVA (type) = 1; + return type; +} + +/* 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 (UNKNOWN_LOCATION, + TYPE_DECL, get_identifier (name), type)); + /* Make sure the "unknown type" typedecl gets ignored for debug info. */ + DECL_IGNORED_P (decl) = 1; + TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; + TYPE_SIZE (type) = TYPE_SIZE (void_type_node); + TYPE_ALIGN (type) = 1; + TYPE_USER_ALIGN (type) = 0; + SET_TYPE_MODE (type, TYPE_MODE (void_type_node)); +} + +/* A string for which we should create an IDENTIFIER_NODE at + startup. */ + +typedef struct predefined_identifier +{ + /* The name of the identifier. */ + const char *const name; + /* The place where the IDENTIFIER_NODE should be stored. */ + tree *const node; + /* Nonzero if this is the name of a constructor or destructor. */ + const int ctor_or_dtor_p; +} predefined_identifier; + +/* Create all the predefined identifiers. */ + +static void +initialize_predefined_identifiers (void) +{ + const predefined_identifier *pid; + + /* A table of identifiers to create at startup. */ + static const predefined_identifier predefined_identifiers[] = { + { "C++", &lang_name_cplusplus, 0 }, + { "C", &lang_name_c, 0 }, + { "Java", &lang_name_java, 0 }, + /* Some of these names have a trailing space so that it is + impossible for them to conflict with names written by users. */ + { "__ct ", &ctor_identifier, 1 }, + { "__base_ctor ", &base_ctor_identifier, 1 }, + { "__comp_ctor ", &complete_ctor_identifier, 1 }, + { "__dt ", &dtor_identifier, 1 }, + { "__comp_dtor ", &complete_dtor_identifier, 1 }, + { "__base_dtor ", &base_dtor_identifier, 1 }, + { "__deleting_dtor ", &deleting_dtor_identifier, 1 }, + { IN_CHARGE_NAME, &in_charge_identifier, 0 }, + { "nelts", &nelts_identifier, 0 }, + { THIS_NAME, &this_identifier, 0 }, + { VTABLE_DELTA_NAME, &delta_identifier, 0 }, + { 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 } + }; + + for (pid = predefined_identifiers; pid->name; ++pid) + { + *pid->node = get_identifier (pid->name); + if (pid->ctor_or_dtor_p) + IDENTIFIER_CTOR_OR_DTOR_P (*pid->node) = 1; + } +} + +/* Create the predefined scalar types of C, + and some nodes representing standard constants (0, 1, (void *)0). + Initialize the global binding level. + Make definitions for built-in primitive functions. */ + +void +cxx_init_decl_processing (void) +{ + tree void_ftype; + tree void_ftype_ptr; + + build_common_tree_nodes (flag_signed_char); + + /* Create all the identifiers we need. */ + initialize_predefined_identifiers (); + + /* Create the global variables. */ + push_to_top_level (); + + current_function_decl = NULL_TREE; + current_binding_level = NULL; + /* Enter the global namespace. */ + gcc_assert (global_namespace == NULL_TREE); + global_namespace = build_lang_decl (NAMESPACE_DECL, global_scope_name, + void_type_node); + DECL_CONTEXT (global_namespace) = build_translation_unit_decl (NULL_TREE); + TREE_PUBLIC (global_namespace) = 1; + begin_scope (sk_namespace, global_namespace); + + current_lang_name = NULL_TREE; + + if (flag_visibility_ms_compat) + default_visibility = VISIBILITY_HIDDEN; + + /* Initially, C. */ + current_lang_name = lang_name_c; + + /* Create the `std' namespace. */ + push_namespace (std_identifier); + std_node = current_namespace; + pop_namespace (); + + c_common_nodes_and_builtins (); + + java_byte_type_node = record_builtin_java_type ("__java_byte", 8); + java_short_type_node = record_builtin_java_type ("__java_short", 16); + java_int_type_node = record_builtin_java_type ("__java_int", 32); + java_long_type_node = record_builtin_java_type ("__java_long", 64); + java_float_type_node = record_builtin_java_type ("__java_float", -32); + java_double_type_node = record_builtin_java_type ("__java_double", -64); + java_char_type_node = record_builtin_java_type ("__java_char", -16); + java_boolean_type_node = record_builtin_java_type ("__java_boolean", -1); + + integer_two_node = build_int_cst (NULL_TREE, 2); + + 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); + noexcept_true_spec = build_tree_list (boolean_true_node, NULL_TREE); + noexcept_false_spec = build_tree_list (boolean_false_node, NULL_TREE); + +#if 0 + record_builtin_type (RID_MAX, NULL, string_type_node); +#endif + + delta_type_node = ptrdiff_type_node; + vtable_index_type = ptrdiff_type_node; + + vtt_parm_type = build_pointer_type (const_ptr_type_node); + void_ftype = build_function_type_list (void_type_node, NULL_TREE); + void_ftype_ptr = build_function_type_list (void_type_node, + ptr_type_node, NULL_TREE); + void_ftype_ptr + = build_exception_variant (void_ftype_ptr, empty_except_spec); + + /* C++ extensions */ + + unknown_type_node = make_node (LANG_TYPE); + record_unknown_type (unknown_type_node, "unknown type"); + + /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node. */ + TREE_TYPE (unknown_type_node) = unknown_type_node; + + /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same + result. */ + TYPE_POINTER_TO (unknown_type_node) = unknown_type_node; + TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node; + + init_list_type_node = make_node (LANG_TYPE); + record_unknown_type (init_list_type_node, "init list"); + + { + /* Make sure we get a unique function type, so we can give + its pointer type a name. (This wins for gdb.) */ + tree vfunc_type = make_node (FUNCTION_TYPE); + TREE_TYPE (vfunc_type) = integer_type_node; + TYPE_ARG_TYPES (vfunc_type) = NULL_TREE; + layout_type (vfunc_type); + + vtable_entry_type = build_pointer_type (vfunc_type); + } + record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type); + + vtbl_type_node + = build_cplus_array_type (vtable_entry_type, NULL_TREE); + layout_type (vtbl_type_node); + vtbl_type_node = cp_build_qualified_type (vtbl_type_node, TYPE_QUAL_CONST); + record_builtin_type (RID_MAX, NULL, vtbl_type_node); + vtbl_ptr_type_node = build_pointer_type (vtable_entry_type); + layout_type (vtbl_ptr_type_node); + record_builtin_type (RID_MAX, NULL, vtbl_ptr_type_node); + + push_namespace (get_identifier ("__cxxabiv1")); + abi_node = current_namespace; + pop_namespace (); + + global_type_node = make_node (LANG_TYPE); + record_unknown_type (global_type_node, "global type"); + + /* Now, C++. */ + current_lang_name = lang_name_cplusplus; + + { + tree newtype, deltype; + tree ptr_ftype_sizetype; + tree new_eh_spec; + + ptr_ftype_sizetype + = build_function_type_list (ptr_type_node, size_type_node, NULL_TREE); + if (cxx_dialect == cxx98) + { + tree bad_alloc_id; + tree bad_alloc_type_node; + tree bad_alloc_decl; + + push_namespace (std_identifier); + bad_alloc_id = get_identifier ("bad_alloc"); + bad_alloc_type_node = make_class_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; + pop_namespace (); + + new_eh_spec + = add_exception_specifier (NULL_TREE, bad_alloc_type_node, -1); + } + else + new_eh_spec = noexcept_false_spec; + + newtype = build_exception_variant (ptr_ftype_sizetype, new_eh_spec); + deltype = build_exception_variant (void_ftype_ptr, empty_except_spec); + push_cp_library_fn (NEW_EXPR, newtype); + push_cp_library_fn (VEC_NEW_EXPR, newtype); + global_delete_fndecl = push_cp_library_fn (DELETE_EXPR, deltype); + push_cp_library_fn (VEC_DELETE_EXPR, deltype); + + nullptr_type_node = make_node (NULLPTR_TYPE); + TYPE_SIZE (nullptr_type_node) = bitsize_int (GET_MODE_BITSIZE (ptr_mode)); + TYPE_SIZE_UNIT (nullptr_type_node) = size_int (GET_MODE_SIZE (ptr_mode)); + TYPE_UNSIGNED (nullptr_type_node) = 1; + TYPE_PRECISION (nullptr_type_node) = GET_MODE_BITSIZE (ptr_mode); + SET_TYPE_MODE (nullptr_type_node, ptr_mode); + record_builtin_type (RID_MAX, "decltype(nullptr)", nullptr_type_node); + nullptr_node = build_int_cst (nullptr_type_node, 0); + } + + abort_fndecl + = build_library_fn_ptr ("__cxa_pure_virtual", void_ftype); + + /* Perform other language dependent initializations. */ + init_class_processing (); + init_rtti_processing (); + init_template_processing (); + + if (flag_exceptions) + init_exception_processing (); + + if (! supports_one_only ()) + flag_weak = 0; + + make_fname_decl = cp_make_fname_decl; + start_fname_decls (); + + /* Show we use EH for cleanups. */ + if (flag_exceptions) + using_eh_for_cleanups (); +} + +/* 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; + tree init = NULL_TREE; + size_t length = 0; + + if (name) + { + length = strlen (name); + domain = build_index_type (size_int (length)); + init = build_string (length + 1, name); + } + + type = cp_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; +} + +/* Create the VAR_DECL for __FUNCTION__ etc. ID is the name to give + the decl, LOC is the location to give the decl, NAME is the + initialization string and TYPE_DEP indicates whether NAME depended + on the type of the function. We make use of that to detect + __PRETTY_FUNCTION__ inside a template fn. This is being done lazily + at the point of first use, so we mustn't push the decl now. */ + +static tree +cp_make_fname_decl (location_t loc, 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 (loc, VAR_DECL, id, type); + + if (name) + free (CONST_CAST (char *, name)); + + /* 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; + + TREE_STATIC (decl) = 1; + TREE_READONLY (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + + TREE_USED (decl) = 1; + + if (current_function_decl) + { + struct cp_binding_level *b = current_binding_level; + if (b->kind == sk_function_parms) + return error_mark_node; + while (b->level_chain->kind != sk_function_parms) + b = b->level_chain; + pushdecl_with_scope (decl, b, /*is_friend=*/false); + cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE, + LOOKUP_ONLYCONVERTING); + } + else + { + DECL_THIS_STATIC (decl) = true; + pushdecl_top_level_and_finish (decl, init); + } + + return decl; +} + +static tree +builtin_function_1 (tree decl, tree context, bool is_global) +{ + tree id = DECL_NAME (decl); + const char *name = IDENTIFIER_POINTER (id); + + retrofit_lang_decl (decl); + + DECL_ARTIFICIAL (decl) = 1; + SET_OVERLOADED_OPERATOR_CODE (decl, ERROR_MARK); + SET_DECL_LANGUAGE (decl, lang_c); + /* Runtime library routines are, by definition, available in an + external shared object. */ + DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (decl) = 1; + + DECL_CONTEXT (decl) = context; + + if (is_global) + pushdecl_top_level (decl); + else + pushdecl (decl); + + /* A function in the user's namespace should have an explicit + declaration before it is used. Mark the built-in function as + anticipated but not actually declared. */ + if (name[0] != '_' || name[1] != '_') + DECL_ANTICIPATED (decl) = 1; + else if (strncmp (name + 2, "builtin_", strlen ("builtin_")) != 0) + { + size_t len = strlen (name); + + /* Treat __*_chk fortification functions as anticipated as well, + unless they are __builtin_*. */ + if (len > strlen ("___chk") + && memcmp (name + len - strlen ("_chk"), + "_chk", strlen ("_chk") + 1) == 0) + DECL_ANTICIPATED (decl) = 1; + } + + return decl; +} + +tree +cxx_builtin_function (tree decl) +{ + tree id = DECL_NAME (decl); + const char *name = IDENTIFIER_POINTER (id); + /* All builtins that don't begin with an '_' should additionally + go in the 'std' namespace. */ + if (name[0] != '_') + { + tree decl2 = copy_node(decl); + push_namespace (std_identifier); + builtin_function_1 (decl2, std_node, false); + pop_namespace (); + } + + return builtin_function_1 (decl, NULL_TREE, false); +} + +/* Like cxx_builtin_function, but guarantee the function is added to the global + scope. This is to allow function specific options to add new machine + dependent builtins when the target ISA changes via attribute((target(...))) + which saves space on program startup if the program does not use non-generic + ISAs. */ + +tree +cxx_builtin_function_ext_scope (tree decl) +{ + + tree id = DECL_NAME (decl); + const char *name = IDENTIFIER_POINTER (id); + /* All builtins that don't begin with an '_' should additionally + go in the 'std' namespace. */ + if (name[0] != '_') + { + tree decl2 = copy_node(decl); + push_namespace (std_identifier); + builtin_function_1 (decl2, std_node, true); + pop_namespace (); + } + + return builtin_function_1 (decl, NULL_TREE, true); +} + +/* Generate a FUNCTION_DECL with the typical flags for a runtime library + 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; + TREE_PUBLIC (fn) = 1; + DECL_ARTIFICIAL (fn) = 1; + SET_OVERLOADED_OPERATOR_CODE (fn, operator_code); + SET_DECL_LANGUAGE (fn, lang_c); + /* Runtime library routines are, by definition, available in an + external shared object. */ + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (fn) = 1; + return fn; +} + +/* Returns the _DECL for a library function with C linkage. + We assume that such functions never throw; if this is incorrect, + callers should unset TREE_NOTHROW. */ + +static tree +build_library_fn (tree name, tree type) +{ + tree fn = build_library_fn_1 (name, ERROR_MARK, type); + TREE_NOTHROW (fn) = 1; + return fn; +} + +/* 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); + DECL_CONTEXT (fn) = FROB_CONTEXT (current_namespace); + SET_DECL_LANGUAGE (fn, lang_cplusplus); + return fn; +} + +/* Like build_library_fn, but takes a C string instead of an + IDENTIFIER_NODE. */ + +tree +build_library_fn_ptr (const char* name, tree type) +{ + return build_library_fn (get_identifier (name), type); +} + +/* Like build_cp_library_fn, but takes a C string instead of an + IDENTIFIER_NODE. */ + +tree +build_cp_library_fn_ptr (const char* name, tree type) +{ + return build_cp_library_fn (get_identifier (name), ERROR_MARK, type); +} + +/* Like build_library_fn, but also pushes the function so that we will + be able to find it via IDENTIFIER_GLOBAL_VALUE. Also, the function + may throw exceptions listed in RAISES. */ + +tree +push_library_fn (tree name, tree type, tree raises) +{ + tree fn; + + if (raises) + type = build_exception_variant (type, raises); + + fn = build_library_fn (name, type); + pushdecl_top_level (fn); + return fn; +} + +/* Like build_cp_library_fn, but also pushes the function so that it + 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, + type); + pushdecl (fn); + return fn; +} + +/* Like push_library_fn, but takes a TREE_LIST of parm types rather than + 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, NULL_TREE); +} + +/* Like push_library_fn, but also note that this function throws + 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, NULL_TREE); + 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 + shouldn't have such things; this function undoes the damage to the + anonymous union type T. + + (The reason that we create the synthesized methods is that we don't + distinguish `union { int i; }' from `typedef union { int i; } U'. + The first is an anonymous union; the second is just an ordinary + union type.) */ + +void +fixup_anonymous_aggr (tree t) +{ + tree *q; + + /* Wipe out memory of synthesized methods. */ + TYPE_HAS_USER_CONSTRUCTOR (t) = 0; + TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0; + TYPE_HAS_COPY_CTOR (t) = 0; + TYPE_HAS_CONST_COPY_CTOR (t) = 0; + TYPE_HAS_COPY_ASSIGN (t) = 0; + TYPE_HAS_CONST_COPY_ASSIGN (t) = 0; + + /* Splice the implicitly generated functions out of the TYPE_METHODS + list. */ + q = &TYPE_METHODS (t); + while (*q) + { + if (DECL_ARTIFICIAL (*q)) + *q = TREE_CHAIN (*q); + else + q = &DECL_CHAIN (*q); + } + + /* ISO C++ 9.5.3. Anonymous unions may not have function members. */ + if (TYPE_METHODS (t)) + { + tree decl = TYPE_MAIN_DECL (t); + + if (TREE_CODE (t) != UNION_TYPE) + error_at (DECL_SOURCE_LOCATION (decl), + "an anonymous struct cannot have function members"); + else + error_at (DECL_SOURCE_LOCATION (decl), + "an anonymous union cannot have function members"); + } + + /* Anonymous aggregates cannot have fields with ctors, dtors or complex + assignment operators (because they cannot have these methods themselves). + For anonymous unions this is already checked because they are not allowed + in any union, otherwise we have to check it. */ + if (TREE_CODE (t) != UNION_TYPE) + { + tree field, type; + + for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL) + { + type = TREE_TYPE (field); + if (CLASS_TYPE_P (type)) + { + if (TYPE_NEEDS_CONSTRUCTING (type)) + error ("member %q+#D with constructor not allowed " + "in anonymous aggregate", field); + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + error ("member %q+#D with destructor not allowed " + "in anonymous aggregate", field); + if (TYPE_HAS_COMPLEX_COPY_ASSIGN (type)) + error ("member %q+#D with copy assignment operator " + "not allowed in anonymous aggregate", field); + } + } + } +} + +/* 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 (cp_decl_specifier_seq *declspecs) +{ + int saw_friend = declspecs->specs[(int)ds_friend] != 0; + int saw_typedef = declspecs->specs[(int)ds_typedef] != 0; + /* 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; + + if (declspecs->multiple_types_p) + error ("multiple types in one declaration"); + else if (declspecs->redefined_builtin_type) + { + if (!in_system_header) + permerror (input_location, "redeclaration of C++ built-in type %qT", + declspecs->redefined_builtin_type); + return NULL_TREE; + } + + if (declspecs->type + && TYPE_P (declspecs->type) + && ((TREE_CODE (declspecs->type) != TYPENAME_TYPE + && MAYBE_CLASS_TYPE_P (declspecs->type)) + || TREE_CODE (declspecs->type) == ENUMERAL_TYPE)) + declared_type = declspecs->type; + else if (declspecs->type == error_mark_node) + error_p = true; + if (declared_type == NULL_TREE && ! saw_friend && !error_p) + permerror (input_location, "declaration does not declare anything"); + /* Check for an anonymous union. */ + else if (declared_type && RECORD_OR_UNION_CODE_P (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 + enumeration (7.2), that is, when the decl-specifier-seq contains + either a class-specifier, an elaborated-type-specifier with + a class-key (9.1), or an enum-specifier. In these cases and + whenever a class-specifier or enum-specifier is present in the + decl-specifier-seq, the identifiers in these specifiers are among + the names being declared by the declaration (as class-name, + enum-names, or enumerators, depending on the syntax). In such + cases, and except for the declaration of an unnamed bit-field (9.6), + the decl-specifier-seq shall introduce one or more names into the + program, or shall redeclare a name introduced by a previous + declaration. [Example: + enum { }; // ill-formed + typedef class { }; // ill-formed + --end example] */ + if (saw_typedef) + { + error ("missing type-name in typedef-declaration"); + 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 && !in_system_header) + pedwarn (input_location, OPT_pedantic, "ISO C++ prohibits anonymous structs"); + } + + else + { + if (declspecs->specs[(int)ds_inline] + || declspecs->specs[(int)ds_virtual]) + error ("%qs can only be specified for functions", + declspecs->specs[(int)ds_inline] + ? "inline" : "virtual"); + else if (saw_friend + && (!current_class_type + || current_scope () != current_class_type)) + error ("% can only be specified inside a class"); + else if (declspecs->specs[(int)ds_explicit]) + error ("% can only be specified for constructors"); + else if (declspecs->storage_class) + error ("a storage class can only be specified for objects " + "and functions"); + else if (declspecs->specs[(int)ds_const] + || declspecs->specs[(int)ds_volatile] + || declspecs->specs[(int)ds_restrict] + || declspecs->specs[(int)ds_thread]) + error ("qualifiers can only be specified for objects " + "and functions"); + else if (saw_typedef) + warning (0, "% was ignored in this declaration"); + else if (declspecs->specs[(int) ds_constexpr]) + error ("% cannot be used for type declarations"); + } + + return declared_type; +} + +/* Called when a declaration is seen that contains no names to declare. + If its type is a reference to a structure, union or enum inherited + from a containing scope, shadow that tag name for the current scope + with a forward reference. + If its type defines a new named structure or union + or defines an enum, it is valid but we need not do anything here. + 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 (cp_decl_specifier_seq *declspecs) +{ + tree t = check_tag_decl (declspecs); + + if (!t) + return NULL_TREE; + + if (declspecs->attributes) + { + warning (0, "attribute ignored in declaration of %q+#T", t); + warning (0, "attribute for %q+#T must follow the %qs keyword", + t, class_key_or_enum_as_string (t)); + + } + + if (maybe_process_partial_specialization (t) == error_mark_node) + return NULL_TREE; + + /* 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); + + if (TYPE_FIELDS (t)) + { + tree decl = grokdeclarator (/*declarator=*/NULL, + declspecs, NORMAL, 0, NULL); + finish_anon_union (decl); + } + } + + return t; +} + +/* Decode a "typename", such as "int **", returning a ..._TYPE node. */ + +tree +groktypename (cp_decl_specifier_seq *type_specifiers, + const cp_declarator *declarator, + bool is_template_arg) +{ + tree attrs; + tree type; + enum decl_context context + = is_template_arg ? TEMPLATE_TYPE_ARG : TYPENAME; + attrs = type_specifiers->attributes; + type_specifiers->attributes = NULL_TREE; + type = grokdeclarator (declarator, type_specifiers, context, 0, &attrs); + if (attrs && type != error_mark_node) + { + if (CLASS_TYPE_P (type)) + warning (OPT_Wattributes, "ignoring attributes applied to class type %qT " + "outside of definition", type); + else if (MAYBE_CLASS_TYPE_P (type)) + /* A template type parameter or other dependent type. */ + warning (OPT_Wattributes, "ignoring attributes applied to dependent " + "type %qT without an associated declaration", type); + else + cplus_decl_attributes (&type, attrs, 0); + } + return type; +} + +/* Process a DECLARATOR for a function-scope variable declaration, + namespace-scope variable declaration, or function declaration. + (Function definitions go through start_function; class member + declarations appearing in the body of the class go through + grokfield.) The DECL corresponding to the DECLARATOR is returned. + If an error occurs, the error_mark_node is returned instead. + + DECLSPECS are the decl-specifiers for the declaration. INITIALIZED is + SD_INITIALIZED if an explicit initializer is present, or SD_DEFAULTED + for an explicitly defaulted function, or SD_DELETED for an explicitly + deleted function, but 0 (SD_UNINITIALIZED) if this is a variable + implicitly initialized via a default constructor. ATTRIBUTES and + PREFIX_ATTRIBUTES are GNU attributes associated with this declaration. + *PUSHED_SCOPE_P is set to the scope entered in this function, if any; if + set, the caller is responsible for calling pop_scope. */ + +tree +start_decl (const cp_declarator *declarator, + cp_decl_specifier_seq *declspecs, + int initialized, + tree attributes, + tree prefix_attributes, + tree *pushed_scope_p) +{ + tree decl; + tree context; + bool was_public; + int flags; + bool alias; + + *pushed_scope_p = NULL_TREE; + + /* An object declared as __attribute__((deprecated)) suppresses + warnings of uses of other deprecated items. */ + if (lookup_attribute ("deprecated", attributes)) + deprecated_state = DEPRECATED_SUPPRESS; + + attributes = chainon (attributes, prefix_attributes); + + decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, + &attributes); + + deprecated_state = DEPRECATED_NORMAL; + + if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE + || decl == error_mark_node) + return error_mark_node; + + context = CP_DECL_CONTEXT (decl); + if (context != global_namespace) + *pushed_scope_p = push_scope (context); + + if (initialized) + /* Is it valid for this decl to have an initializer at all? + If not, set INITIALIZED to zero, which will indirectly + tell `cp_finish_decl' to ignore the initializer once it is parsed. */ + switch (TREE_CODE (decl)) + { + case TYPE_DECL: + error ("typedef %qD is initialized (use decltype instead)", decl); + return error_mark_node; + + case FUNCTION_DECL: + if (initialized == SD_DELETED) + /* We'll handle the rest of the semantics later, but we need to + set this now so it's visible to duplicate_decls. */ + DECL_DELETED_FN (decl) = 1; + break; + + default: + break; + } + + if (initialized) + { + if (! toplevel_bindings_p () + && DECL_EXTERNAL (decl)) + warning (0, "declaration of %q#D has % and is initialized", + decl); + DECL_EXTERNAL (decl) = 0; + if (toplevel_bindings_p ()) + TREE_STATIC (decl) = 1; + } + alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)) != 0; + + if (alias && TREE_CODE (decl) == FUNCTION_DECL) + record_key_method_defined (decl); + + /* If this is a typedef that names the class for linkage purposes + (7.1.3p8), apply any attributes directly to the type. */ + if (TREE_CODE (decl) == TYPE_DECL + && TAGGED_TYPE_P (TREE_TYPE (decl)) + && decl == TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl)))) + flags = ATTR_FLAG_TYPE_IN_PLACE; + else + flags = 0; + + /* Set attributes here so if duplicate decl, will have proper attributes. */ + cplus_decl_attributes (&decl, attributes, flags); + + /* Dllimported symbols cannot be defined. Static data members (which + can be initialized in-class and dllimported) go through grokfield, + not here, so we don't need to exclude those decls when checking for + a definition. */ + if (initialized && DECL_DLLIMPORT_P (decl)) + { + error ("definition of %q#D is marked %", decl); + DECL_DLLIMPORT_P (decl) = 0; + } + + /* If #pragma weak was used, mark the decl weak now. */ + maybe_apply_pragma_weak (decl); + + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl) + && DECL_UNINLINABLE (decl) + && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl))) + warning (0, "inline function %q+D given attribute noinline", decl); + + if (TYPE_P (context) && COMPLETE_TYPE_P (complete_type (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 ("%q#D is not a static member of %q#T", decl, context); + else + { + if (DECL_CONTEXT (field) != context) + { + if (!same_type_p (DECL_CONTEXT (field), context)) + permerror (input_location, "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); + } + if (processing_specialization + && template_class_depth (context) == 0 + && CLASSTYPE_TEMPLATE_SPECIALIZATION (context)) + error ("template header not allowed in member definition " + "of explicitly specialized class"); + /* Static data member are tricky; an in-class initialization + still doesn't provide a definition, so the in-class + declaration will have DECL_EXTERNAL set, but will have an + initialization. Thus, duplicate_decls won't warn + about this situation, and so we check here. */ + if (initialized && DECL_INITIALIZED_IN_CLASS_P (field)) + error ("duplicate initialization of %qD", decl); + if (duplicate_decls (decl, field, /*newdecl_is_friend=*/false)) + decl = field; + if (declspecs->specs[(int) ds_constexpr] + && !DECL_DECLARED_CONSTEXPR_P (field)) + error ("%qD declared % outside its class", field); + } + } + else + { + tree field = check_classfn (context, decl, + (processing_template_decl + > template_class_depth (context)) + ? current_template_parms + : NULL_TREE); + if (field && field != error_mark_node + && duplicate_decls (decl, field, + /*newdecl_is_friend=*/false)) + decl = field; + } + + /* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */ + DECL_IN_AGGR_P (decl) = 0; + /* Do not mark DECL as an explicit specialization if it was not + already marked as an instantiation; a declaration should + never be marked as a specialization unless we know what + template is being specialized. */ + if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl)) + { + SET_DECL_TEMPLATE_SPECIALIZATION (decl); + + /* [temp.expl.spec] An explicit specialization of a static data + member of a template is a definition if the declaration + includes an initializer; otherwise, it is a declaration. + + We check for processing_specialization so this only applies + to the new specialization syntax. */ + if (!initialized && processing_specialization) + DECL_EXTERNAL (decl) = 1; + } + + if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl) + /* Aliases are definitions. */ + && !alias) + permerror (input_location, "declaration of %q#D outside of class is not definition", + decl); + } + + was_public = TREE_PUBLIC (decl); + + /* Enter this declaration into the symbol table. */ + decl = maybe_push_decl (decl); + + if (processing_template_decl) + decl = push_template_decl (decl); + if (decl == error_mark_node) + return error_mark_node; + + /* Tell the back end to use or not use .common as appropriate. If we say + -fconserve-space, we want this to save .data space, at the expense of + wrong semantics. If we say -fno-conserve-space, we want this to + produce errors about redefs; to do this we force variables into the + data segment. */ + if (flag_conserve_space + && TREE_CODE (decl) == VAR_DECL + && TREE_PUBLIC (decl) + && !DECL_THREAD_LOCAL_P (decl) + && !have_global_bss_p ()) + DECL_COMMON (decl) = 1; + + if (TREE_CODE (decl) == VAR_DECL + && DECL_NAMESPACE_SCOPE_P (decl) && !TREE_PUBLIC (decl) && !was_public + && !DECL_THIS_STATIC (decl) && !DECL_ARTIFICIAL (decl)) + { + /* This is a const variable with implicit 'static'. Set + DECL_THIS_STATIC so we can tell it from variables that are + !TREE_PUBLIC because of the anonymous namespace. */ + gcc_assert (CP_TYPE_CONST_P (TREE_TYPE (decl)) || errorcount); + DECL_THIS_STATIC (decl) = 1; + } + + if (!processing_template_decl && TREE_CODE (decl) == VAR_DECL) + start_decl_1 (decl, initialized); + + return decl; +} + +/* Process the declaration of a variable DECL. INITIALIZED is true + iff DECL is explicitly initialized. (INITIALIZED is false if the + variable is initialized via an implicitly-called constructor.) + This function must be called for ordinary variables (including, for + example, implicit instantiations of templates), but must not be + called for template declarations. */ + +void +start_decl_1 (tree decl, bool initialized) +{ + tree type; + bool complete_p; + bool aggregate_definition_p; + + gcc_assert (!processing_template_decl); + + if (error_operand_p (decl)) + return; + + gcc_assert (TREE_CODE (decl) == VAR_DECL); + + type = TREE_TYPE (decl); + complete_p = COMPLETE_TYPE_P (type); + aggregate_definition_p = MAYBE_CLASS_TYPE_P (type) && !DECL_EXTERNAL (decl); + + /* If an explicit initializer is present, or if this is a definition + of an aggregate, then we need a complete type at this point. + (Scalars are always complete types, so there is nothing to + check.) This code just sets COMPLETE_P; errors (if necessary) + are issued below. */ + if ((initialized || aggregate_definition_p) + && !complete_p + && COMPLETE_TYPE_P (complete_type (type))) + { + complete_p = true; + /* We will not yet have set TREE_READONLY on DECL if the type + was "const", but incomplete, before this point. But, now, we + have a complete type, so we can try again. */ + cp_apply_type_quals_to_decl (cp_type_quals (type), decl); + } + + if (initialized) + /* Is it valid for this decl to have an initializer at all? */ + { + /* Don't allow initializations for incomplete types except for + arrays which might be completed by the initialization. */ + if (complete_p) + ; /* A complete type is ok. */ + else if (type_uses_auto (type)) + ; /* An auto type is ok. */ + else if (TREE_CODE (type) != ARRAY_TYPE) + { + error ("variable %q#D has initializer but incomplete type", decl); + type = TREE_TYPE (decl) = error_mark_node; + } + else if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type)))) + { + if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)) + error ("elements of array %q#D have incomplete type", decl); + /* else we already gave an error in start_decl. */ + } + } + else if (aggregate_definition_p && !complete_p) + { + if (type_uses_auto (type)) + error ("declaration of %q#D has no initializer", decl); + else + error ("aggregate %q#D has incomplete type and cannot be defined", + decl); + /* Change the type so that assemble_variable will give + DECL an rtl we can live with: (mem (const_int 0)). */ + type = TREE_TYPE (decl) = error_mark_node; + } + + /* 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) +{ + tree tmp; + + if (init == NULL_TREE) + { + if ((DECL_LANG_SPECIFIC (decl) == 0 + || DECL_IN_AGGR_P (decl) == 0) + && ! DECL_THIS_EXTERN (decl)) + error ("%qD declared as reference but not initialized", decl); + return NULL_TREE; + } + + if (TREE_CODE (init) == TREE_LIST) + init = build_x_compound_expr_from_list (init, ELK_INIT, + tf_warning_or_error); + + 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 + of the reference. If so, a DECL_EXPR for the temporary will be + added just after the DECL_EXPR for DECL. That's why we don't set + DECL_INITIAL for local references (instead assigning to them + explicitly); we need to allow the temporary to be initialized + first. */ + tmp = initialize_reference (type, init, decl, cleanup, tf_warning_or_error); + + if (tmp == error_mark_node) + return NULL_TREE; + else if (tmp == NULL_TREE) + { + error ("cannot initialize %qT from %qT", type, TREE_TYPE (init)); + return NULL_TREE; + } + + if (TREE_STATIC (decl) && !TREE_CONSTANT (tmp)) + return tmp; + + DECL_INITIAL (decl) = tmp; + + return NULL_TREE; +} + +/* Subroutine of check_initializer. We're initializing a DECL of + std::initializer_list TYPE from a braced-init-list INIT, and need to + extend the lifetime of the underlying array to match that of the decl, + just like for reference initialization. CLEANUP is as for + grok_reference_init. */ + +static tree +build_init_list_var_init (tree decl, tree type, tree init, tree *array_init, + tree *cleanup) +{ + tree aggr_init, array, arrtype; + init = perform_implicit_conversion (type, init, tf_warning_or_error); + if (error_operand_p (init)) + return error_mark_node; + + aggr_init = TARGET_EXPR_INITIAL (init); + array = AGGR_INIT_EXPR_ARG (aggr_init, 1); + arrtype = TREE_TYPE (array); + STRIP_NOPS (array); + gcc_assert (TREE_CODE (array) == ADDR_EXPR); + array = TREE_OPERAND (array, 0); + /* If the array is constant, finish_compound_literal already made it a + static variable and we don't need to do anything here. */ + if (decl && TREE_CODE (array) == TARGET_EXPR) + { + tree var = set_up_extended_ref_temp (decl, array, cleanup, array_init); + var = build_address (var); + var = convert (arrtype, var); + AGGR_INIT_EXPR_ARG (aggr_init, 1) = var; + } + return init; +} + +/* Designated initializers in arrays are not supported in GNU C++. + The parser cannot detect this error since it does not know whether + a given brace-enclosed initializer is for a class type or for an + array. This function checks that CE does not use a designated + initializer. If it does, an error is issued. Returns true if CE + is valid, i.e., does not have a designated initializer. */ + +static bool +check_array_designated_initializer (const constructor_elt *ce) +{ + /* Designated initializers for array elements are not supported. */ + if (ce->index) + { + /* The parser only allows identifiers as designated + initializers. */ + if (ce->index == error_mark_node) + error ("name used in a GNU-style designated " + "initializer for an array"); + else if (TREE_CODE (ce->index) == INTEGER_CST) + /* An index added by reshape_init. */ + return true; + else + { + gcc_assert (TREE_CODE (ce->index) == IDENTIFIER_NODE); + error ("name %qD used in a GNU-style designated " + "initializer for an array", ce->index); + } + return false; + } + + return true; +} + +/* When parsing `int a[] = {1, 2};' we don't know the size of the + array until we finish parsing the initializer. If that's the + situation we're in, update DECL accordingly. */ + +static void +maybe_deduce_size_from_array_init (tree decl, tree init) +{ + tree type = TREE_TYPE (decl); + + if (TREE_CODE (type) == ARRAY_TYPE + && TYPE_DOMAIN (type) == NULL_TREE + && TREE_CODE (decl) != TYPE_DECL) + { + /* do_default is really a C-ism to deal with tentative definitions. + But let's leave it here to ease the eventual merge. */ + int do_default = !DECL_EXTERNAL (decl); + tree initializer = init ? init : DECL_INITIAL (decl); + int failure = 0; + + /* Check that there are no designated initializers in INIT, as + those are not supported in GNU C++, and as the middle-end + will crash if presented with a non-numeric designated + initializer. */ + if (initializer && TREE_CODE (initializer) == CONSTRUCTOR) + { + VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (initializer); + constructor_elt *ce; + HOST_WIDE_INT i; + FOR_EACH_VEC_ELT (constructor_elt, v, i, ce) + if (!check_array_designated_initializer (ce)) + failure = 1; + } + + if (!failure) + { + failure = cp_complete_array_type (&TREE_TYPE (decl), initializer, + do_default); + if (failure == 1) + { + error ("initializer fails to determine size of %qD", decl); + TREE_TYPE (decl) = error_mark_node; + } + else if (failure == 2) + { + if (do_default) + { + error ("array size missing in %qD", decl); + TREE_TYPE (decl) = error_mark_node; + } + /* If a `static' var's size isn't known, make it extern as + well as static, so it does not get allocated. If it's not + `static', then don't mark it extern; finish_incomplete_decl + will give it a default size and it will get allocated. */ + else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl)) + DECL_EXTERNAL (decl) = 1; + } + else if (failure == 3) + { + error ("zero-size array %qD", decl); + TREE_TYPE (decl) = error_mark_node; + } + } + + cp_apply_type_quals_to_decl (cp_type_quals (TREE_TYPE (decl)), decl); + + relayout_decl (decl); + } +} + +/* Set DECL_SIZE, DECL_ALIGN, etc. for DECL (a VAR_DECL), and issue + any appropriate error messages regarding the layout. */ + +static void +layout_var_decl (tree decl) +{ + tree type; + + type = TREE_TYPE (decl); + if (type == error_mark_node) + return; + + /* 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); + if (!DECL_SIZE (decl) + && TREE_TYPE (decl) != error_mark_node + && (COMPLETE_TYPE_P (type) + || (TREE_CODE (type) == ARRAY_TYPE + && !TYPE_DOMAIN (type) + && COMPLETE_TYPE_P (TREE_TYPE (type))))) + layout_decl (decl, 0); + + if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE) + { + /* An automatic variable with an incomplete type: that is an error. + Don't talk about array types here, since we took care of that + message in grokdeclarator. */ + error ("storage size of %qD isn%'t known", decl); + TREE_TYPE (decl) = error_mark_node; + } +#if 0 + /* Keep this code around in case we later want to control debug info + based on whether a type is "used". (jason 1999-11-11) */ + + else if (!DECL_EXTERNAL (decl) && MAYBE_CLASS_TYPE_P (ttype)) + /* Let debugger know it should output info for this type. */ + note_debug_info_needed (ttype); + + if (TREE_STATIC (decl) && DECL_CLASS_SCOPE_P (decl)) + note_debug_info_needed (DECL_CONTEXT (decl)); +#endif + + if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl)) + && DECL_SIZE (decl) != NULL_TREE + && ! TREE_CONSTANT (DECL_SIZE (decl))) + { + if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) + constant_expression_warning (DECL_SIZE (decl)); + else + { + error ("storage size of %qD isn%'t constant", decl); + TREE_TYPE (decl) = error_mark_node; + } + } +} + +/* If a local static variable is declared in an inline function, or if + we have a weak definition, we must endeavor to create only one + instance of the variable at link-time. */ + +void +maybe_commonize_var (tree decl) +{ + /* Static data in a function with comdat linkage also has comdat + linkage. */ + if (TREE_STATIC (decl) + /* Don't mess with __FUNCTION__. */ + && ! DECL_ARTIFICIAL (decl) + && DECL_FUNCTION_SCOPE_P (decl) + && vague_linkage_p (DECL_CONTEXT (decl))) + { + if (flag_weak) + { + /* With weak symbols, we simply make the variable COMDAT; + that will cause copies in multiple translations units to + be merged. */ + comdat_linkage (decl); + } + else + { + if (DECL_INITIAL (decl) == NULL_TREE + || DECL_INITIAL (decl) == error_mark_node) + { + /* Without weak symbols, we can use COMMON to merge + uninitialized variables. */ + TREE_PUBLIC (decl) = 1; + DECL_COMMON (decl) = 1; + } + else + { + /* While for initialized variables, we must use internal + linkage -- which means that multiple copies will not + be merged. */ + TREE_PUBLIC (decl) = 0; + DECL_COMMON (decl) = 0; + warning_at (input_location, 0, + "sorry: semantics of inline function static " + "data %q+#D are wrong (you%'ll wind up " + "with multiple copies)", decl); + warning_at (DECL_SOURCE_LOCATION (decl), 0, + " you can work around this by removing " + "the initializer"); + } + } + } + else if (DECL_LANG_SPECIFIC (decl) && DECL_COMDAT (decl)) + /* Set it up again; we might have set DECL_INITIAL since the last + time. */ + comdat_linkage (decl); +} + +/* Issue an error message if DECL is an uninitialized const variable. */ + +static void +check_for_uninitialized_const_var (tree decl) +{ + tree type = strip_array_types (TREE_TYPE (decl)); + + /* ``Unless explicitly declared extern, a const object does not have + external linkage and must be initialized. ($8.4; $12.1)'' ARM + 7.1.6 */ + if (TREE_CODE (decl) == VAR_DECL + && TREE_CODE (type) != REFERENCE_TYPE + && CP_TYPE_CONST_P (type) + && !DECL_INITIAL (decl)) + { + tree field = default_init_uninitialized_part (type); + if (!field) + return; + + permerror (DECL_SOURCE_LOCATION (decl), + "uninitialized const %qD", decl); + + if (CLASS_TYPE_P (type)) + { + tree defaulted_ctor; + + inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)), + "%q#T has no user-provided default constructor", type); + defaulted_ctor = in_class_defaulted_default_constructor (type); + if (defaulted_ctor) + inform (DECL_SOURCE_LOCATION (defaulted_ctor), + "constructor is not user-provided because it is " + "explicitly defaulted in the class body"); + inform (0, "and the implicitly-defined constructor does not " + "initialize %q+#D", field); + } + } +} + +/* Structure holding the current initializer being processed by reshape_init. + CUR is a pointer to the current element being processed, END is a pointer + after the last element present in the initializer. */ +typedef struct reshape_iterator_t +{ + constructor_elt *cur; + constructor_elt *end; +} reshape_iter; + +static tree reshape_init_r (tree, reshape_iter *, bool); + +/* FIELD is a FIELD_DECL or NULL. In the former case, the value + returned is the next FIELD_DECL (possibly FIELD itself) that can be + initialized. If there are no more such fields, the return value + will be NULL. */ + +tree +next_initializable_field (tree field) +{ + while (field + && (TREE_CODE (field) != FIELD_DECL + || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field)) + || DECL_ARTIFICIAL (field))) + field = DECL_CHAIN (field); + + return field; +} + +/* Subroutine of reshape_init_array and reshape_init_vector, which does + the actual work. ELT_TYPE is the element type of the array. MAX_INDEX is an + INTEGER_CST representing the size of the array minus one (the maximum index), + or NULL_TREE if the array was declared without specifying the size. D is + the iterator within the constructor. */ + +static tree +reshape_init_array_1 (tree elt_type, tree max_index, reshape_iter *d) +{ + tree new_init; + bool sized_array_p = (max_index != NULL_TREE); + unsigned HOST_WIDE_INT max_index_cst = 0; + unsigned HOST_WIDE_INT index; + + /* The initializer for an array is always a CONSTRUCTOR. */ + new_init = build_constructor (init_list_type_node, NULL); + + if (sized_array_p) + { + /* Minus 1 is used for zero sized arrays. */ + if (integer_all_onesp (max_index)) + return new_init; + + if (host_integerp (max_index, 1)) + max_index_cst = tree_low_cst (max_index, 1); + /* sizetype is sign extended, not zero extended. */ + else + max_index_cst = tree_low_cst (fold_convert (size_type_node, max_index), + 1); + } + + /* Loop until there are no more initializers. */ + for (index = 0; + d->cur != d->end && (!sized_array_p || index <= max_index_cst); + ++index) + { + tree elt_init; + + check_array_designated_initializer (d->cur); + elt_init = reshape_init_r (elt_type, d, /*first_initializer_p=*/false); + if (elt_init == error_mark_node) + return error_mark_node; + CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (new_init), + size_int (index), elt_init); + if (!TREE_CONSTANT (elt_init)) + TREE_CONSTANT (new_init) = false; + } + + return new_init; +} + +/* Subroutine of reshape_init_r, processes the initializers for arrays. + Parameters are the same of reshape_init_r. */ + +static tree +reshape_init_array (tree type, reshape_iter *d) +{ + tree max_index = NULL_TREE; + + gcc_assert (TREE_CODE (type) == ARRAY_TYPE); + + if (TYPE_DOMAIN (type)) + max_index = array_type_nelts (type); + + return reshape_init_array_1 (TREE_TYPE (type), max_index, d); +} + +/* Subroutine of reshape_init_r, processes the initializers for vectors. + Parameters are the same of reshape_init_r. */ + +static tree +reshape_init_vector (tree type, reshape_iter *d) +{ + tree max_index = NULL_TREE; + + gcc_assert (TREE_CODE (type) == VECTOR_TYPE); + + if (COMPOUND_LITERAL_P (d->cur->value)) + { + tree value = d->cur->value; + if (!same_type_p (TREE_TYPE (value), type)) + { + error ("invalid type %qT as initializer for a vector of type %qT", + TREE_TYPE (d->cur->value), type); + value = error_mark_node; + } + ++d->cur; + return value; + } + + /* For a vector, we initialize it as an array of the appropriate size. */ + if (TREE_CODE (type) == VECTOR_TYPE) + max_index = size_int (TYPE_VECTOR_SUBPARTS (type) - 1); + + return reshape_init_array_1 (TREE_TYPE (type), max_index, d); +} + +/* Subroutine of reshape_init_r, processes the initializers for classes + or union. Parameters are the same of reshape_init_r. */ + +static tree +reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p) +{ + tree field; + tree new_init; + + gcc_assert (CLASS_TYPE_P (type)); + + /* The initializer for a class is always a CONSTRUCTOR. */ + new_init = build_constructor (init_list_type_node, NULL); + field = next_initializable_field (TYPE_FIELDS (type)); + + if (!field) + { + /* [dcl.init.aggr] + + An initializer for an aggregate member that is an + empty class shall have the form of an empty + initializer-list {}. */ + if (!first_initializer_p) + { + error ("initializer for %qT must be brace-enclosed", type); + return error_mark_node; + } + return new_init; + } + + /* Loop through the initializable fields, gathering initializers. */ + while (d->cur != d->end) + { + tree field_init; + + /* Handle designated initializers, as an extension. */ + if (d->cur->index) + { + field = lookup_field_1 (type, d->cur->index, /*want_type=*/false); + + if (!field || TREE_CODE (field) != FIELD_DECL) + { + error ("%qT has no non-static data member named %qD", type, + d->cur->index); + return error_mark_node; + } + } + + /* If we processed all the member of the class, we are done. */ + if (!field) + break; + + field_init = reshape_init_r (TREE_TYPE (field), d, + /*first_initializer_p=*/false); + if (field_init == error_mark_node) + return error_mark_node; + + CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (new_init), field, field_init); + + /* [dcl.init.aggr] + + When a union is initialized with a brace-enclosed + initializer, the braces shall only contain an + initializer for the first member of the union. */ + if (TREE_CODE (type) == UNION_TYPE) + break; + + field = next_initializable_field (DECL_CHAIN (field)); + } + + return new_init; +} + +/* Subroutine of reshape_init, which processes a single initializer (part of + a CONSTRUCTOR). TYPE is the type of the variable being initialized, D is the + iterator within the CONSTRUCTOR which points to the initializer to process. + FIRST_INITIALIZER_P is true if this is the first initializer of the + outermost CONSTRUCTOR node. */ + +static tree +reshape_init_r (tree type, reshape_iter *d, bool first_initializer_p) +{ + tree init = d->cur->value; + + if (error_operand_p (init)) + return error_mark_node; + + /* A non-aggregate type is always initialized with a single + initializer. */ + if (!CP_AGGREGATE_TYPE_P (type)) + { + /* It is invalid to initialize a non-aggregate type with a + brace-enclosed initializer before C++0x. + We need to check for BRACE_ENCLOSED_INITIALIZER_P here because + of g++.old-deja/g++.mike/p7626.C: a pointer-to-member constant is + a CONSTRUCTOR (with a record type). */ + if (TREE_CODE (init) == CONSTRUCTOR + && BRACE_ENCLOSED_INITIALIZER_P (init)) /* p7626.C */ + { + if (SCALAR_TYPE_P (type)) + { + error ("braces around scalar initializer for type %qT", type); + init = error_mark_node; + } + else + maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); + } + + d->cur++; + return init; + } + + /* [dcl.init.aggr] + + All implicit type conversions (clause _conv_) are considered when + initializing the aggregate member with an initializer from an + initializer-list. If the initializer can initialize a member, + the member is initialized. Otherwise, if the member is itself a + non-empty subaggregate, brace elision is assumed and the + initializer is considered for the initialization of the first + member of the subaggregate. */ + if (TREE_CODE (init) != CONSTRUCTOR + /* But don't try this for the first initializer, since that would be + looking through the outermost braces; A a2 = { a1 }; is not a + valid aggregate initialization. */ + && !first_initializer_p + && (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (init)) + || can_convert_arg (type, TREE_TYPE (init), init, LOOKUP_NORMAL))) + { + d->cur++; + return init; + } + + /* [dcl.init.string] + + A char array (whether plain char, signed char, or unsigned char) + can be initialized by a string-literal (optionally enclosed in + braces); a wchar_t array can be initialized by a wide + string-literal (optionally enclosed in braces). */ + if (TREE_CODE (type) == ARRAY_TYPE + && char_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (type)))) + { + tree str_init = init; + + /* Strip one level of braces if and only if they enclose a single + element (as allowed by [dcl.init.string]). */ + if (!first_initializer_p + && TREE_CODE (str_init) == CONSTRUCTOR + && VEC_length (constructor_elt, CONSTRUCTOR_ELTS (str_init)) == 1) + { + str_init = VEC_index (constructor_elt, + CONSTRUCTOR_ELTS (str_init), 0)->value; + } + + /* If it's a string literal, then it's the initializer for the array + as a whole. Otherwise, continue with normal initialization for + array types (one value per array element). */ + if (TREE_CODE (str_init) == STRING_CST) + { + d->cur++; + return str_init; + } + } + + /* The following cases are about aggregates. If we are not within a full + initializer already, and there is not a CONSTRUCTOR, it means that there + is a missing set of braces (that is, we are processing the case for + which reshape_init exists). */ + if (!first_initializer_p) + { + if (TREE_CODE (init) == CONSTRUCTOR) + { + if (TREE_TYPE (init) && TYPE_PTRMEMFUNC_P (TREE_TYPE (init))) + /* There is no need to reshape pointer-to-member function + initializers, as they are always constructed correctly + by the front end. */ + ; + else if (COMPOUND_LITERAL_P (init)) + /* For a nested compound literal, there is no need to reshape since + brace elision is not allowed. Even if we decided to allow it, + we should add a call to reshape_init in finish_compound_literal, + before calling digest_init, so changing this code would still + not be necessary. */ + gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (init)); + else + { + ++d->cur; + gcc_assert (BRACE_ENCLOSED_INITIALIZER_P (init)); + return reshape_init (type, init); + } + } + + warning (OPT_Wmissing_braces, "missing braces around initializer for %qT", + type); + } + + /* Dispatch to specialized routines. */ + if (CLASS_TYPE_P (type)) + return reshape_init_class (type, d, first_initializer_p); + else if (TREE_CODE (type) == ARRAY_TYPE) + return reshape_init_array (type, d); + else if (TREE_CODE (type) == VECTOR_TYPE) + return reshape_init_vector (type, d); + else + gcc_unreachable(); +} + +/* Undo the brace-elision allowed by [dcl.init.aggr] in a + brace-enclosed aggregate initializer. + + INIT is the CONSTRUCTOR containing the list of initializers describing + a brace-enclosed initializer for an entity of the indicated aggregate TYPE. + It may not presently match the shape of the TYPE; for example: + + struct S { int a; int b; }; + struct S a[] = { 1, 2, 3, 4 }; + + Here INIT will hold a VEC of four elements, rather than a + VEC of two elements, each itself a VEC of two elements. This + routine transforms INIT from the former form into the latter. The + revised CONSTRUCTOR node is returned. */ + +tree +reshape_init (tree type, tree init) +{ + VEC(constructor_elt, gc) *v; + reshape_iter d; + tree new_init; + + gcc_assert (BRACE_ENCLOSED_INITIALIZER_P (init)); + + v = CONSTRUCTOR_ELTS (init); + + /* An empty constructor does not need reshaping, and it is always a valid + initializer. */ + if (VEC_empty (constructor_elt, v)) + return init; + + /* Recurse on this CONSTRUCTOR. */ + d.cur = VEC_index (constructor_elt, v, 0); + d.end = d.cur + VEC_length (constructor_elt, v); + + new_init = reshape_init_r (type, &d, true); + if (new_init == error_mark_node) + return error_mark_node; + + /* Make sure all the element of the constructor were used. Otherwise, + issue an error about exceeding initializers. */ + if (d.cur != d.end) + error ("too many initializers for %qT", type); + + return new_init; +} + +/* Verify array initializer. Returns true if errors have been reported. */ + +bool +check_array_initializer (tree decl, tree type, tree init) +{ + tree element_type = TREE_TYPE (type); + + /* The array type itself need not be complete, because the + initializer may tell us how many elements are in the array. + But, the elements of the array must be complete. */ + if (!COMPLETE_TYPE_P (complete_type (element_type))) + { + if (decl) + error ("elements of array %q#D have incomplete type", decl); + else + error ("elements of array %q#T have incomplete type", type); + return true; + } + /* It is not valid to initialize a VLA. */ + if (init + && ((COMPLETE_TYPE_P (type) && !TREE_CONSTANT (TYPE_SIZE (type))) + || !TREE_CONSTANT (TYPE_SIZE (element_type)))) + { + if (decl) + error ("variable-sized object %qD may not be initialized", decl); + else + error ("variable-sized compound literal"); + return true; + } + return false; +} + +/* Subroutine of check_initializer; args are passed down from that function. + Set stmts_are_full_exprs_p to 1 across a call to build_aggr_init. */ + +static tree +build_aggr_init_full_exprs (tree decl, tree init, int flags) + +{ + int saved_stmts_are_full_exprs_p = 0; + if (building_stmt_tree ()) + { + saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); + current_stmt_tree ()->stmts_are_full_exprs_p = 1; + } + init = build_aggr_init (decl, init, flags, tf_warning_or_error); + if (building_stmt_tree ()) + current_stmt_tree ()->stmts_are_full_exprs_p = + saved_stmts_are_full_exprs_p; + return init; +} + +/* Verify INIT (the initializer for DECL), and record the + initialization in DECL_INITIAL, if appropriate. CLEANUP is as for + grok_reference_init. + + If the return value is non-NULL, it is an expression that must be + evaluated dynamically to initialize DECL. */ + +static tree +check_initializer (tree decl, tree init, int flags, tree *cleanup) +{ + tree type = TREE_TYPE (decl); + tree init_code = NULL; + tree extra_init = NULL_TREE; + tree core_type; + + /* Things that are going to be initialized need to have complete + type. */ + TREE_TYPE (decl) = type = complete_type (TREE_TYPE (decl)); + + if (type == error_mark_node) + /* We will have already complained. */ + return NULL_TREE; + + if (TREE_CODE (type) == ARRAY_TYPE) + { + if (check_array_initializer (decl, type, init)) + return NULL_TREE; + } + else if (!COMPLETE_TYPE_P (type)) + { + error ("%qD has incomplete type", decl); + TREE_TYPE (decl) = error_mark_node; + return NULL_TREE; + } + else + /* There is no way to make a variable-sized class type in GNU C++. */ + gcc_assert (TREE_CONSTANT (TYPE_SIZE (type))); + + if (init && BRACE_ENCLOSED_INITIALIZER_P (init)) + { + int init_len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)); + if (SCALAR_TYPE_P (type)) + { + if (init_len == 0) + { + maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); + init = build_zero_init (type, NULL_TREE, false); + } + else if (init_len != 1) + { + error ("scalar object %qD requires one element in initializer", + decl); + TREE_TYPE (decl) = error_mark_node; + return NULL_TREE; + } + } + } + + if (TREE_CODE (decl) == CONST_DECL) + { + gcc_assert (TREE_CODE (type) != REFERENCE_TYPE); + + DECL_INITIAL (decl) = init; + + gcc_assert (init != NULL_TREE); + init = NULL_TREE; + } + else if (!init && DECL_REALLY_EXTERN (decl)) + ; + else if (TREE_CODE (type) == REFERENCE_TYPE) + init = grok_reference_init (decl, type, init, cleanup); + else if (init || TYPE_NEEDS_CONSTRUCTING (type)) + { + if (!init) + check_for_uninitialized_const_var (decl); + /* Do not reshape constructors of vectors (they don't need to be + reshaped. */ + else if (BRACE_ENCLOSED_INITIALIZER_P (init)) + { + if (is_std_init_list (type)) + init = build_init_list_var_init (decl, type, init, + &extra_init, cleanup); + else if (TYPE_NON_AGGREGATE_CLASS (type)) + { + /* Don't reshape if the class has constructors. */ + if (cxx_dialect == cxx98) + error ("in C++98 %qD must be initialized by constructor, " + "not by %<{...}%>", + decl); + } + else if (TREE_CODE (type) == VECTOR_TYPE && TYPE_VECTOR_OPAQUE (type)) + { + error ("opaque vector types cannot be initialized"); + init = error_mark_node; + } + else + init = reshape_init (type, init); + } + + /* If DECL has an array type without a specific bound, deduce the + array size from the initializer. */ + maybe_deduce_size_from_array_init (decl, init); + type = TREE_TYPE (decl); + if (type == error_mark_node) + return NULL_TREE; + + if (TYPE_NEEDS_CONSTRUCTING (type) + || (CLASS_TYPE_P (type) + && !(init && BRACE_ENCLOSED_INITIALIZER_P (init)))) + { + init_code = build_aggr_init_full_exprs (decl, init, flags); + + /* If this is a constexpr initializer, expand_default_init will + have returned an INIT_EXPR rather than a CALL_EXPR. In that + case, pull the initializer back out and pass it down into + store_init_value. */ + while (TREE_CODE (init_code) == EXPR_STMT + || TREE_CODE (init_code) == CONVERT_EXPR) + init_code = TREE_OPERAND (init_code, 0); + if (TREE_CODE (init_code) == INIT_EXPR) + { + init = TREE_OPERAND (init_code, 1); + init_code = NULL_TREE; + /* Don't call digest_init; it's unnecessary and will complain + about aggregate initialization of non-aggregate classes. */ + flags |= LOOKUP_ALREADY_DIGESTED; + } + else if (DECL_DECLARED_CONSTEXPR_P (decl)) + { + /* Declared constexpr, but no suitable initializer; massage + init appropriately so we can pass it into store_init_value + for the error. */ + if (init && BRACE_ENCLOSED_INITIALIZER_P (init)) + init = finish_compound_literal (type, init); + else if (CLASS_TYPE_P (type) + && (!init || TREE_CODE (init) == TREE_LIST)) + { + init = build_functional_cast (type, init, tf_none); + if (init != error_mark_node) + TARGET_EXPR_DIRECT_INIT_P (init) = true; + } + init_code = NULL_TREE; + } + else + init = NULL_TREE; + } + + if (init && TREE_CODE (init) != TREE_VEC) + { + init_code = store_init_value (decl, init, flags); + if (pedantic && TREE_CODE (type) == ARRAY_TYPE + && DECL_INITIAL (decl) + && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST + && PAREN_STRING_LITERAL_P (DECL_INITIAL (decl))) + warning (0, "array %qD initialized by parenthesized string literal %qE", + decl, DECL_INITIAL (decl)); + init = NULL; + } + } + else + { + if (CLASS_TYPE_P (core_type = strip_array_types (type)) + && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type) + || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))) + diagnose_uninitialized_cst_or_ref_member (core_type, /*using_new=*/false, + /*complain=*/true); + + check_for_uninitialized_const_var (decl); + } + + if (init && init != error_mark_node) + init_code = build2 (INIT_EXPR, type, decl, init); + + if (extra_init) + init_code = add_stmt_to_compound (extra_init, init_code); + + if (init_code && DECL_IN_AGGR_P (decl)) + { + static int explained = 0; + + if (cxx_dialect < cxx0x) + error ("initializer invalid for static member with constructor"); + else + error ("non-constant in-class initialization invalid for static " + "member %qD", decl); + if (!explained) + { + error ("(an out of class initialization is required)"); + explained = 1; + } + } + + 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; + const char *filename; + + /* Set the DECL_ASSEMBLER_NAME for the object. */ + if (asmspec) + { + /* The `register' keyword, when used together with an + asm-specification, indicates that the variable should be + placed in a particular register. */ + if (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)) + { + set_user_assembler_name (decl, asmspec); + DECL_HARD_REGISTER (decl) = 1; + } + else + { + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) + set_builtin_user_assembler_name (decl, asmspec); + set_user_assembler_name (decl, asmspec); + } + } + + /* Handle non-variables up front. */ + if (TREE_CODE (decl) != VAR_DECL) + { + rest_of_decl_compilation (decl, toplev, at_eof); + return; + } + + /* If we see a class member here, it should be a static data + member. */ + if (DECL_LANG_SPECIFIC (decl) && DECL_IN_AGGR_P (decl)) + { + gcc_assert (TREE_STATIC (decl)); + /* An in-class declaration of a static data member should be + external; it is only a declaration, and not a definition. */ + if (init == NULL_TREE) + gcc_assert (DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)); + } + + /* We don't create any RTL for local variables. */ + if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl)) + return; + + /* We defer emission of local statics until the corresponding + DECL_EXPR is expanded. */ + defer_p = DECL_FUNCTION_SCOPE_P (decl) || DECL_VIRTUAL_P (decl); + + /* We try to defer namespace-scope static constants so that they are + not emitted into the object file unnecessarily. */ + filename = input_filename; + if (!DECL_VIRTUAL_P (decl) + && TREE_READONLY (decl) + && DECL_INITIAL (decl) != NULL_TREE + && DECL_INITIAL (decl) != error_mark_node + && filename != NULL + && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)) + && toplev + && !TREE_PUBLIC (decl)) + { + /* Fool with the linkage of static consts according to #pragma + interface. */ + struct c_fileinfo *finfo = get_fileinfo (filename); + if (!finfo->interface_unknown && !TREE_PUBLIC (decl)) + { + TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) = finfo->interface_only; + } + + defer_p = 1; + } + /* Likewise for template instantiations. */ + else if (DECL_LANG_SPECIFIC (decl) + && DECL_IMPLICIT_INSTANTIATION (decl)) + defer_p = 1; + + /* If we're not deferring, go ahead and assemble the variable. */ + if (!defer_p) + rest_of_decl_compilation (decl, toplev, at_eof); +} + +/* walk_tree helper for wrap_temporary_cleanups, below. */ + +static tree +wrap_cleanups_r (tree *stmt_p, int *walk_subtrees, void *data) +{ + if (TYPE_P (*stmt_p)) + { + *walk_subtrees = 0; + return NULL_TREE; + } + + if (TREE_CODE (*stmt_p) == TARGET_EXPR) + { + tree guard = (tree)data; + tree tcleanup = TARGET_EXPR_CLEANUP (*stmt_p); + + tcleanup = build2 (TRY_CATCH_EXPR, void_type_node, tcleanup, guard); + /* Tell honor_protect_cleanup_actions to handle this as a separate + cleanup. */ + TRY_CATCH_IS_CLEANUP (tcleanup) = 1; + + TARGET_EXPR_CLEANUP (*stmt_p) = tcleanup; + } + + return NULL_TREE; +} + +/* We're initializing a local variable which has a cleanup GUARD. If there + are any temporaries used in the initializer INIT of this variable, we + need to wrap their cleanups with TRY_CATCH_EXPR (, GUARD) so that the + variable will be cleaned up properly if one of them throws. + + Unfortunately, there's no way to express this properly in terms of + nesting, as the regions for the temporaries overlap the region for the + variable itself; if there are two temporaries, the variable needs to be + the first thing destroyed if either of them throws. However, we only + want to run the variable's cleanup if it actually got constructed. So + we need to guard the temporary cleanups with the variable's cleanup if + they are run on the normal path, but not if they are run on the + exceptional path. We implement this by telling + honor_protect_cleanup_actions to strip the variable cleanup from the + exceptional path. */ + +static void +wrap_temporary_cleanups (tree init, tree guard) +{ + cp_walk_tree_without_duplicates (&init, wrap_cleanups_r, (void *)guard); +} + +/* Generate code to initialize DECL (a local variable). */ + +static void +initialize_local_var (tree decl, tree init) +{ + tree type = TREE_TYPE (decl); + tree cleanup; + int already_used; + + gcc_assert (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == RESULT_DECL); + gcc_assert (!TREE_STATIC (decl)); + + if (DECL_SIZE (decl) == NULL_TREE) + { + /* If we used it already as memory, it must stay in memory. */ + DECL_INITIAL (decl) = NULL_TREE; + TREE_ADDRESSABLE (decl) = TREE_USED (decl); + return; + } + + if (type == error_mark_node) + return; + + /* Compute and store the initial value. */ + already_used = TREE_USED (decl) || TREE_USED (type); + if (TREE_USED (type)) + DECL_READ_P (decl) = 1; + + /* Generate a cleanup, if necessary. */ + cleanup = cxx_maybe_build_cleanup (decl); + + /* Perform the initialization. */ + if (init) + { + int saved_stmts_are_full_exprs_p; + + /* If we're only initializing a single object, guard the destructors + of any temporaries used in its initializer with its destructor. + This isn't right for arrays because each element initialization is + a full-expression. */ + if (cleanup && TREE_CODE (type) != ARRAY_TYPE) + wrap_temporary_cleanups (init, cleanup); + + gcc_assert (building_stmt_tree ()); + saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); + current_stmt_tree ()->stmts_are_full_exprs_p = 1; + finish_expr_stmt (init); + current_stmt_tree ()->stmts_are_full_exprs_p = + saved_stmts_are_full_exprs_p; + } + + /* Set this to 0 so we can tell whether an aggregate which was + initialized was ever used. Don't do this if it has a + destructor, so we don't complain about the 'resource + allocation is initialization' idiom. Now set + attribute((unused)) on types so decls of that type will be + marked used. (see TREE_USED, above.) */ + if (TYPE_NEEDS_CONSTRUCTING (type) + && ! already_used + && TYPE_HAS_TRIVIAL_DESTRUCTOR (type) + && DECL_NAME (decl)) + TREE_USED (decl) = 0; + else if (already_used) + TREE_USED (decl) = 1; + + if (cleanup) + finish_decl_cleanup (decl, cleanup); +} + +/* DECL is a VAR_DECL for a compiler-generated variable with static + storage duration (like a virtual table) whose initializer is a + compile-time constant. Initialize the variable and provide it to the + back end. */ + +void +initialize_artificial_var (tree decl, VEC(constructor_elt,gc) *v) +{ + tree init; + gcc_assert (DECL_ARTIFICIAL (decl)); + init = build_constructor (TREE_TYPE (decl), v); + gcc_assert (TREE_CODE (init) == CONSTRUCTOR); + DECL_INITIAL (decl) = init; + DECL_INITIALIZED_P (decl) = 1; + determine_visibility (decl); + layout_var_decl (decl); + maybe_commonize_var (decl); + make_rtl_for_nonlocal_decl (decl, init, /*asmspec=*/NULL); +} + +/* INIT is the initializer for a variable, as represented by the + parser. Returns true iff INIT is value-dependent. */ + +static bool +value_dependent_init_p (tree init) +{ + if (TREE_CODE (init) == TREE_LIST) + /* A parenthesized initializer, e.g.: int i (3, 2); ? */ + return any_value_dependent_elements_p (init); + else if (TREE_CODE (init) == CONSTRUCTOR) + /* A brace-enclosed initializer, e.g.: int i = { 3 }; ? */ + { + VEC(constructor_elt, gc) *elts; + size_t nelts; + size_t i; + + elts = CONSTRUCTOR_ELTS (init); + nelts = VEC_length (constructor_elt, elts); + for (i = 0; i < nelts; ++i) + if (value_dependent_init_p (VEC_index (constructor_elt, + elts, i)->value)) + return true; + } + else + /* It must be a simple expression, e.g., int i = 3; */ + return value_dependent_expression_p (init); + + return false; +} + +/* Finish processing of a declaration; + install its line number and initial value. + If the length of an array type is not known before, + it must be determined now, from the initial value, or it is an error. + + INIT is the initializer (if any) for DECL. If INIT_CONST_EXPR_P is + true, then INIT is an integral constant expression. + + FLAGS is LOOKUP_ONLYCONVERTING if the = init syntax was used, else 0 + if the (init) syntax was used. */ + +void +cp_finish_decl (tree decl, tree init, bool init_const_expr_p, + tree asmspec_tree, int flags) +{ + tree type; + tree cleanup; + const char *asmspec = NULL; + int was_readonly = 0; + bool var_definition_p = false; + tree auto_node; + + if (decl == error_mark_node) + return; + else if (! decl) + { + if (init) + error ("assignment (not initialization) in declaration"); + return; + } + + gcc_assert (TREE_CODE (decl) != RESULT_DECL); + /* Parameters are handled by store_parm_decls, not cp_finish_decl. */ + gcc_assert (TREE_CODE (decl) != PARM_DECL); + + type = TREE_TYPE (decl); + if (type == error_mark_node) + 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 != error_mark_node) + asmspec = TREE_STRING_POINTER (asmspec_tree); + + if (current_class_type + && CP_DECL_CONTEXT (decl) == current_class_type + && TYPE_BEING_DEFINED (current_class_type) + && (DECL_INITIAL (decl) || init)) + DECL_INITIALIZED_IN_CLASS_P (decl) = 1; + + auto_node = type_uses_auto (type); + if (auto_node) + { + tree d_init; + if (init == NULL_TREE) + { + error ("declaration of %q#D has no initializer", decl); + TREE_TYPE (decl) = error_mark_node; + return; + } + d_init = init; + if (TREE_CODE (d_init) == TREE_LIST) + d_init = build_x_compound_expr_from_list (d_init, ELK_INIT, + tf_warning_or_error); + d_init = resolve_nondeduced_context (d_init); + if (describable_type (d_init)) + { + type = TREE_TYPE (decl) = do_auto_deduction (type, d_init, + auto_node); + if (type == error_mark_node) + return; + } + } + + if (!ensure_literal_type_for_constexpr_object (decl)) + DECL_DECLARED_CONSTEXPR_P (decl) = 0; + + if (init && TREE_CODE (decl) == FUNCTION_DECL) + { + tree clone; + if (init == ridpointers[(int)RID_DELETE]) + { + /* FIXME check this is 1st decl. */ + DECL_DELETED_FN (decl) = 1; + DECL_DECLARED_INLINE_P (decl) = 1; + DECL_INITIAL (decl) = error_mark_node; + FOR_EACH_CLONE (clone, decl) + { + DECL_DELETED_FN (clone) = 1; + DECL_DECLARED_INLINE_P (clone) = 1; + DECL_INITIAL (clone) = error_mark_node; + } + init = NULL_TREE; + } + else if (init == ridpointers[(int)RID_DEFAULT]) + { + if (defaultable_fn_check (decl)) + DECL_DEFAULTED_FN (decl) = 1; + else + DECL_INITIAL (decl) = NULL_TREE; + } + } + + if (init && TREE_CODE (decl) == VAR_DECL) + { + DECL_NONTRIVIALLY_INITIALIZED_P (decl) = 1; + if (init_const_expr_p) + { + /* Set these flags now for templates. We'll update the flags in + store_init_value for instantiations. */ + DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1; + if (decl_maybe_constant_var_p (decl)) + TREE_CONSTANT (decl) = 1; + } + } + + if (processing_template_decl) + { + bool type_dependent_p; + + /* Add this declaration to the statement-tree. */ + if (at_function_scope_p ()) + add_decl_expr (decl); + + type_dependent_p = dependent_type_p (type); + + if (check_for_bare_parameter_packs (init)) + { + init = NULL_TREE; + DECL_INITIAL (decl) = NULL_TREE; + } + + /* Generally, initializers in templates are expanded when the + template is instantiated. But, if DECL is a variable constant + then it can be used in future constant expressions, so its value + must be available. */ + if (init + && init_const_expr_p + && !type_dependent_p + && decl_maybe_constant_var_p (decl) + && !value_dependent_init_p (init)) + { + tree init_code = check_initializer (decl, init, flags, &cleanup); + if (init_code == NULL_TREE) + init = NULL_TREE; + } + else if (TREE_CODE (decl) == VAR_DECL + && !DECL_PRETTY_FUNCTION_P (decl) + && !type_dependent_p) + maybe_deduce_size_from_array_init (decl, init); + + if (init) + DECL_INITIAL (decl) = init; + return; + } + + /* Take care of TYPE_DECLs up front. */ + if (TREE_CODE (decl) == TYPE_DECL) + { + if (type != error_mark_node + && MAYBE_CLASS_TYPE_P (type) && DECL_NAME (decl)) + { + if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) + warning (0, "shadowing previous type declaration of %q#D", decl); + set_identifier_type_value (DECL_NAME (decl), decl); + } + + /* If we have installed this as the canonical typedef for this + type, and that type has not been defined yet, delay emitting + the debug information for it, as we will emit it later. */ + if (TYPE_MAIN_DECL (TREE_TYPE (decl)) == decl + && !COMPLETE_TYPE_P (TREE_TYPE (decl))) + TYPE_DECL_SUPPRESS_DEBUG (decl) = 1; + + rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl), + at_eof); + return; + } + + /* A reference will be modified here, as it is initialized. */ + if (! DECL_EXTERNAL (decl) + && TREE_READONLY (decl) + && TREE_CODE (type) == REFERENCE_TYPE) + { + was_readonly = 1; + TREE_READONLY (decl) = 0; + } + + if (TREE_CODE (decl) == VAR_DECL) + { + /* Only variables with trivial initialization and destruction can + have thread-local storage. */ + if (DECL_THREAD_LOCAL_P (decl) + && (type_has_nontrivial_default_init (TREE_TYPE (decl)) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) + error ("%qD cannot be thread-local because it has non-trivial " + "type %qT", decl, TREE_TYPE (decl)); + /* If this is a local variable that will need a mangled name, + register it now. We must do this before processing the + initializer for the variable, since the initialization might + require a guard variable, and since the mangled name of the + guard variable will depend on the mangled name of this + variable. */ + if (DECL_FUNCTION_SCOPE_P (decl) + && TREE_STATIC (decl) + && !DECL_ARTIFICIAL (decl)) + { + push_local_name (decl); + if (DECL_CONSTRUCTOR_P (current_function_decl) + || DECL_DESTRUCTOR_P (current_function_decl)) + /* Normally local_decls is populated during GIMPLE lowering, + but [cd]tors are never actually compiled directly. We need + to put statics on the list so we can deal with the label + address extension. */ + add_local_decl (cfun, decl); + } + + /* Convert the initializer to the type of DECL, if we have not + already initialized DECL. */ + if (!DECL_INITIALIZED_P (decl) + /* If !DECL_EXTERNAL then DECL is being defined. In the + case of a static data member initialized inside the + class-specifier, there can be an initializer even if DECL + is *not* defined. */ + && (!DECL_EXTERNAL (decl) || init)) + { + if (TYPE_FOR_JAVA (type) && MAYBE_CLASS_TYPE_P (type)) + { + tree jclass + = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass")); + /* Allow libjava/prims.cc define primitive classes. */ + if (init != NULL_TREE + || jclass == NULL_TREE + || TREE_CODE (jclass) != TYPE_DECL + || !POINTER_TYPE_P (TREE_TYPE (jclass)) + || !same_type_ignoring_top_level_qualifiers_p + (type, TREE_TYPE (TREE_TYPE (jclass)))) + error ("Java object %qD not allocated with %", decl); + init = NULL_TREE; + } + init = check_initializer (decl, init, flags, &cleanup); + /* Thread-local storage cannot be dynamically initialized. */ + if (DECL_THREAD_LOCAL_P (decl) && init) + { + error ("%qD is thread-local and so cannot be dynamically " + "initialized", decl); + init = NULL_TREE; + } + + /* Check that the initializer for a static data member was a + constant. Although we check in the parser that the + initializer is an integral constant expression, we do not + simplify division-by-zero at the point at which it + occurs. Therefore, in: + + struct S { static const int i = 7 / 0; }; + + we issue an error at this point. It would + probably be better to forbid division by zero in + integral constant expressions. */ + if (DECL_EXTERNAL (decl) && init) + { + error ("%qD cannot be initialized by a non-constant expression" + " when being declared", decl); + DECL_INITIALIZED_IN_CLASS_P (decl) = 0; + init = NULL_TREE; + } + + /* Handle: + + [dcl.init] + + The memory occupied by any object of static storage + duration is zero-initialized at program startup before + any other initialization takes place. + + We cannot create an appropriate initializer until after + the type of DECL is finalized. If DECL_INITIAL is set, + then the DECL is statically initialized, and any + necessary zero-initialization has already been performed. */ + if (TREE_STATIC (decl) && !DECL_INITIAL (decl)) + DECL_INITIAL (decl) = build_zero_init (TREE_TYPE (decl), + /*nelts=*/NULL_TREE, + /*static_storage_p=*/true); + /* Remember that the initialization for this variable has + taken place. */ + DECL_INITIALIZED_P (decl) = 1; + /* This declaration is the definition of this variable, + unless we are initializing a static data member within + the class specifier. */ + if (!DECL_EXTERNAL (decl)) + var_definition_p = true; + } + /* If the variable has an array type, lay out the type, even if + there is no initializer. It is valid to index through the + array, and we must get TYPE_ALIGN set correctly on the array + type. */ + else if (TREE_CODE (type) == ARRAY_TYPE) + layout_type (type); + + if (TREE_STATIC (decl) + && !at_function_scope_p () + && current_function_decl == NULL) + /* So decl is a global variable or a static member of a + non local class. Record the types it uses + so that we can decide later to emit debug info for them. */ + record_types_used_by_current_var_decl (decl); + } + else if (TREE_CODE (decl) == FIELD_DECL + && TYPE_FOR_JAVA (type) && MAYBE_CLASS_TYPE_P (type)) + error ("non-static data member %qD has Java class type", decl); + + /* Add this declaration to the statement-tree. This needs to happen + after the call to check_initializer so that the DECL_EXPR for a + reference temp is added before the DECL_EXPR for the reference itself. */ + if (at_function_scope_p ()) + add_decl_expr (decl); + + /* Let the middle end know about variables and functions -- but not + static data members in uninstantiated class templates. */ + if (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL) + { + if (TREE_CODE (decl) == VAR_DECL) + { + layout_var_decl (decl); + maybe_commonize_var (decl); + } + + /* This needs to happen after the linkage is set. */ + determine_visibility (decl); + + if (var_definition_p && TREE_STATIC (decl)) + { + /* If a TREE_READONLY variable needs initialization + at runtime, it is no longer readonly and we need to + avoid MEM_READONLY_P being set on RTL created for it. */ + if (init) + { + if (TREE_READONLY (decl)) + TREE_READONLY (decl) = 0; + was_readonly = 0; + } + else if (was_readonly) + TREE_READONLY (decl) = 1; + } + + make_rtl_for_nonlocal_decl (decl, init, asmspec); + + /* Check for abstractness of the type. Notice that there is no + need to strip array types here since the check for those types + is already done within create_array_type_for_decl. */ + if (TREE_CODE (type) == FUNCTION_TYPE + || TREE_CODE (type) == METHOD_TYPE) + abstract_virtuals_error (decl, TREE_TYPE (type)); + else + abstract_virtuals_error (decl, type); + + if (TREE_TYPE (decl) == error_mark_node) + /* No initialization required. */ + ; + else if (TREE_CODE (decl) == FUNCTION_DECL) + { + if (init) + { + if (init == ridpointers[(int)RID_DEFAULT]) + { + /* An out-of-class default definition is defined at + the point where it is explicitly defaulted. */ + if (DECL_DELETED_FN (decl)) + maybe_explain_implicit_delete (decl); + else if (DECL_INITIAL (decl) == error_mark_node) + synthesize_method (decl); + } + else + error ("function %q#D is initialized like a variable", decl); + } + /* else no initialization required. */ + } + else if (DECL_EXTERNAL (decl) + && ! (DECL_LANG_SPECIFIC (decl) + && DECL_NOT_REALLY_EXTERN (decl))) + { + if (init) + DECL_INITIAL (decl) = init; + } + /* A variable definition. */ + else if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl)) + /* Initialize the local variable. */ + initialize_local_var (decl, init); + + /* If a variable is defined, and then a subsequent + definition with external linkage is encountered, we will + get here twice for the same variable. We want to avoid + calling expand_static_init more than once. For variables + that are not static data members, we can call + expand_static_init only when we actually process the + initializer. It is not legal to redeclare a static data + member, so this issue does not arise in that case. */ + else if (var_definition_p && TREE_STATIC (decl)) + expand_static_init (decl, init); + } + + /* If a CLEANUP_STMT was created to destroy a temporary bound to a + reference, insert it in the statement-tree now. */ + if (cleanup) + push_cleanup (decl, cleanup, false); + + if (was_readonly) + TREE_READONLY (decl) = 1; +} + +/* Returns a declaration for a VAR_DECL as if: + + extern "C" TYPE NAME; + + had been seen. Used to create compiler-generated global + variables. */ + +static tree +declare_global_var (tree name, tree type) +{ + tree decl; + + push_to_top_level (); + decl = build_decl (input_location, VAR_DECL, name, type); + TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + /* If the user has explicitly declared this variable (perhaps + because the code we are compiling is part of a low-level runtime + library), then it is possible that our declaration will be merged + with theirs by pushdecl. */ + decl = pushdecl (decl); + cp_finish_decl (decl, NULL_TREE, false, NULL_TREE, 0); + pop_from_top_level (); + + return decl; +} + +/* Returns the type for the argument to "__cxa_atexit" (or "atexit", + if "__cxa_atexit" is not being used) corresponding to the function + to be called when the program exits. */ + +static tree +get_atexit_fn_ptr_type (void) +{ + tree fn_type; + + if (!atexit_fn_ptr_type_node) + { + tree arg_type; + if (flag_use_cxa_atexit + && !targetm.cxx.use_atexit_for_cxa_atexit ()) + /* The parameter to "__cxa_atexit" is "void (*)(void *)". */ + arg_type = ptr_type_node; + else + /* The parameter to "atexit" is "void (*)(void)". */ + arg_type = NULL_TREE; + + fn_type = build_function_type_list (void_type_node, + arg_type, NULL_TREE); + atexit_fn_ptr_type_node = build_pointer_type (fn_type); + } + + return atexit_fn_ptr_type_node; +} + +/* Returns a pointer to the `atexit' function. Note that if + FLAG_USE_CXA_ATEXIT is nonzero, then this will actually be the new + `__cxa_atexit' function specified in the IA64 C++ ABI. */ + +static tree +get_atexit_node (void) +{ + tree atexit_fndecl; + tree fn_type; + tree fn_ptr_type; + const char *name; + bool use_aeabi_atexit; + + if (atexit_node) + return atexit_node; + + if (flag_use_cxa_atexit && !targetm.cxx.use_atexit_for_cxa_atexit ()) + { + /* The declaration for `__cxa_atexit' is: + + int __cxa_atexit (void (*)(void *), void *, void *) + + We build up the argument types and then the function type + itself. */ + tree argtype0, argtype1, argtype2; + + use_aeabi_atexit = targetm.cxx.use_aeabi_atexit (); + /* First, build the pointer-to-function type for the first + argument. */ + fn_ptr_type = get_atexit_fn_ptr_type (); + /* Then, build the rest of the argument types. */ + argtype2 = ptr_type_node; + if (use_aeabi_atexit) + { + argtype1 = fn_ptr_type; + argtype0 = ptr_type_node; + } + else + { + argtype1 = ptr_type_node; + argtype0 = fn_ptr_type; + } + /* And the final __cxa_atexit type. */ + fn_type = build_function_type_list (integer_type_node, + argtype0, argtype1, argtype2, + NULL_TREE); + fn_ptr_type = build_pointer_type (fn_type); + if (use_aeabi_atexit) + name = "__aeabi_atexit"; + else + name = "__cxa_atexit"; + } + else + { + /* The declaration for `atexit' is: + + int atexit (void (*)()); + + We build up the argument types and then the function type + itself. */ + fn_ptr_type = get_atexit_fn_ptr_type (); + /* Build the final atexit type. */ + fn_type = build_function_type_list (integer_type_node, + fn_ptr_type, NULL_TREE); + name = "atexit"; + } + + /* Now, build the function declaration. */ + push_lang_context (lang_name_c); + 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; +} + +/* Returns the __dso_handle VAR_DECL. */ + +static tree +get_dso_handle_node (void) +{ + if (dso_handle_node) + return dso_handle_node; + + /* Declare the variable. */ + dso_handle_node = declare_global_var (get_identifier ("__dso_handle"), + ptr_type_node); + + return dso_handle_node; +} + +/* 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) +{ + char name[32]; + tree fntype; + tree fndecl; + bool use_cxa_atexit = flag_use_cxa_atexit + && !targetm.cxx.use_atexit_for_cxa_atexit (); + + push_to_top_level (); + + /* No need to mangle this. */ + push_lang_context (lang_name_c); + + /* Build the name of the function. */ + sprintf (name, "__tcf_%d", start_cleanup_cnt++); + /* Build the function declaration. */ + fntype = TREE_TYPE (get_atexit_fn_ptr_type ()); + fndecl = build_lang_decl (FUNCTION_DECL, get_identifier (name), fntype); + /* It's a function with internal linkage, generated by the + compiler. */ + TREE_PUBLIC (fndecl) = 0; + DECL_ARTIFICIAL (fndecl) = 1; + /* Make the function `inline' so that it is only emitted if it is + actually needed. It is unlikely that it will be inlined, since + it is only called via a function pointer, but we avoid unnecessary + emissions this way. */ + DECL_DECLARED_INLINE_P (fndecl) = 1; + DECL_INTERFACE_KNOWN (fndecl) = 1; + /* Build the parameter. */ + if (use_cxa_atexit) + { + tree parmdecl; + + parmdecl = cp_build_parm_decl (NULL_TREE, ptr_type_node); + DECL_CONTEXT (parmdecl) = fndecl; + TREE_USED (parmdecl) = 1; + DECL_READ_P (parmdecl) = 1; + DECL_ARGUMENTS (fndecl) = parmdecl; + } + + pushdecl (fndecl); + start_preparsed_function (fndecl, NULL_TREE, SF_PRE_PARSED); + + pop_lang_context (); + + return current_function_decl; +} + +/* 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 (); +} + +/* Generate code to handle the destruction of DECL, an object with + static storage duration. */ + +tree +register_dtor_fn (tree decl) +{ + tree cleanup; + tree compound_stmt; + tree fcall; + tree type; + bool use_dtor; + tree arg0, arg1 = NULL_TREE, arg2 = NULL_TREE; + + type = TREE_TYPE (decl); + if (TYPE_HAS_TRIVIAL_DESTRUCTOR (type)) + return void_zero_node; + + /* If we're using "__cxa_atexit" (or "__aeabi_atexit"), and DECL is + a class object, we can just pass the destructor to + "__cxa_atexit"; we don't have to build a temporary function to do + the cleanup. */ + use_dtor = (flag_use_cxa_atexit + && !targetm.cxx.use_atexit_for_cxa_atexit () + && CLASS_TYPE_P (type)); + if (use_dtor) + { + int idx; + + /* Find the destructor. */ + idx = lookup_fnfields_1 (type, complete_dtor_identifier); + gcc_assert (idx >= 0); + cleanup = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), idx); + /* Make sure it is accessible. */ + perform_or_defer_access_check (TYPE_BINFO (type), cleanup, cleanup); + } + else + { + /* Call build_cleanup before we enter the anonymous function so + that any access checks will be done relative to the current + scope, rather than the scope of the anonymous function. */ + build_cleanup (decl); + + /* Now start the function. */ + cleanup = start_cleanup_fn (); + + /* Now, recompute the cleanup. It may contain SAVE_EXPRs that refer + 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 (BCS_FN_BODY); + finish_expr_stmt (fcall); + finish_compound_stmt (compound_stmt); + end_cleanup_fn (); + } + + /* Call atexit with the cleanup function. */ + mark_used (cleanup); + cleanup = build_address (cleanup); + if (flag_use_cxa_atexit && !targetm.cxx.use_atexit_for_cxa_atexit ()) + { + tree addr; + + if (use_dtor) + { + /* We must convert CLEANUP to the type that "__cxa_atexit" + expects. */ + cleanup = build_nop (get_atexit_fn_ptr_type (), cleanup); + /* "__cxa_atexit" will pass the address of DECL to the + cleanup function. */ + mark_used (decl); + addr = build_address (decl); + /* The declared type of the parameter to "__cxa_atexit" is + "void *". For plain "T*", we could just let the + machinery in cp_build_function_call convert it -- but if the + type is "cv-qualified T *", then we need to convert it + before passing it in, to avoid spurious errors. */ + addr = build_nop (ptr_type_node, addr); + } + else + /* Since the cleanup functions we build ignore the address + they're given, there's no reason to pass the actual address + in, and, in general, it's cheaper to pass NULL than any + other value. */ + addr = null_pointer_node; + arg2 = cp_build_addr_expr (get_dso_handle_node (), + tf_warning_or_error); + if (targetm.cxx.use_aeabi_atexit ()) + { + arg1 = cleanup; + arg0 = addr; + } + else + { + arg1 = addr; + arg0 = cleanup; + } + } + else + arg0 = cleanup; + return cp_build_function_call_nary (get_atexit_node (), tf_warning_or_error, + arg0, arg1, arg2, NULL_TREE); +} + +/* DECL is a VAR_DECL with static storage duration. INIT, if present, + is its initializer. Generate code to handle the construction + and destruction of DECL. */ + +static void +expand_static_init (tree decl, tree init) +{ + gcc_assert (TREE_CODE (decl) == VAR_DECL); + gcc_assert (TREE_STATIC (decl)); + + /* Some variables require no dynamic initialization. */ + if (!init + && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) + return; + + if (DECL_FUNCTION_SCOPE_P (decl)) + { + /* Emit code to perform this initialization but once. */ + tree if_stmt = NULL_TREE, inner_if_stmt = NULL_TREE; + tree then_clause = NULL_TREE, inner_then_clause = NULL_TREE; + tree guard, guard_addr; + tree acquire_fn, release_fn, abort_fn; + tree flag, begin; + + /* Emit code to perform this initialization but once. This code + looks like: + + static guard; + if (!guard.first_byte) { + if (__cxa_guard_acquire (&guard)) { + bool flag = false; + try { + // Do initialization. + flag = true; __cxa_guard_release (&guard); + // Register variable for destruction at end of program. + } catch { + if (!flag) __cxa_guard_abort (&guard); + } + } + + Note that the `flag' variable is only set to 1 *after* the + initialization is complete. This ensures that an exception, + thrown during the construction, will cause the variable to + reinitialized when we pass through this code again, as per: + + [stmt.dcl] + + If the initialization exits by throwing an exception, the + initialization is not complete, so it will be tried again + the next time control enters the declaration. + + This process should be thread-safe, too; multiple threads + should not be able to initialize the variable more than + once. */ + + /* Create the guard variable. */ + guard = get_guard (decl); + + /* This optimization isn't safe on targets with relaxed memory + consistency. On such targets we force synchronization in + __cxa_guard_acquire. */ + if (!targetm.relaxed_ordering || !flag_threadsafe_statics) + { + /* Begin the conditional initialization. */ + if_stmt = begin_if_stmt (); + finish_if_stmt_cond (get_guard_cond (guard), if_stmt); + then_clause = begin_compound_stmt (BCS_NO_SCOPE); + } + + if (flag_threadsafe_statics) + { + guard_addr = build_address (guard); + + acquire_fn = get_identifier ("__cxa_guard_acquire"); + release_fn = get_identifier ("__cxa_guard_release"); + abort_fn = get_identifier ("__cxa_guard_abort"); + if (!get_global_value_if_present (acquire_fn, &acquire_fn)) + { + tree vfntype = build_function_type_list (void_type_node, + TREE_TYPE (guard_addr), + NULL_TREE); + acquire_fn = push_library_fn + (acquire_fn, build_function_type_list (integer_type_node, + TREE_TYPE (guard_addr), + NULL_TREE), + NULL_TREE); + release_fn = push_library_fn (release_fn, vfntype, NULL_TREE); + abort_fn = push_library_fn (abort_fn, vfntype, NULL_TREE); + } + else + { + release_fn = identifier_global_value (release_fn); + abort_fn = identifier_global_value (abort_fn); + } + + inner_if_stmt = begin_if_stmt (); + finish_if_stmt_cond (build_call_n (acquire_fn, 1, guard_addr), + inner_if_stmt); + + inner_then_clause = begin_compound_stmt (BCS_NO_SCOPE); + begin = get_target_expr (boolean_false_node); + flag = TARGET_EXPR_SLOT (begin); + + TARGET_EXPR_CLEANUP (begin) + = build3 (COND_EXPR, void_type_node, flag, + void_zero_node, + build_call_n (abort_fn, 1, guard_addr)); + CLEANUP_EH_ONLY (begin) = 1; + + /* Do the initialization itself. */ + init = add_stmt_to_compound (begin, init); + init = add_stmt_to_compound + (init, build2 (MODIFY_EXPR, void_type_node, flag, boolean_true_node)); + init = add_stmt_to_compound + (init, build_call_n (release_fn, 1, guard_addr)); + } + else + init = add_stmt_to_compound (init, set_guard (guard)); + + /* Use atexit to register a function for destroying this static + variable. */ + init = add_stmt_to_compound (init, register_dtor_fn (decl)); + + finish_expr_stmt (init); + + if (flag_threadsafe_statics) + { + finish_compound_stmt (inner_then_clause); + finish_then_clause (inner_if_stmt); + finish_if_stmt (inner_if_stmt); + } + + if (!targetm.relaxed_ordering || !flag_threadsafe_statics) + { + finish_compound_stmt (then_clause); + finish_then_clause (if_stmt); + finish_if_stmt (if_stmt); + } + } + else + static_aggregates = tree_cons (init, decl, static_aggregates); +} + + +/* Make TYPE a complete type based on INITIAL_VALUE. + Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, + 2 if there was no information (in which case assume 0 if DO_DEFAULT), + 3 if the initializer list is empty (in pedantic mode). */ + +int +cp_complete_array_type (tree *ptype, tree initial_value, bool do_default) +{ + int failure; + tree type, elt_type; + + if (initial_value) + { + unsigned HOST_WIDE_INT i; + tree value; + + /* An array of character type can be initialized from a + brace-enclosed string constant. + + FIXME: this code is duplicated from reshape_init. Probably + we should just call reshape_init here? */ + if (char_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (*ptype))) + && TREE_CODE (initial_value) == CONSTRUCTOR + && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (initial_value))) + { + VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (initial_value); + tree value = VEC_index (constructor_elt, v, 0)->value; + + if (TREE_CODE (value) == STRING_CST + && VEC_length (constructor_elt, v) == 1) + initial_value = value; + } + + /* If any of the elements are parameter packs, we can't actually + complete this type now because the array size is dependent. */ + if (TREE_CODE (initial_value) == CONSTRUCTOR) + { + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (initial_value), + i, value) + { + if (PACK_EXPANSION_P (value)) + return 0; + } + } + } + + failure = complete_array_type (ptype, initial_value, do_default); + + /* We can create the array before the element type is complete, which + means that we didn't have these two bits set in the original type + either. In completing the type, we are expected to propagate these + bits. See also complete_type which does the same thing for arrays + of fixed size. */ + type = *ptype; + if (TYPE_DOMAIN (type)) + { + elt_type = TREE_TYPE (type); + TYPE_NEEDS_CONSTRUCTING (type) = TYPE_NEEDS_CONSTRUCTING (elt_type); + TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type) + = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (elt_type); + } + + return failure; +} + +/* Return zero if something is declared to be a member of type + CTYPE when in the context of CUR_TYPE. STRING is the error + 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) + { + if (flags == DTOR_FLAG) + error ("destructor for alien class %qT cannot be a member", ctype); + else + error ("constructor for alien class %qT cannot be a member", ctype); + return 0; + } + return 1; +} + +/* Subroutine of `grokdeclarator'. */ + +/* Generate errors possibly applicable for a given set of specifiers. + This is for ARM $7.1.2. */ + +static void +bad_specifiers (tree object, + enum bad_spec_place type, + int virtualp, + int quals, + int inlinep, + int friendp, + int raises) +{ + switch (type) + { + case BSP_VAR: + if (virtualp) + error ("%qD declared as a % variable", object); + if (inlinep) + error ("%qD declared as an % variable", object); + if (quals) + error ("% and % function specifiers on " + "%qD invalid in variable declaration", object); + break; + case BSP_PARM: + if (virtualp) + error ("%qD declared as a % parameter", object); + if (inlinep) + error ("%qD declared as an % parameter", object); + if (quals) + error ("% and % function specifiers on " + "%qD invalid in parameter declaration", object); + break; + case BSP_TYPE: + if (virtualp) + error ("%qD declared as a % type", object); + if (inlinep) + error ("%qD declared as an % type", object); + if (quals) + error ("% and % function specifiers on " + "%qD invalid in type declaration", object); + break; + case BSP_FIELD: + if (virtualp) + error ("%qD declared as a % field", object); + if (inlinep) + error ("%qD declared as an % field", object); + if (quals) + error ("% and % function specifiers on " + "%qD invalid in field declaration", object); + break; + default: + gcc_unreachable(); + } + if (friendp) + error ("%q+D declared as a friend", object); + if (raises + && (TREE_CODE (object) == TYPE_DECL + || (!TYPE_PTRFN_P (TREE_TYPE (object)) + && !TYPE_REFFN_P (TREE_TYPE (object)) + && !TYPE_PTRMEMFUNC_P (TREE_TYPE (object))))) + error ("%q+D declared with an exception specification", object); +} + +/* DECL is a member function or static data member and is presently + being defined. Check that the definition is taking place in a + valid namespace. */ + +static void +check_class_member_definition_namespace (tree decl) +{ + /* These checks only apply to member functions and static data + members. */ + gcc_assert (TREE_CODE (decl) == FUNCTION_DECL + || TREE_CODE (decl) == VAR_DECL); + /* We check for problems with specializations in pt.c in + check_specialization_namespace, where we can issue better + diagnostics. */ + if (processing_specialization) + return; + /* There are no restrictions on the placement of + explicit instantiations. */ + if (processing_explicit_instantiation) + return; + /* [class.mfct] + + A member function definition that appears outside of the + class definition shall appear in a namespace scope enclosing + the class definition. + + [class.static.data] + + The definition for a static data member shall appear in a + namespace scope enclosing the member's class definition. */ + if (!is_ancestor (current_namespace, DECL_CONTEXT (decl))) + permerror (input_location, "definition of %qD is not in namespace enclosing %qT", + decl, DECL_CONTEXT (decl)); +} + +/* Build a PARM_DECL for the "this" parameter. TYPE is the + METHOD_TYPE for a non-static member function; QUALS are the + cv-qualifiers that apply to the function. */ + +tree +build_this_parm (tree type, cp_cv_quals quals) +{ + tree this_type; + tree qual_type; + tree parm; + cp_cv_quals this_quals; + + this_type = TREE_VALUE (TYPE_ARG_TYPES (type)); + /* The `this' parameter is implicitly `const'; it cannot be + assigned to. */ + this_quals = (quals & TYPE_QUAL_RESTRICT) | TYPE_QUAL_CONST; + qual_type = cp_build_qualified_type (this_type, this_quals); + parm = build_artificial_parm (this_identifier, qual_type); + cp_apply_type_quals_to_decl (this_quals, parm); + return parm; +} + +/* CTYPE is class type, or null if non-class. + 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' + or `volatile'. + RAISES is a list of exceptions that this function can raise. + CHECK is 1 if we must find this method in CTYPE, 0 if we should + not look, and -1 if we should not call `grokclassfn' at all. + + SFK is the kind of special function (if any) for the new function. + + Returns `NULL_TREE' if something goes wrong, after issuing + applicable error messages. */ + +static tree +grokfndecl (tree ctype, + tree type, + tree declarator, + tree parms, + tree orig_declarator, + int virtualp, + enum overload_flags flags, + cp_cv_quals quals, + tree raises, + int check, + int friendp, + int publicp, + int inlinep, + special_function_kind sfk, + bool funcdef_flag, + int template_count, + tree in_namespace, + tree* attrlist, + location_t location) +{ + tree decl; + int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; + tree t; + + if (raises) + type = build_exception_variant (type, raises); + + decl = build_lang_decl (FUNCTION_DECL, declarator, type); + + /* If we have an explicit location, use it, otherwise use whatever + build_lang_decl used (probably input_location). */ + if (location != UNKNOWN_LOCATION) + DECL_SOURCE_LOCATION (decl) = location; + + if (TREE_CODE (type) == METHOD_TYPE) + { + tree parm; + parm = build_this_parm (type, quals); + DECL_CHAIN (parm) = parms; + parms = parm; + } + DECL_ARGUMENTS (decl) = parms; + for (t = parms; t; t = DECL_CHAIN (t)) + DECL_CONTEXT (t) = decl; + /* Propagate volatile out from type to decl. */ + if (TYPE_VOLATILE (type)) + TREE_THIS_VOLATILE (decl) = 1; + + /* Setup decl according to sfk. */ + switch (sfk) + { + case sfk_constructor: + case sfk_copy_constructor: + case sfk_move_constructor: + DECL_CONSTRUCTOR_P (decl) = 1; + break; + case sfk_destructor: + DECL_DESTRUCTOR_P (decl) = 1; + break; + default: + break; + } + + /* If pointers to member functions use the least significant bit to + indicate whether a function is virtual, ensure a pointer + to this function will have that bit clear. */ + if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn + && TREE_CODE (type) == METHOD_TYPE + && DECL_ALIGN (decl) < 2 * BITS_PER_UNIT) + DECL_ALIGN (decl) = 2 * BITS_PER_UNIT; + + if (friendp + && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR) + { + if (funcdef_flag) + error + ("defining explicit specialization %qD in friend declaration", + orig_declarator); + else + { + tree fns = TREE_OPERAND (orig_declarator, 0); + tree args = TREE_OPERAND (orig_declarator, 1); + + if (PROCESSING_REAL_TEMPLATE_DECL_P ()) + { + /* Something like `template friend void f()'. */ + error ("invalid use of template-id %qD in declaration " + "of primary template", + orig_declarator); + return NULL_TREE; + } + + + /* A friend declaration of the form friend void f<>(). Record + the information in the TEMPLATE_ID_EXPR. */ + SET_DECL_IMPLICIT_INSTANTIATION (decl); + + if (TREE_CODE (fns) == COMPONENT_REF) + { + /* Due to bison parser ickiness, we will have already looked + up an operator_name or PFUNCNAME within the current class + (see template_id in parse.y). If the current class contains + such a name, we'll get a COMPONENT_REF here. Undo that. */ + + gcc_assert (TREE_TYPE (TREE_OPERAND (fns, 0)) + == current_class_type); + fns = TREE_OPERAND (fns, 1); + } + gcc_assert (TREE_CODE (fns) == IDENTIFIER_NODE + || TREE_CODE (fns) == OVERLOAD); + DECL_TEMPLATE_INFO (decl) = build_template_info (fns, args); + + for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); t; t = TREE_CHAIN (t)) + if (TREE_PURPOSE (t) + && TREE_CODE (TREE_PURPOSE (t)) == DEFAULT_ARG) + { + error ("default arguments are not allowed in declaration " + "of friend template specialization %qD", + decl); + return NULL_TREE; + } + + if (inlinep) + { + error ("% is not allowed in declaration of friend " + "template specialization %qD", + decl); + return NULL_TREE; + } + } + } + + /* If this decl has namespace scope, set that up. */ + if (in_namespace) + set_decl_namespace (decl, in_namespace, friendp); + else if (!ctype) + DECL_CONTEXT (decl) = FROB_CONTEXT (current_decl_namespace ()); + + /* `main' and builtins have implicit 'C' linkage. */ + if ((MAIN_NAME_P (declarator) + || (IDENTIFIER_LENGTH (declarator) > 10 + && IDENTIFIER_POINTER (declarator)[0] == '_' + && IDENTIFIER_POINTER (declarator)[1] == '_' + && strncmp (IDENTIFIER_POINTER (declarator)+2, "builtin_", 8) == 0)) + && current_lang_name == lang_name_cplusplus + && ctype == NULL_TREE + && DECL_FILE_SCOPE_P (decl)) + SET_DECL_LANGUAGE (decl, lang_c); + + /* Should probably propagate const out from type to decl I bet (mrs). */ + if (staticp) + { + DECL_STATIC_FUNCTION_P (decl) = 1; + DECL_CONTEXT (decl) = ctype; + } + + if (ctype) + { + DECL_CONTEXT (decl) = ctype; + if (funcdef_flag) + check_class_member_definition_namespace (decl); + } + + if (ctype == NULL_TREE && DECL_MAIN_P (decl)) + { + if (processing_template_decl) + error ("cannot declare %<::main%> to be a template"); + if (inlinep) + error ("cannot declare %<::main%> to be inline"); + if (!publicp) + error ("cannot declare %<::main%> to be static"); + inlinep = 0; + publicp = 1; + } + + /* Members of anonymous types and local classes have no linkage; make + them internal. If a typedef is made later, this will be changed. */ + if (ctype && (TYPE_ANONYMOUS_P (ctype) + || decl_function_context (TYPE_MAIN_DECL (ctype)))) + publicp = 0; + + if (publicp && cxx_dialect == cxx98) + { + /* [basic.link]: A name with no linkage (notably, the name of a class + or enumeration declared in a local scope) shall not be used to + declare an entity with linkage. + + DR 757 relaxes this restriction for C++0x. */ + t = no_linkage_check (TREE_TYPE (decl), + /*relaxed_p=*/false); + if (t) + { + if (TYPE_ANONYMOUS_P (t)) + { + if (DECL_EXTERN_C_P (decl)) + /* Allow this; it's pretty common in C. */; + else + { + permerror (input_location, "anonymous type with no linkage " + "used to declare function %q#D with linkage", + decl); + if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) + permerror (input_location, "%q+#D does not refer to the unqualified " + "type, so it is not used for linkage", + TYPE_NAME (t)); + } + } + else + permerror (input_location, "type %qT with no linkage used to " + "declare function %q#D with linkage", t, decl); + } + } + + TREE_PUBLIC (decl) = publicp; + if (! publicp) + { + DECL_INTERFACE_KNOWN (decl) = 1; + DECL_NOT_REALLY_EXTERN (decl) = 1; + } + + /* If the declaration was declared inline, mark it as such. */ + if (inlinep) + DECL_DECLARED_INLINE_P (decl) = 1; + if (inlinep & 2) + DECL_DECLARED_CONSTEXPR_P (decl) = true; + + DECL_EXTERNAL (decl) = 1; + if (quals && TREE_CODE (type) == FUNCTION_TYPE) + { + error (ctype + ? G_("static member function %qD cannot have cv-qualifier") + : G_("non-member function %qD cannot have cv-qualifier"), + decl); + quals = TYPE_UNQUALIFIED; + } + + if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)) + && !grok_op_properties (decl, /*complain=*/true)) + return NULL_TREE; + + if (funcdef_flag) + /* Make the init_value nonzero so pushdecl knows this is not + tentative. error_mark_node is replaced later with the BLOCK. */ + DECL_INITIAL (decl) = error_mark_node; + + if (TYPE_NOTHROW_P (type) || nothrow_libfn_p (decl)) + TREE_NOTHROW (decl) = 1; + + /* Caller will do the rest of this. */ + if (check < 0) + return decl; + + if (ctype != NULL_TREE) + grokclassfn (ctype, decl, flags); + + decl = check_explicit_specialization (orig_declarator, decl, + template_count, + 2 * funcdef_flag + + 4 * (friendp != 0)); + if (decl == error_mark_node) + return NULL_TREE; + + if (attrlist) + { + cplus_decl_attributes (&decl, *attrlist, 0); + *attrlist = NULL_TREE; + } + + /* Check main's type after attributes have been applied. */ + if (ctype == NULL_TREE && DECL_MAIN_P (decl)) + { + if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)), + integer_type_node)) + { + tree oldtypeargs = TYPE_ARG_TYPES (TREE_TYPE (decl)); + tree newtype; + error ("%<::main%> must return %"); + newtype = build_function_type (integer_type_node, oldtypeargs); + TREE_TYPE (decl) = newtype; + } + if (warn_main) + check_main_parameter_types (decl); + } + + if (ctype != NULL_TREE + && (! TYPE_FOR_JAVA (ctype) || check_java_method (decl)) + && check) + { + tree old_decl = check_classfn (ctype, decl, + (processing_template_decl + > template_class_depth (ctype)) + ? current_template_parms + : NULL_TREE); + + if (old_decl == error_mark_node) + return NULL_TREE; + + if (old_decl) + { + tree ok; + tree pushed_scope; + + if (TREE_CODE (old_decl) == TEMPLATE_DECL) + /* Because grokfndecl is always supposed to return a + FUNCTION_DECL, we pull out the DECL_TEMPLATE_RESULT + here. We depend on our callers to figure out that its + really a template that's being returned. */ + old_decl = DECL_TEMPLATE_RESULT (old_decl); + + if (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 (DECL_ARTIFICIAL (old_decl)) + { + error ("definition of implicitly-declared %qD", old_decl); + return NULL_TREE; + } + + /* Since we've smashed OLD_DECL to its + DECL_TEMPLATE_RESULT, we must do the same to DECL. */ + if (TREE_CODE (decl) == TEMPLATE_DECL) + decl = DECL_TEMPLATE_RESULT (decl); + + /* Attempt to merge the declarations. This can fail, in + the case of some invalid specialization declarations. */ + pushed_scope = push_scope (ctype); + ok = duplicate_decls (decl, old_decl, friendp); + if (pushed_scope) + pop_scope (pushed_scope); + if (!ok) + { + error ("no %q#D member function declared in class %qT", + decl, ctype); + return NULL_TREE; + } + return old_decl; + } + } + + if (DECL_CONSTRUCTOR_P (decl) && !grok_ctor_properties (ctype, decl)) + return NULL_TREE; + + if (ctype == NULL_TREE || check) + return decl; + + if (virtualp) + DECL_VIRTUAL_P (decl) = 1; + + return decl; +} + +/* DECL is a VAR_DECL for a static data member. Set flags to reflect + the linkage that DECL will receive in the object file. */ + +static void +set_linkage_for_static_data_member (tree decl) +{ + /* A static data member always has static storage duration and + external linkage. Note that static data members are forbidden in + local classes -- the only situation in which a class has + non-external linkage. */ + TREE_PUBLIC (decl) = 1; + TREE_STATIC (decl) = 1; + /* For non-template classes, static data members are always put + out in exactly those files where they are defined, just as + with ordinary namespace-scope variables. */ + if (!processing_template_decl) + DECL_INTERFACE_KNOWN (decl) = 1; +} + +/* Create a VAR_DECL named NAME with the indicated TYPE. + + If SCOPE is non-NULL, it is the class type or namespace containing + the variable. If SCOPE is NULL, the variable should is created in + the innermost enclosings scope. */ + +static tree +grokvardecl (tree type, + tree name, + const cp_decl_specifier_seq *declspecs, + int initialized, + int constp, + tree scope) +{ + tree decl; + tree explicit_scope; + + gcc_assert (!name || TREE_CODE (name) == IDENTIFIER_NODE); + + /* Compute the scope in which to place the variable, but remember + whether or not that scope was explicitly specified by the user. */ + explicit_scope = scope; + if (!scope) + { + /* An explicit "extern" specifier indicates a namespace-scope + variable. */ + if (declspecs->storage_class == sc_extern) + scope = current_decl_namespace (); + else if (!at_function_scope_p ()) + scope = current_scope (); + } + + if (scope + && (/* If the variable is a namespace-scope variable declared in a + template, we need DECL_LANG_SPECIFIC. */ + (TREE_CODE (scope) == NAMESPACE_DECL && processing_template_decl) + /* Similarly for namespace-scope variables with language linkage + other than C++. */ + || (TREE_CODE (scope) == NAMESPACE_DECL + && current_lang_name != lang_name_cplusplus) + /* Similarly for static data members. */ + || TYPE_P (scope))) + decl = build_lang_decl (VAR_DECL, name, type); + else + decl = build_decl (input_location, VAR_DECL, name, type); + + if (explicit_scope && TREE_CODE (explicit_scope) == NAMESPACE_DECL) + set_decl_namespace (decl, explicit_scope, 0); + else + DECL_CONTEXT (decl) = FROB_CONTEXT (scope); + + if (declspecs->storage_class == sc_extern) + { + DECL_THIS_EXTERN (decl) = 1; + DECL_EXTERNAL (decl) = !initialized; + } + + if (DECL_CLASS_SCOPE_P (decl)) + { + set_linkage_for_static_data_member (decl); + /* This function is only called with out-of-class definitions. */ + DECL_EXTERNAL (decl) = 0; + check_class_member_definition_namespace (decl); + } + /* At top level, either `static' or no s.c. makes a definition + (perhaps tentative), and absence of `static' makes it public. */ + else if (toplevel_bindings_p ()) + { + TREE_PUBLIC (decl) = (declspecs->storage_class != sc_static + && (DECL_THIS_EXTERN (decl) || ! constp)); + TREE_STATIC (decl) = ! DECL_EXTERNAL (decl); + } + /* Not at top level, only `static' makes a static definition. */ + else + { + TREE_STATIC (decl) = declspecs->storage_class == sc_static; + TREE_PUBLIC (decl) = DECL_EXTERNAL (decl); + } + + if (declspecs->specs[(int)ds_thread]) + DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + + /* If the type of the decl has no linkage, make sure that we'll + notice that in mark_used. */ + if (cxx_dialect > cxx98 + && decl_linkage (decl) != lk_none + && DECL_LANG_SPECIFIC (decl) == NULL + && !DECL_EXTERN_C_P (decl) + && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)) + retrofit_lang_decl (decl); + + if (TREE_PUBLIC (decl)) + { + /* [basic.link]: A name with no linkage (notably, the name of a class + or enumeration declared in a local scope) shall not be used to + declare an entity with linkage. + + DR 757 relaxes this restriction for C++0x. */ + tree t = (cxx_dialect > cxx98 ? NULL_TREE + : no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)); + if (t) + { + if (TYPE_ANONYMOUS_P (t)) + { + if (DECL_EXTERN_C_P (decl)) + /* Allow this; it's pretty common in C. */ + ; + else + { + /* DRs 132, 319 and 389 seem to indicate types with + no linkage can only be used to declare extern "C" + entities. Since it's not always an error in the + ISO C++ 90 Standard, we only issue a warning. */ + warning (0, "anonymous type with no linkage used to declare " + "variable %q#D with linkage", decl); + if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) + warning (0, "%q+#D does not refer to the unqualified " + "type, so it is not used for linkage", + TYPE_NAME (t)); + } + } + else + warning (0, "type %qT with no linkage used to declare variable " + "%q#D with linkage", t, decl); + } + } + else + DECL_INTERFACE_KNOWN (decl) = 1; + + return decl; +} + +/* Create and return a canonical pointer to member function type, for + TYPE, which is a POINTER_TYPE to a METHOD_TYPE. */ + +tree +build_ptrmemfunc_type (tree type) +{ + tree field, fields; + tree t; + tree unqualified_variant = NULL_TREE; + + if (type == error_mark_node) + return type; + + /* If a canonical type already exists for this type, use it. We use + this method instead of type_hash_canon, because it only does a + simple equality check on the list of field members. */ + + if ((t = TYPE_GET_PTRMEMFUNC_TYPE (type))) + return t; + + /* Make sure that we always have the unqualified pointer-to-member + type first. */ + if (cp_type_quals (type) != TYPE_UNQUALIFIED) + unqualified_variant + = build_ptrmemfunc_type (TYPE_MAIN_VARIANT (type)); + + t = make_class_type (RECORD_TYPE); + xref_basetypes (t, NULL_TREE); + + /* Let the front end know this is a pointer to member function... */ + TYPE_PTRMEMFUNC_FLAG (t) = 1; + /* ... and not really a class type. */ + SET_CLASS_TYPE_P (t, 0); + + field = build_decl (input_location, FIELD_DECL, pfn_identifier, type); + fields = field; + + field = build_decl (input_location, FIELD_DECL, delta_identifier, + delta_type_node); + DECL_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. */ + TYPE_NAME (t) = NULL_TREE; + + /* If this is not the unqualified form of this pointer-to-member + type, set the TYPE_MAIN_VARIANT for this type to be the + unqualified type. Since they are actually RECORD_TYPEs that are + not variants of each other, we must do this manually. + As we just built a new type there is no need to do yet another copy. */ + if (cp_type_quals (type) != TYPE_UNQUALIFIED) + { + int type_quals = cp_type_quals (type); + TYPE_READONLY (t) = (type_quals & TYPE_QUAL_CONST) != 0; + TYPE_VOLATILE (t) = (type_quals & TYPE_QUAL_VOLATILE) != 0; + TYPE_RESTRICT (t) = (type_quals & TYPE_QUAL_RESTRICT) != 0; + TYPE_MAIN_VARIANT (t) = unqualified_variant; + TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (unqualified_variant); + TYPE_NEXT_VARIANT (unqualified_variant) = t; + TREE_TYPE (TYPE_BINFO (t)) = t; + } + + /* Cache this pointer-to-member type so that we can find it again + later. */ + TYPE_SET_PTRMEMFUNC_TYPE (type, t); + + if (TYPE_STRUCTURAL_EQUALITY_P (type)) + SET_TYPE_STRUCTURAL_EQUALITY (t); + else if (TYPE_CANONICAL (type) != type) + TYPE_CANONICAL (t) = build_ptrmemfunc_type (TYPE_CANONICAL (type)); + + return t; +} + +/* Create and return a pointer to data member type. */ + +tree +build_ptrmem_type (tree class_type, tree member_type) +{ + if (TREE_CODE (member_type) == METHOD_TYPE) + { + cp_cv_quals quals = type_memfn_quals (member_type); + member_type = build_memfn_type (member_type, class_type, quals); + return build_ptrmemfunc_type (build_pointer_type (member_type)); + } + else + { + gcc_assert (TREE_CODE (member_type) != FUNCTION_TYPE); + return build_offset_type (class_type, member_type); + } +} + +/* DECL is a VAR_DECL defined in-class, whose TYPE is also given. + Check to see that the definition is valid. Issue appropriate error + messages. Return 1 if the definition is particularly bad, or 0 + otherwise. */ + +int +check_static_variable_definition (tree decl, tree type) +{ + /* If DECL is declared constexpr, we'll do the appropriate checks + in check_initializer. */ + if (DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl)) + return 0; + else if (cxx_dialect >= cxx0x && !INTEGRAL_OR_ENUMERATION_TYPE_P (type)) + { + if (literal_type_p (type)) + error ("% needed for in-class initialization of static " + "data member %q#D of non-integral type", decl); + else + error ("in-class initialization of static data member %q#D of " + "non-literal type", decl); + return 1; + } + + /* Motion 10 at San Diego: If a static const integral data member is + initialized with an integral constant expression, the initializer + may appear either in the declaration (within the class), or in + the definition, but not both. If it appears in the class, the + member is a member constant. The file-scope definition is always + required. */ + if (!ARITHMETIC_TYPE_P (type) && TREE_CODE (type) != ENUMERAL_TYPE) + { + error ("invalid in-class initialization of static data member " + "of non-integral type %qT", + type); + return 1; + } + else if (!CP_TYPE_CONST_P (type)) + error ("ISO C++ forbids in-class initialization of non-const " + "static member %qD", + decl); + else if (!INTEGRAL_OR_ENUMERATION_TYPE_P (type)) + pedwarn (input_location, OPT_pedantic, "ISO C++ forbids initialization of member constant " + "%qD of non-integral type %qT", decl, type); + + return 0; +} + +/* *expr_p is part of the TYPE_SIZE of a variably-sized array. If any + SAVE_EXPRs in *expr_p wrap expressions with side-effects, break those + expressions out into temporary variables so that walk_tree doesn't + step into them (c++/15764). */ + +static tree +stabilize_save_expr_r (tree *expr_p, int *walk_subtrees, void *data) +{ + struct pointer_set_t *pset = (struct pointer_set_t *)data; + tree expr = *expr_p; + if (TREE_CODE (expr) == SAVE_EXPR) + { + tree op = TREE_OPERAND (expr, 0); + cp_walk_tree (&op, stabilize_save_expr_r, data, pset); + if (TREE_SIDE_EFFECTS (op)) + TREE_OPERAND (expr, 0) = get_temp_regvar (TREE_TYPE (op), op); + *walk_subtrees = 0; + } + else if (!EXPR_P (expr) || !TREE_SIDE_EFFECTS (expr)) + *walk_subtrees = 0; + return NULL; +} + +/* Entry point for the above. */ + +static void +stabilize_vla_size (tree size) +{ + struct pointer_set_t *pset = pointer_set_create (); + /* Break out any function calls into temporary variables. */ + cp_walk_tree (&size, stabilize_save_expr_r, pset, pset); +} + +/* Given the SIZE (i.e., number of elements) in an array, compute an + appropriate index type for the array. If non-NULL, NAME is the + name of the thing being declared. */ + +tree +compute_array_index_type (tree name, tree size, tsubst_flags_t complain) +{ + tree type; + tree itype; + tree osize = size; + tree abi_1_itype = NULL_TREE; + + if (error_operand_p (size)) + return error_mark_node; + + type = TREE_TYPE (size); + /* type_dependent_expression_p? */ + if (!dependent_type_p (type)) + { + mark_rvalue_use (size); + + if (cxx_dialect < cxx0x && TREE_CODE (size) == NOP_EXPR + && TREE_SIDE_EFFECTS (size)) + /* In C++98, we mark a non-constant array bound with a magic + NOP_EXPR with TREE_SIDE_EFFECTS; don't fold in that case. */; + else + { + size = fold_non_dependent_expr (size); + + if (CLASS_TYPE_P (type) + && CLASSTYPE_LITERAL_P (type)) + { + size = build_expr_type_conversion (WANT_INT, size, true); + if (size == error_mark_node) + return error_mark_node; + type = TREE_TYPE (size); + } + + size = maybe_constant_value (size); + if (!TREE_CONSTANT (size)) + size = osize; + } + + if (error_operand_p (size)) + return error_mark_node; + + /* The array bound must be an integer type. */ + if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type)) + { + if (!(complain & tf_error)) + return error_mark_node; + if (name) + error ("size of array %qD has non-integral type %qT", name, type); + else + error ("size of array has non-integral type %qT", type); + size = integer_one_node; + type = TREE_TYPE (size); + } + } + + /* A type is dependent if it is...an array type constructed from any + dependent type or whose size is specified by a constant expression + that is value-dependent. */ + /* We can only call value_dependent_expression_p on integral constant + expressions; treat non-constant expressions as dependent, too. */ + if (processing_template_decl + && (dependent_type_p (type) + || !TREE_CONSTANT (size) || value_dependent_expression_p (size))) + { + /* We cannot do any checking for a SIZE that isn't known to be + constant. Just build the index type and mark that it requires + structural equality checks. */ + itype = build_index_type (build_min (MINUS_EXPR, sizetype, + size, integer_one_node)); + TYPE_DEPENDENT_P (itype) = 1; + TYPE_DEPENDENT_P_VALID (itype) = 1; + SET_TYPE_STRUCTURAL_EQUALITY (itype); + return itype; + } + + if (!abi_version_at_least (2) && processing_template_decl) + /* For abi-1, we handled all instances in templates the same way, + even when they were non-dependent. This affects the manglings + produced. So, we do the normal checking for non-dependent + sizes, but at the end we'll return the same type that abi-1 + would have, but with TYPE_CANONICAL set to the "right" + value that the current ABI would provide. */ + abi_1_itype = build_index_type (build_min (MINUS_EXPR, sizetype, + osize, integer_one_node)); + + /* Normally, the array-bound will be a constant. */ + if (TREE_CODE (size) == INTEGER_CST) + { + /* Check to see if the array bound overflowed. Make that an + error, no matter how generous we're being. */ + constant_expression_error (size); + + /* An array must have a positive number of elements. */ + if (INT_CST_LT (size, integer_zero_node)) + { + if (!(complain & tf_error)) + return error_mark_node; + if (name) + error ("size of array %qD is negative", name); + else + error ("size of array is negative"); + size = integer_one_node; + } + /* As an extension we allow zero-sized arrays. */ + else if (integer_zerop (size)) + { + if (!(complain & tf_error)) + /* We must fail if performing argument deduction (as + indicated by the state of complain), so that + another substitution can be found. */ + return error_mark_node; + else if (in_system_header) + /* Allow them in system headers because glibc uses them. */; + else if (name) + pedwarn (input_location, OPT_pedantic, "ISO C++ forbids zero-size array %qD", name); + else + pedwarn (input_location, OPT_pedantic, "ISO C++ forbids zero-size array"); + } + } + else if (TREE_CONSTANT (size) + /* We don't allow VLAs at non-function scopes, or during + tentative template substitution. */ + || !at_function_scope_p () || !(complain & tf_error)) + { + if (!(complain & tf_error)) + return error_mark_node; + /* `(int) &fn' is not a valid array bound. */ + if (name) + error ("size of array %qD is not an integral constant-expression", + name); + else + error ("size of array is not an integral constant-expression"); + size = integer_one_node; + } + else if (pedantic && warn_vla != 0) + { + if (name) + pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array %qD", name); + else + pedwarn (input_location, OPT_Wvla, "ISO C++ forbids variable length array"); + } + else if (warn_vla > 0) + { + if (name) + warning (OPT_Wvla, + "variable length array %qD is used", name); + else + warning (OPT_Wvla, + "variable length array is used"); + } + + if (processing_template_decl && !TREE_CONSTANT (size)) + /* A variable sized array. */ + itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node); + else + { + HOST_WIDE_INT saved_processing_template_decl; + + /* Compute the index of the largest element in the array. It is + one less than the number of elements in the array. We save + and restore PROCESSING_TEMPLATE_DECL so that computations in + cp_build_binary_op will be appropriately folded. */ + saved_processing_template_decl = processing_template_decl; + processing_template_decl = 0; + itype = cp_build_binary_op (input_location, + MINUS_EXPR, + cp_convert (ssizetype, size), + cp_convert (ssizetype, integer_one_node), + tf_warning_or_error); + itype = fold (itype); + processing_template_decl = saved_processing_template_decl; + + 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_CODE (itype) == INTEGER_CST + && TREE_OVERFLOW (itype)) + { + if (!(complain & tf_error)) + return error_mark_node; + error ("overflow in array dimension"); + TREE_OVERFLOW (itype) = 0; + } + } + + /* Create and return the appropriate index type. */ + if (abi_1_itype) + { + tree t = build_index_type (itype); + TYPE_CANONICAL (abi_1_itype) = TYPE_CANONICAL (t); + itype = abi_1_itype; + } + else + itype = build_index_type (itype); + + /* If the index type were dependent, we would have returned early, so + remember that it isn't. */ + TYPE_DEPENDENT_P (itype) = 0; + TYPE_DEPENDENT_P_VALID (itype) = 1; + return 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 (const cp_declarator *declarator) +{ + while (declarator && declarator->kind != cdk_id) + declarator = declarator->declarator; + + /* If the declarator-id is a SCOPE_REF, the scope in which the + declaration occurs is the first operand. */ + if (declarator + && declarator->u.id.qualifying_scope) + return declarator->u.id.qualifying_scope; + + /* Otherwise, the declarator 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; + + /* If things have already gone awry, bail now. */ + if (type == error_mark_node || size == error_mark_node) + return error_mark_node; + + /* If there are some types which cannot be array elements, + issue an error-message and return. */ + switch (TREE_CODE (type)) + { + case VOID_TYPE: + if (name) + error ("declaration of %qD as array of void", name); + else + error ("creating array of void"); + return error_mark_node; + + case FUNCTION_TYPE: + if (name) + error ("declaration of %qD as array of functions", name); + else + error ("creating array of functions"); + return error_mark_node; + + case REFERENCE_TYPE: + if (name) + error ("declaration of %qD as array of references", name); + else + error ("creating array of references"); + return error_mark_node; + + case METHOD_TYPE: + if (name) + error ("declaration of %qD as array of function members", name); + else + error ("creating array of function members"); + return error_mark_node; + + default: + break; + } + + /* [dcl.array] + + The constant expressions that specify the bounds of the arrays + can be omitted only for the first member of the sequence. */ + if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) + { + if (name) + error ("declaration of %qD as multidimensional array must " + "have bounds for all dimensions except the first", + name); + else + error ("multidimensional array must have bounds for all " + "dimensions except the first"); + + return error_mark_node; + } + + /* Figure out the index type for the array. */ + if (size) + itype = compute_array_index_type (name, size, tf_warning_or_error); + + /* [dcl.array] + T is called the array element type; this type shall not be [...] an + abstract class type. */ + abstract_virtuals_error (name, type); + + return build_cplus_array_type (type, itype); +} + +/* Check that it's OK to declare a function with the indicated TYPE. + SFK indicates the kind of special function (if any) that this + function is. OPTYPE is the type given in a conversion operator + declaration, or the class type for a constructor/destructor. + Returns the actual return type of the function; that + may be different than TYPE if an error occurs, or for certain + special functions. */ + +static tree +check_special_function_return_type (special_function_kind sfk, + tree type, + tree optype) +{ + switch (sfk) + { + case sfk_constructor: + if (type) + error ("return type specification for constructor invalid"); + + if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (optype)) + type = build_pointer_type (optype); + else + type = void_type_node; + break; + + case sfk_destructor: + if (type) + error ("return type specification for destructor invalid"); + /* We can't use the proper return type here because we run into + problems with ambiguous bases and covariant returns. + Java classes are left unchanged because (void *) isn't a valid + Java type, and we don't want to change the Java ABI. */ + if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (optype)) + type = build_pointer_type (void_type_node); + else + type = void_type_node; + break; + + case sfk_conversion: + if (type) + error ("return type specified for %", optype); + type = optype; + break; + + default: + gcc_unreachable (); + } + + return type; +} + +/* A variable or data member (whose unqualified name is IDENTIFIER) + has been declared with the indicated TYPE. If the TYPE is not + acceptable, issue an error message and return a type to use for + error-recovery purposes. */ + +tree +check_var_type (tree identifier, tree type) +{ + if (VOID_TYPE_P (type)) + { + if (!identifier) + error ("unnamed variable or field declared void"); + else if (TREE_CODE (identifier) == IDENTIFIER_NODE) + { + gcc_assert (!IDENTIFIER_OPNAME_P (identifier)); + error ("variable or field %qE declared void", identifier); + } + else + error ("variable or field declared void"); + type = error_mark_node; + } + + return type; +} + +/* Functions for adjusting the visibility of a tagged type and its nested + types when it gets a name for linkage purposes from a typedef. */ + +static void bt_reset_linkage (binding_entry, void *); +static void +reset_type_linkage (tree type) +{ + set_linkage_according_to_type (type, TYPE_MAIN_DECL (type)); + if (CLASS_TYPE_P (type)) + binding_table_foreach (CLASSTYPE_NESTED_UTDS (type), bt_reset_linkage, NULL); +} +static void +bt_reset_linkage (binding_entry b, void *data ATTRIBUTE_UNUSED) +{ + reset_type_linkage (b->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 points to the representation of declaration-specifier + sequence that precedes declarator. + + DECL_CONTEXT says which syntactic context this declaration is in: + NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. + FUNCDEF for a function definition. Like NORMAL but a few different + error messages in each case. Return value may be zero meaning + this definition is too screwy to try to parse. + MEMFUNCDEF for a function definition. Like FUNCDEF but prepares to + handle member functions (which have FIELD context). + Return value may be zero meaning this definition is too screwy to + try to parse. + PARM for a parameter declaration (either within a function prototype + or before a function body). Make a PARM_DECL, or return void_type_node. + TPARM for a template parameter declaration. + CATCHPARM for a parameter declaration before a catch clause. + TYPENAME if for a typename (in a cast or sizeof). + Don't make a DECL node; just return the ..._TYPE node. + FIELD for a struct or union field; make a FIELD_DECL. + BITFIELD for a field with specified width. + + INITIALIZED is as for start_decl. + + ATTRLIST is a pointer to the list of attributes, which may be NULL + 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'. + + Returns a DECL (if a declarator is present), a TYPE (if there is no + declarator, in cases like "struct S;"), or the ERROR_MARK_NODE if an + error occurs. */ + +tree +grokdeclarator (const cp_declarator *declarator, + const cp_decl_specifier_seq *declspecs, + enum decl_context decl_context, + int initialized, + tree* attrlist) +{ + tree type = NULL_TREE; + int longlong = 0; + int explicit_int128 = 0; + int virtualp, explicitp, friendp, inlinep, staticp; + int explicit_int = 0; + int explicit_char = 0; + int defaulted_int = 0; + tree dependent_name = NULL_TREE; + + tree typedef_decl = NULL_TREE; + const char *name = NULL; + tree typedef_type = NULL_TREE; + /* True if this declarator is a function definition. */ + bool funcdef_flag = false; + cp_declarator_kind innermost_code = cdk_error; + int bitfield = 0; +#if 0 + /* See the code below that used this. */ + tree decl_attr = NULL_TREE; +#endif + + /* Keep track of what sort of function is being processed + so that we can warn about default return values, or explicit + return values which do not match prescribed defaults. */ + special_function_kind sfk = sfk_none; + + tree dname = NULL_TREE; + tree ctor_return_type = NULL_TREE; + enum overload_flags flags = NO_SPECIAL; + /* cv-qualifiers that apply to the declarator, for a declaration of + a member function. */ + cp_cv_quals memfn_quals = TYPE_UNQUALIFIED; + /* cv-qualifiers that apply to the type specified by the DECLSPECS. */ + int type_quals; + tree raises = NULL_TREE; + int template_count = 0; + tree returned_attrs = NULL_TREE; + tree parms = NULL_TREE; + const cp_declarator *id_declarator; + /* The unqualified name of the declarator; either an + IDENTIFIER_NODE, BIT_NOT_EXPR, or TEMPLATE_ID_EXPR. */ + tree unqualified_id; + /* The class type, if any, in which this entity is located, + or NULL_TREE if none. Note that this value may be different from + the current class type; for example if an attempt is made to declare + "A::f" inside "B", this value will be "A". */ + tree ctype = current_class_type; + /* The NAMESPACE_DECL for the namespace in which this entity is + located. If an unqualified name is used to declare the entity, + this value will be NULL_TREE, even if the entity is located at + namespace scope. */ + tree in_namespace = NULL_TREE; + cp_storage_class storage_class; + bool unsigned_p, signed_p, short_p, long_p, thread_p; + bool type_was_error_mark_node = false; + bool parameter_pack_p = declarator? declarator->parameter_pack_p : false; + bool template_type_arg = false; + bool template_parm_flag = false; + bool constexpr_p = declspecs->specs[(int) ds_constexpr]; + const char *errmsg; + + signed_p = declspecs->specs[(int)ds_signed]; + unsigned_p = declspecs->specs[(int)ds_unsigned]; + short_p = declspecs->specs[(int)ds_short]; + long_p = declspecs->specs[(int)ds_long]; + longlong = declspecs->specs[(int)ds_long] >= 2; + explicit_int128 = declspecs->explicit_int128_p; + thread_p = declspecs->specs[(int)ds_thread]; + + if (decl_context == FUNCDEF) + funcdef_flag = true, decl_context = NORMAL; + else if (decl_context == MEMFUNCDEF) + funcdef_flag = true, decl_context = FIELD; + else if (decl_context == BITFIELD) + bitfield = 1, decl_context = FIELD; + else if (decl_context == TEMPLATE_TYPE_ARG) + template_type_arg = true, decl_context = TYPENAME; + else if (decl_context == TPARM) + template_parm_flag = true, decl_context = PARM; + + if (initialized > 1) + funcdef_flag = true; + + /* Look inside a declarator for the name being declared + and get it as a string, for an error message. */ + for (id_declarator = declarator; + id_declarator; + id_declarator = id_declarator->declarator) + { + if (id_declarator->kind != cdk_id) + innermost_code = id_declarator->kind; + + switch (id_declarator->kind) + { + case cdk_function: + if (id_declarator->declarator + && id_declarator->declarator->kind == cdk_id) + { + sfk = id_declarator->declarator->u.id.sfk; + if (sfk == sfk_destructor) + flags = DTOR_FLAG; + } + break; + + case cdk_id: + { + tree qualifying_scope = id_declarator->u.id.qualifying_scope; + tree decl = id_declarator->u.id.unqualified_name; + if (!decl) + break; + if (qualifying_scope) + { + if (at_function_scope_p ()) + { + /* [dcl.meaning] + + A declarator-id shall not be qualified except + for ... + + None of the cases are permitted in block + scope. */ + if (qualifying_scope == global_namespace) + error ("invalid use of qualified-name %<::%D%>", + decl); + else if (TYPE_P (qualifying_scope)) + error ("invalid use of qualified-name %<%T::%D%>", + qualifying_scope, decl); + else + error ("invalid use of qualified-name %<%D::%D%>", + qualifying_scope, decl); + return error_mark_node; + } + else if (TYPE_P (qualifying_scope)) + { + ctype = qualifying_scope; + if (innermost_code != cdk_function + && current_class_type + && !UNIQUELY_DERIVED_FROM_P (ctype, + current_class_type)) + { + error ("type %qT is not derived from type %qT", + ctype, current_class_type); + return error_mark_node; + } + } + else if (TREE_CODE (qualifying_scope) == NAMESPACE_DECL) + in_namespace = qualifying_scope; + } + switch (TREE_CODE (decl)) + { + case BIT_NOT_EXPR: + { + tree type; + + if (innermost_code != cdk_function) + { + error ("declaration of %qD as non-function", decl); + return error_mark_node; + } + else if (!qualifying_scope + && !(current_class_type && at_class_scope_p ())) + { + error ("declaration of %qD as non-member", decl); + return error_mark_node; + } + + type = TREE_OPERAND (decl, 0); + if (TYPE_P (type)) + type = constructor_name (type); + name = identifier_to_locale (IDENTIFIER_POINTER (type)); + dname = decl; + } + break; + + case TEMPLATE_ID_EXPR: + { + tree fns = TREE_OPERAND (decl, 0); + + dname = fns; + if (TREE_CODE (dname) != IDENTIFIER_NODE) + { + gcc_assert (is_overloaded_fn (dname)); + dname = DECL_NAME (get_first_fn (dname)); + } + } + /* Fall through. */ + + case IDENTIFIER_NODE: + if (TREE_CODE (decl) == IDENTIFIER_NODE) + dname = decl; + + if (C_IS_RESERVED_WORD (dname)) + { + error ("declarator-id missing; using reserved word %qD", + dname); + name = identifier_to_locale (IDENTIFIER_POINTER (dname)); + } + else if (!IDENTIFIER_TYPENAME_P (dname)) + name = identifier_to_locale (IDENTIFIER_POINTER (dname)); + else + { + gcc_assert (flags == NO_SPECIAL); + flags = TYPENAME_FLAG; + ctor_return_type = TREE_TYPE (dname); + sfk = sfk_conversion; + if (is_typename_at_global_scope (dname)) + name = identifier_to_locale (IDENTIFIER_POINTER (dname)); + else + name = ""; + } + break; + + default: + gcc_unreachable (); + } + break; + } + + case cdk_array: + case cdk_pointer: + case cdk_reference: + case cdk_ptrmem: + break; + + case cdk_error: + return error_mark_node; + + default: + gcc_unreachable (); + } + if (id_declarator->kind == cdk_id) + break; + } + + /* [dcl.fct.edf] + + The declarator in a function-definition shall have the form + D1 ( parameter-declaration-clause) ... */ + if (funcdef_flag && innermost_code != cdk_function) + { + error ("function definition does not declare parameters"); + return error_mark_node; + } + + if (((dname && IDENTIFIER_OPNAME_P (dname)) || flags == TYPENAME_FLAG) + && innermost_code != cdk_function + && ! (ctype && !declspecs->any_specifiers_p)) + { + error ("declaration of %qD as non-function", dname); + return error_mark_node; + } + + /* Anything declared one level down from the top level + must be one of the parameters of a function + (because the body is at least two levels down). */ + + /* This heuristic cannot be applied to C++ nodes! Fixed, however, + by not allowing C++ class definitions to specify their parameters + with xdecls (must be spec.d in the parmlist). + + Since we now wait to push a class scope until we are sure that + we are in a legitimate method context, we must set oldcname + explicitly (since current_class_name is not yet alive). + + We also want to avoid calling this a PARM if it is in a namespace. */ + + if (decl_context == NORMAL && !toplevel_bindings_p ()) + { + struct cp_binding_level *b = current_binding_level; + current_binding_level = b->level_chain; + if (current_binding_level != 0 && toplevel_bindings_p ()) + decl_context = PARM; + current_binding_level = b; + } + + if (name == NULL) + name = decl_context == PARM ? "parameter" : "type name"; + + if (constexpr_p && declspecs->specs[(int)ds_typedef]) + { + error ("% cannot appear in a typedef declaration"); + return error_mark_node; + } + + /* If there were multiple types specified in the decl-specifier-seq, + issue an error message. */ + if (declspecs->multiple_types_p) + { + error ("two or more data types in declaration of %qs", name); + return error_mark_node; + } + + if (declspecs->conflicting_specifiers_p) + { + error ("conflicting specifiers in declaration of %qs", name); + return error_mark_node; + } + + /* Extract the basic type from the decl-specifier-seq. */ + type = declspecs->type; + if (type == error_mark_node) + { + type = NULL_TREE; + type_was_error_mark_node = true; + } + /* If the entire declaration is itself tagged as deprecated then + suppress reports of deprecated items. */ + if (type && TREE_DEPRECATED (type) + && deprecated_state != DEPRECATED_SUPPRESS) + warn_deprecated_use (type, NULL_TREE); + if (type && TREE_CODE (type) == TYPE_DECL) + { + typedef_decl = type; + type = TREE_TYPE (typedef_decl); + if (TREE_DEPRECATED (type) + && DECL_ARTIFICIAL (typedef_decl) + && deprecated_state != DEPRECATED_SUPPRESS) + warn_deprecated_use (type, NULL_TREE); + } + /* No type at all: default to `int', and set DEFAULTED_INT + because it was not a user-defined typedef. */ + if (type == NULL_TREE && (signed_p || unsigned_p || long_p || short_p)) + { + /* These imply 'int'. */ + type = integer_type_node; + defaulted_int = 1; + } + /* Gather flags. */ + explicit_int = declspecs->explicit_int_p; + explicit_char = declspecs->explicit_char_p; + +#if 0 + /* See the code below that used this. */ + if (typedef_decl) + decl_attr = DECL_ATTRIBUTES (typedef_decl); +#endif + typedef_type = type; + + + if (sfk != sfk_conversion) + ctor_return_type = ctype; + + if (sfk != sfk_none) + type = check_special_function_return_type (sfk, type, + ctor_return_type); + else if (type == NULL_TREE) + { + int is_main; + + explicit_int = -1; + + /* We handle `main' specially here, because 'main () { }' is so + common. With no options, it is allowed. With -Wreturn-type, + it is a warning. It is only an error with -pedantic-errors. */ + is_main = (funcdef_flag + && dname && TREE_CODE (dname) == IDENTIFIER_NODE + && MAIN_NAME_P (dname) + && ctype == NULL_TREE + && in_namespace == NULL_TREE + && current_namespace == global_namespace); + + if (type_was_error_mark_node) + /* We've already issued an error, don't complain more. */; + else if (in_system_header || flag_ms_extensions) + /* Allow it, sigh. */; + else if (! is_main) + permerror (input_location, "ISO C++ forbids declaration of %qs with no type", name); + else if (pedantic) + pedwarn (input_location, OPT_pedantic, + "ISO C++ forbids declaration of %qs with no type", name); + else + warning (OPT_Wreturn_type, + "ISO C++ forbids declaration of %qs with no type", name); + + type = integer_type_node; + } + + ctype = NULL_TREE; + + /* Now process the modifiers that were specified + and check for invalid combinations. */ + + /* Long double is a special combination. */ + if (long_p && !longlong && TYPE_MAIN_VARIANT (type) == double_type_node) + { + long_p = false; + type = cp_build_qualified_type (long_double_type_node, + cp_type_quals (type)); + } + + /* Check all other uses of type modifiers. */ + + if (unsigned_p || signed_p || long_p || short_p) + { + int ok = 0; + + if ((signed_p || unsigned_p) && TREE_CODE (type) != INTEGER_TYPE) + error ("% or % invalid for %qs", name); + else if (signed_p && unsigned_p) + error ("% and % specified together for %qs", name); + else if (longlong && TREE_CODE (type) != INTEGER_TYPE) + error ("% invalid for %qs", name); + else if (explicit_int128 && TREE_CODE (type) != INTEGER_TYPE) + error ("%<__int128%> invalid for %qs", name); + else if (long_p && TREE_CODE (type) == REAL_TYPE) + error ("% invalid for %qs", name); + else if (short_p && TREE_CODE (type) == REAL_TYPE) + error ("% invalid for %qs", name); + else if ((long_p || short_p) && TREE_CODE (type) != INTEGER_TYPE) + error ("% or % invalid for %qs", name); + else if ((long_p || short_p || explicit_char || explicit_int) && explicit_int128) + error ("%, %, %, or % invalid for %qs", name); + else if ((long_p || short_p) && explicit_char) + error ("% or % specified with char for %qs", name); + else if (long_p && short_p) + error ("% and % specified together for %qs", name); + else if (type == char16_type_node || type == char32_type_node) + { + if (signed_p || unsigned_p) + error ("% or % invalid for %qs", name); + else if (short_p || long_p) + error ("% or % invalid for %qs", name); + } + else + { + ok = 1; + if (!explicit_int && !defaulted_int && !explicit_char && !explicit_int128 && pedantic) + { + pedwarn (input_location, OPT_pedantic, + "long, short, signed or unsigned used invalidly for %qs", + name); + if (flag_pedantic_errors) + ok = 0; + } + if (explicit_int128) + { + if (int128_integer_type_node == NULL_TREE) + { + error ("%<__int128%> is not supported by this target"); + ok = 0; + } + else if (pedantic) + { + pedwarn (input_location, OPT_pedantic, + "ISO C++ does not support %<__int128%> for %qs", + name); + if (flag_pedantic_errors) + ok = 0; + } + } + } + + /* Discard the type modifiers if they are invalid. */ + if (! ok) + { + unsigned_p = false; + signed_p = false; + long_p = false; + short_p = false; + longlong = 0; + explicit_int128 = false; + } + } + + /* Decide whether an integer type is signed or not. + Optionally treat bitfields as signed by default. */ + if (unsigned_p + /* [class.bit] + + It is implementation-defined whether a plain (neither + explicitly signed or unsigned) char, short, int, or long + bit-field is signed or unsigned. + + Naturally, we extend this to long long as well. Note that + this does not include wchar_t. */ + || (bitfield && !flag_signed_bitfields + && !signed_p + /* A typedef for plain `int' without `signed' can be + controlled just like plain `int', but a typedef for + `signed int' cannot be so controlled. */ + && !(typedef_decl + && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)) + && TREE_CODE (type) == INTEGER_TYPE + && !same_type_p (TYPE_MAIN_VARIANT (type), wchar_type_node))) + { + if (explicit_int128) + type = int128_unsigned_type_node; + else if (longlong) + type = long_long_unsigned_type_node; + else if (long_p) + type = long_unsigned_type_node; + else if (short_p) + type = short_unsigned_type_node; + else if (type == char_type_node) + type = unsigned_char_type_node; + else if (typedef_decl) + type = unsigned_type_for (type); + else + type = unsigned_type_node; + } + else if (signed_p && type == char_type_node) + type = signed_char_type_node; + else if (explicit_int128) + type = int128_integer_type_node; + else if (longlong) + type = long_long_integer_type_node; + else if (long_p) + type = long_integer_type_node; + else if (short_p) + type = short_integer_type_node; + + if (declspecs->specs[(int)ds_complex]) + { + if (TREE_CODE (type) != INTEGER_TYPE && TREE_CODE (type) != REAL_TYPE) + error ("complex invalid for %qs", name); + /* If we just have "complex", it is equivalent to + "complex double", but if any modifiers at all are specified it is + the complex form of TYPE. E.g, "complex short" is + "complex short int". */ + else if (defaulted_int && ! longlong && ! explicit_int128 + && ! (long_p || short_p || signed_p || unsigned_p)) + type = complex_double_type_node; + else if (type == integer_type_node) + type = complex_integer_type_node; + else if (type == float_type_node) + type = complex_float_type_node; + else if (type == double_type_node) + type = complex_double_type_node; + else if (type == long_double_type_node) + type = complex_long_double_type_node; + else + type = build_complex_type (type); + } + + type_quals = TYPE_UNQUALIFIED; + if (declspecs->specs[(int)ds_const]) + type_quals |= TYPE_QUAL_CONST; + if (declspecs->specs[(int)ds_volatile]) + type_quals |= TYPE_QUAL_VOLATILE; + if (declspecs->specs[(int)ds_restrict]) + type_quals |= TYPE_QUAL_RESTRICT; + if (sfk == sfk_conversion && type_quals != TYPE_UNQUALIFIED) + error ("qualifiers are not allowed on declaration of %", + ctor_return_type); + + type_quals |= cp_type_quals (type); + type = cp_build_qualified_type_real + (type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl) + ? tf_ignore_bad_quals : 0) | tf_warning_or_error)); + /* We might have ignored or rejected some of the qualifiers. */ + type_quals = cp_type_quals (type); + + staticp = 0; + inlinep = !! declspecs->specs[(int)ds_inline]; + virtualp = !! declspecs->specs[(int)ds_virtual]; + explicitp = !! declspecs->specs[(int)ds_explicit]; + + storage_class = declspecs->storage_class; + if (storage_class == sc_static) + staticp = 1 + (decl_context == FIELD); + + if (virtualp && staticp == 2) + { + error ("member %qD cannot be declared both virtual and static", dname); + storage_class = sc_none; + staticp = 0; + } + friendp = !! declspecs->specs[(int)ds_friend]; + + if (dependent_name && !friendp) + { + error ("%<%T::%D%> is not a valid declarator", ctype, dependent_name); + return error_mark_node; + } + + /* Issue errors about use of storage classes for parameters. */ + if (decl_context == PARM) + { + if (declspecs->specs[(int)ds_typedef]) + { + error ("typedef declaration invalid in parameter declaration"); + return error_mark_node; + } + else if (template_parm_flag && storage_class != sc_none) + { + error ("storage class specified for template parameter %qs", name); + return error_mark_node; + } + else if (storage_class == sc_static + || storage_class == sc_extern + || thread_p) + error ("storage class specifiers invalid in parameter declarations"); + + /* Function parameters cannot be constexpr. If we saw one, moan + and pretend it wasn't there. */ + if (constexpr_p) + { + error ("a parameter cannot be declared %"); + constexpr_p = 0; + } + } + + /* Give error if `virtual' is used outside of class declaration. */ + if (virtualp + && (current_class_name == NULL_TREE || decl_context != FIELD)) + { + error ("% outside class declaration"); + virtualp = 0; + } + + /* Static anonymous unions are dealt with here. */ + if (staticp && decl_context == TYPENAME + && declspecs->type + && ANON_AGGR_TYPE_P (declspecs->type)) + decl_context = FIELD; + + /* Warn about storage classes that are invalid for certain + kinds of declarations (parameters, typenames, etc.). */ + if (thread_p + && ((storage_class + && storage_class != sc_extern + && storage_class != sc_static) + || declspecs->specs[(int)ds_typedef])) + { + error ("multiple storage classes in declaration of %qs", name); + thread_p = false; + } + if (decl_context != NORMAL + && ((storage_class != sc_none + && storage_class != sc_mutable) + || thread_p)) + { + if ((decl_context == PARM || decl_context == CATCHPARM) + && (storage_class == sc_register + || storage_class == sc_auto)) + ; + else if (declspecs->specs[(int)ds_typedef]) + ; + else if (decl_context == FIELD + /* C++ allows static class elements. */ + && storage_class == sc_static) + /* C++ also allows inlines and signed and unsigned elements, + but in those cases we don't come in here. */ + ; + else + { + if (decl_context == FIELD) + error ("storage class specified for %qs", name); + else + { + if (decl_context == PARM || decl_context == CATCHPARM) + error ("storage class specified for parameter %qs", name); + else + error ("storage class specified for typename"); + } + if (storage_class == sc_register + || storage_class == sc_auto + || storage_class == sc_extern + || thread_p) + storage_class = sc_none; + } + } + else if (storage_class == sc_extern && funcdef_flag + && ! toplevel_bindings_p ()) + error ("nested function %qs declared %", name); + else if (toplevel_bindings_p ()) + { + if (storage_class == sc_auto) + error ("top-level declaration of %qs specifies %", name); + } + else if (thread_p + && storage_class != sc_extern + && storage_class != sc_static) + { + error ("function-scope %qs implicitly auto and declared %<__thread%>", + name); + thread_p = false; + } + + if (storage_class && friendp) + { + error ("storage class specifiers invalid in friend function declarations"); + storage_class = sc_none; + staticp = 0; + } + + if (!id_declarator) + unqualified_id = NULL_TREE; + else + { + unqualified_id = id_declarator->u.id.unqualified_name; + switch (TREE_CODE (unqualified_id)) + { + case BIT_NOT_EXPR: + unqualified_id = TREE_OPERAND (unqualified_id, 0); + if (TYPE_P (unqualified_id)) + unqualified_id = constructor_name (unqualified_id); + break; + + case IDENTIFIER_NODE: + case TEMPLATE_ID_EXPR: + break; + + default: + gcc_unreachable (); + } + } + + /* Determine the type of the entity declared by recurring on the + declarator. */ + for (; declarator; declarator = declarator->declarator) + { + const cp_declarator *inner_declarator; + tree attrs; + + if (type == error_mark_node) + return error_mark_node; + + attrs = declarator->attributes; + if (attrs) + { + int attr_flags; + + attr_flags = 0; + if (declarator == NULL || declarator->kind == cdk_id) + attr_flags |= (int) ATTR_FLAG_DECL_NEXT; + if (declarator->kind == cdk_function) + attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT; + if (declarator->kind == cdk_array) + attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT; + returned_attrs = decl_attributes (&type, + chainon (returned_attrs, attrs), + attr_flags); + } + + if (declarator->kind == cdk_id) + break; + + inner_declarator = declarator->declarator; + + switch (declarator->kind) + { + case cdk_array: + type = create_array_type_for_decl (dname, type, + declarator->u.array.bounds); + break; + + case cdk_function: + { + tree arg_types; + int funcdecl_p; + + /* Declaring a function type. + Make sure we have a valid type for the function to return. */ + + if (type_quals != TYPE_UNQUALIFIED) + { + if (SCALAR_TYPE_P (type) || VOID_TYPE_P (type)) + warning (OPT_Wignored_qualifiers, + "type qualifiers ignored on function return type"); + /* We now know that the TYPE_QUALS don't apply to the + decl, but to its return type. */ + type_quals = TYPE_UNQUALIFIED; + } + errmsg = targetm.invalid_return_type (type); + if (errmsg) + { + error (errmsg); + type = integer_type_node; + } + + /* Error about some types functions can't return. */ + + if (TREE_CODE (type) == FUNCTION_TYPE) + { + error ("%qs declared as function returning a function", name); + return error_mark_node; + } + if (TREE_CODE (type) == ARRAY_TYPE) + { + error ("%qs declared as function returning an array", name); + return error_mark_node; + } + + /* Pick up type qualifiers which should be applied to `this'. */ + memfn_quals = declarator->u.function.qualifiers; + + /* Pick up the exception specifications. */ + raises = declarator->u.function.exception_specification; + /* If the exception-specification is ill-formed, let's pretend + there wasn't one. */ + if (raises == error_mark_node) + raises = NULL_TREE; + + /* Say it's a definition only for the CALL_EXPR + closest to the identifier. */ + funcdecl_p = inner_declarator && inner_declarator->kind == cdk_id; + + /* Handle a late-specified return type. */ + if (funcdecl_p) + { + if (type_uses_auto (type)) + { + if (!declarator->u.function.late_return_type) + { + error ("%qs function uses % type specifier without" + " late return type", name); + return error_mark_node; + } + else if (!is_auto (type)) + { + error ("%qs function with late return type has" + " %qT as its type rather than plain %", + name, type); + return error_mark_node; + } + } + else if (declarator->u.function.late_return_type) + { + error ("%qs function with late return type not declared" + " with % type specifier", name); + return error_mark_node; + } + } + type = splice_late_return_type + (type, declarator->u.function.late_return_type); + if (type == error_mark_node) + return error_mark_node; + + if (ctype == NULL_TREE + && decl_context == FIELD + && funcdecl_p + && (friendp == 0 || dname == current_class_name)) + ctype = current_class_type; + + if (ctype && (sfk == sfk_constructor + || sfk == sfk_destructor)) + { + /* We are within a class's scope. If our declarator name + is the same as the class name, and we are defining + a function, then it is a constructor/destructor, and + therefore returns a void type. */ + + /* ISO C++ 12.4/2. A destructor may not be declared + const or volatile. A destructor may not be + static. + + ISO C++ 12.1. A constructor may not be declared + const or volatile. A constructor may not be + virtual. A constructor may not be static. */ + if (staticp == 2) + error ((flags == DTOR_FLAG) + ? "destructor cannot be static member function" + : "constructor cannot be static member function"); + if (memfn_quals) + { + error ((flags == DTOR_FLAG) + ? "destructors may not be cv-qualified" + : "constructors may not be cv-qualified"); + memfn_quals = TYPE_UNQUALIFIED; + } + + if (decl_context == FIELD + && !member_function_or_else (ctype, + current_class_type, + flags)) + return error_mark_node; + + if (flags != DTOR_FLAG) + { + /* It's a constructor. */ + if (explicitp == 1) + explicitp = 2; + if (virtualp) + { + permerror (input_location, "constructors cannot be declared virtual"); + virtualp = 0; + } + if (decl_context == FIELD + && sfk != sfk_constructor) + return error_mark_node; + } + if (decl_context == FIELD) + staticp = 0; + } + else if (friendp) + { + if (initialized) + error ("can%'t initialize friend function %qs", name); + if (virtualp) + { + /* Cannot be both friend and virtual. */ + error ("virtual functions cannot be friends"); + friendp = 0; + } + if (decl_context == NORMAL) + error ("friend declaration not in class definition"); + if (current_function_decl && funcdef_flag) + error ("can%'t define friend function %qs in a local " + "class definition", + name); + } + else if (ctype && sfk == sfk_conversion) + { + if (explicitp == 1) + { + maybe_warn_cpp0x (CPP0X_EXPLICIT_CONVERSION); + explicitp = 2; + } + } + + arg_types = grokparms (declarator->u.function.parameters, + &parms); + + if (inner_declarator + && inner_declarator->kind == cdk_id + && inner_declarator->u.id.sfk == sfk_destructor + && arg_types != void_list_node) + { + error ("destructors may not have parameters"); + arg_types = void_list_node; + parms = NULL_TREE; + } + + type = build_function_type (type, arg_types); + } + break; + + case cdk_pointer: + case cdk_reference: + case cdk_ptrmem: + /* Filter out pointers-to-references and references-to-references. + We can get these if a TYPE_DECL is used. */ + + if (TREE_CODE (type) == REFERENCE_TYPE) + { + if (declarator->kind != cdk_reference) + { + error ("cannot declare pointer to %q#T", type); + type = TREE_TYPE (type); + } + + /* In C++0x, we allow reference to reference declarations + that occur indirectly through typedefs [7.1.3/8 dcl.typedef] + and template type arguments [14.3.1/4 temp.arg.type]. The + check for direct reference to reference declarations, which + are still forbidden, occurs below. Reasoning behind the change + can be found in DR106, DR540, and the rvalue reference + proposals. */ + else if (cxx_dialect == cxx98) + { + error ("cannot declare reference to %q#T", type); + type = TREE_TYPE (type); + } + } + else if (VOID_TYPE_P (type)) + { + if (declarator->kind == cdk_reference) + error ("cannot declare reference to %q#T", type); + else if (declarator->kind == cdk_ptrmem) + error ("cannot declare pointer to %q#T member", type); + } + + /* We now know that the TYPE_QUALS don't apply to the decl, + but to the target of the pointer. */ + type_quals = TYPE_UNQUALIFIED; + + if (declarator->kind == cdk_ptrmem + && (TREE_CODE (type) == FUNCTION_TYPE + || (memfn_quals && TREE_CODE (type) == METHOD_TYPE))) + { + memfn_quals |= type_memfn_quals (type); + type = build_memfn_type (type, + declarator->u.pointer.class_type, + memfn_quals); + if (type == error_mark_node) + return error_mark_node; + memfn_quals = TYPE_UNQUALIFIED; + } + + if (TREE_CODE (type) == FUNCTION_TYPE + && type_memfn_quals (type) != TYPE_UNQUALIFIED) + error (declarator->kind == cdk_reference + ? G_("cannot declare reference to qualified function type %qT") + : G_("cannot declare pointer to qualified function type %qT"), + type); + + /* When the pointed-to type involves components of variable size, + care must be taken to ensure that the size evaluation code is + emitted early enough to dominate all the possible later uses + and late enough for the variables on which it depends to have + been assigned. + + This is expected to happen automatically when the pointed-to + type has a name/declaration of it's own, but special attention + is required if the type is anonymous. + + We handle the NORMAL and FIELD contexts here by inserting a + dummy statement that just evaluates the size at a safe point + and ensures it is not deferred until e.g. within a deeper + conditional context (c++/43555). + + We expect nothing to be needed here for PARM or TYPENAME. + Evaluating the size at this point for TYPENAME would + actually be incorrect, as we might be in the middle of an + expression with side effects on the pointed-to type size + "arguments" prior to the pointer declaration point and the + size evaluation could end up prior to the side effects. */ + + if (!TYPE_NAME (type) + && (decl_context == NORMAL || decl_context == FIELD) + && at_function_scope_p () + && variably_modified_type_p (type, NULL_TREE)) + { + /* First break out any side-effects. */ + stabilize_vla_size (TYPE_SIZE (type)); + /* And then force evaluation of the SAVE_EXPR. */ + finish_expr_stmt (TYPE_SIZE (type)); + } + + if (declarator->kind == cdk_reference) + { + /* In C++0x, the type we are creating a reference to might be + a typedef which is itself a reference type. In that case, + we follow the reference collapsing rules in + [7.1.3/8 dcl.typedef] to create the final reference type: + + "If a typedef TD names a type that is a reference to a type + T, an attempt to create the type 'lvalue reference to cv TD' + creates the type 'lvalue reference to T,' while an attempt + to create the type "rvalue reference to cv TD' creates the + type TD." + */ + if (VOID_TYPE_P (type)) + /* We already gave an error. */; + else if (TREE_CODE (type) == REFERENCE_TYPE) + { + if (declarator->u.reference.rvalue_ref) + /* Leave type alone. */; + else + type = cp_build_reference_type (TREE_TYPE (type), false); + } + else + type = cp_build_reference_type + (type, declarator->u.reference.rvalue_ref); + + /* In C++0x, we need this check for direct reference to + reference declarations, which are forbidden by + [8.3.2/5 dcl.ref]. Reference to reference declarations + are only allowed indirectly through typedefs and template + type arguments. Example: + + void foo(int & &); // invalid ref-to-ref decl + + typedef int & int_ref; + void foo(int_ref &); // valid ref-to-ref decl + */ + if (inner_declarator && inner_declarator->kind == cdk_reference) + error ("cannot declare reference to %q#T, which is not " + "a typedef or a template type argument", type); + } + else if (TREE_CODE (type) == METHOD_TYPE) + type = build_ptrmemfunc_type (build_pointer_type (type)); + else if (declarator->kind == cdk_ptrmem) + { + gcc_assert (TREE_CODE (declarator->u.pointer.class_type) + != NAMESPACE_DECL); + if (declarator->u.pointer.class_type == error_mark_node) + /* We will already have complained. */ + type = error_mark_node; + else + type = build_ptrmem_type (declarator->u.pointer.class_type, + type); + } + else + type = build_pointer_type (type); + + /* Process a list of type modifier keywords (such as + const or volatile) that were given inside the `*' or `&'. */ + + if (declarator->u.pointer.qualifiers) + { + type + = cp_build_qualified_type (type, + declarator->u.pointer.qualifiers); + type_quals = cp_type_quals (type); + } + ctype = NULL_TREE; + break; + + case cdk_error: + break; + + default: + gcc_unreachable (); + } + } + + /* We need to stabilize side-effects in VLA sizes for regular array + declarations too, not just pointers to arrays. */ + if (type != error_mark_node && !TYPE_NAME (type) + && (decl_context == NORMAL || decl_context == FIELD) + && at_function_scope_p () + && variably_modified_type_p (type, NULL_TREE)) + stabilize_vla_size (TYPE_SIZE (type)); + + /* A `constexpr' specifier used in an object declaration declares + the object as `const'. */ + if (constexpr_p && innermost_code != cdk_function) + { + if (type_quals & TYPE_QUAL_CONST) + error ("both % and % cannot be used here"); + if (type_quals & TYPE_QUAL_VOLATILE) + error ("both % and % cannot be used here"); + type_quals |= TYPE_QUAL_CONST; + type = cp_build_qualified_type (type, type_quals); + } + + if (unqualified_id && TREE_CODE (unqualified_id) == TEMPLATE_ID_EXPR + && TREE_CODE (type) != FUNCTION_TYPE + && TREE_CODE (type) != METHOD_TYPE) + { + error ("template-id %qD used as a declarator", + unqualified_id); + unqualified_id = dname; + } + + /* If TYPE is a FUNCTION_TYPE, but the function name was explicitly + qualified with a class-name, turn it into a METHOD_TYPE, unless + we know that the function is static. We take advantage of this + opportunity to do other processing that pertains to entities + explicitly declared to be class members. Note that if DECLARATOR + is non-NULL, we know it is a cdk_id declarator; otherwise, we + would not have exited the loop above. */ + if (declarator + && declarator->u.id.qualifying_scope + && TYPE_P (declarator->u.id.qualifying_scope)) + { + tree t; + + ctype = declarator->u.id.qualifying_scope; + ctype = TYPE_MAIN_VARIANT (ctype); + t = ctype; + while (t != NULL_TREE && CLASS_TYPE_P (t)) + { + /* You're supposed to have one `template <...>' for every + template class, but you don't need one for a full + specialization. For example: + + template struct S{}; + template <> struct S { void f(); }; + void S::f () {} + + is correct; there shouldn't be a `template <>' for the + definition of `S::f'. */ + if (CLASSTYPE_TEMPLATE_SPECIALIZATION (t) + && !any_dependent_template_arguments_p (CLASSTYPE_TI_ARGS (t))) + /* T is an explicit (not partial) specialization. All + containing classes must therefore also be explicitly + specialized. */ + break; + if ((CLASSTYPE_USE_TEMPLATE (t) || CLASSTYPE_IS_TEMPLATE (t)) + && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t))) + template_count += 1; + + t = TYPE_MAIN_DECL (t); + t = DECL_CONTEXT (t); + } + + if (ctype == current_class_type) + { + if (friendp) + { + permerror (input_location, "member functions are implicitly friends of their class"); + friendp = 0; + } + else + permerror (declarator->id_loc, + "extra qualification %<%T::%> on member %qs", + ctype, name); + } + else if (/* If the qualifying type is already complete, then we + can skip the following checks. */ + !COMPLETE_TYPE_P (ctype) + && (/* If the function is being defined, then + qualifying type must certainly be complete. */ + funcdef_flag + /* A friend declaration of "T::f" is OK, even if + "T" is a template parameter. But, if this + function is not a friend, the qualifying type + must be a class. */ + || (!friendp && !CLASS_TYPE_P (ctype)) + /* For a declaration, the type need not be + complete, if either it is dependent (since there + is no meaningful definition of complete in that + case) or the qualifying class is currently being + defined. */ + || !(dependent_type_p (ctype) + || currently_open_class (ctype))) + /* Check that the qualifying type is complete. */ + && !complete_type_or_else (ctype, NULL_TREE)) + return error_mark_node; + else if (TREE_CODE (type) == FUNCTION_TYPE) + { + if (current_class_type + && (!friendp || funcdef_flag)) + { + error (funcdef_flag + ? "cannot define member function %<%T::%s%> within %<%T%>" + : "cannot declare member function %<%T::%s%> within %<%T%>", + ctype, name, current_class_type); + return error_mark_node; + } + } + else if (declspecs->specs[(int)ds_typedef] + && current_class_type) + { + error ("cannot declare member %<%T::%s%> within %qT", + ctype, name, current_class_type); + return error_mark_node; + } + } + + if (ctype == NULL_TREE && decl_context == FIELD && friendp == 0) + ctype = current_class_type; + + /* A constexpr non-static member function is implicitly const. */ + if (constexpr_p && ctype && staticp == 0 + && TREE_CODE (type) == FUNCTION_TYPE + && sfk != sfk_constructor && sfk != sfk_destructor) + memfn_quals |= TYPE_QUAL_CONST; + + /* Now TYPE has the actual type. */ + + if (returned_attrs) + { + if (attrlist) + *attrlist = chainon (returned_attrs, *attrlist); + else + attrlist = &returned_attrs; + } + + /* Handle parameter packs. */ + if (parameter_pack_p) + { + if (decl_context == PARM) + /* Turn the type into a pack expansion.*/ + type = make_pack_expansion (type); + else + error ("non-parameter %qs cannot be a parameter pack", name); + } + + /* Did array size calculations overflow? */ + + if (TREE_CODE (type) == ARRAY_TYPE + && COMPLETE_TYPE_P (type) + && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST + && TREE_OVERFLOW (TYPE_SIZE_UNIT (type))) + { + error ("size of array %qs is too large", name); + /* If we proceed with the array type as it is, we'll eventually + crash in tree_low_cst(). */ + type = error_mark_node; + } + + if ((decl_context == FIELD || decl_context == PARM) + && !processing_template_decl + && variably_modified_type_p (type, NULL_TREE)) + { + if (decl_context == FIELD) + error ("data member may not have variably modified type %qT", type); + else + error ("parameter may not have variably modified type %qT", type); + type = error_mark_node; + } + + if (explicitp == 1 || (explicitp && friendp)) + { + /* [dcl.fct.spec] The explicit specifier shall only be used in + declarations of constructors within a class definition. */ + error ("only declarations of constructors can be %"); + explicitp = 0; + } + + if (storage_class == sc_mutable) + { + if (decl_context != FIELD || friendp) + { + error ("non-member %qs cannot be declared %", name); + storage_class = sc_none; + } + else if (decl_context == TYPENAME || declspecs->specs[(int)ds_typedef]) + { + error ("non-object member %qs cannot be declared %", name); + storage_class = sc_none; + } + else if (TREE_CODE (type) == FUNCTION_TYPE + || TREE_CODE (type) == METHOD_TYPE) + { + error ("function %qs cannot be declared %", name); + storage_class = sc_none; + } + else if (staticp) + { + error ("static %qs cannot be declared %", name); + storage_class = sc_none; + } + else if (type_quals & TYPE_QUAL_CONST) + { + error ("const %qs cannot be declared %", name); + storage_class = sc_none; + } + else if (TREE_CODE (type) == REFERENCE_TYPE) + { + permerror (input_location, "reference %qs cannot be declared " + "%", name); + storage_class = sc_none; + } + } + + /* If this is declaring a typedef name, return a TYPE_DECL. */ + if (declspecs->specs[(int)ds_typedef] && decl_context != TYPENAME) + { + tree decl; + + /* Note that the grammar rejects storage classes + in typenames, fields or parameters. */ + if (current_lang_name == lang_name_java) + TYPE_FOR_JAVA (type) = 1; + + /* This declaration: + + typedef void f(int) const; + + declares a function type which is not a member of any + particular class, but which is cv-qualified; for + example "f S::*" declares a pointer to a const-qualified + member function of S. We record the cv-qualification in the + function type. */ + if (memfn_quals && TREE_CODE (type) == FUNCTION_TYPE) + { + type = apply_memfn_quals (type, memfn_quals); + + /* We have now dealt with these qualifiers. */ + memfn_quals = TYPE_UNQUALIFIED; + } + + if (type_uses_auto (type)) + { + error ("typedef declared %"); + type = error_mark_node; + } + + if (decl_context == FIELD) + decl = build_lang_decl (TYPE_DECL, unqualified_id, type); + else + decl = build_decl (input_location, TYPE_DECL, unqualified_id, type); + if (id_declarator && declarator->u.id.qualifying_scope) { + error_at (DECL_SOURCE_LOCATION (decl), + "typedef name may not be a nested-name-specifier"); + TREE_TYPE (decl) = error_mark_node; + } + + if (decl_context != FIELD) + { + if (!current_function_decl) + DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); + else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (current_function_decl) + || (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P + (current_function_decl))) + /* The TYPE_DECL is "abstract" because there will be + clones of this constructor/destructor, and there will + be copies of this TYPE_DECL generated in those + clones. */ + DECL_ABSTRACT (decl) = 1; + } + else if (constructor_name_p (unqualified_id, current_class_type)) + permerror (input_location, "ISO C++ forbids nested type %qD with same name " + "as enclosing class", + unqualified_id); + + /* If the user declares "typedef struct {...} foo" then the + struct will have an anonymous name. Fill that name in now. + Nothing can refer to it, so nothing needs know about the name + change. */ + if (type != error_mark_node + && unqualified_id + && TYPE_NAME (type) + && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL + && TYPE_ANONYMOUS_P (type) + && cp_type_quals (type) == TYPE_UNQUALIFIED) + { + tree t; + + /* Replace the anonymous name with the real name everywhere. */ + for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) + { + if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))) + /* We do not rename the debug info representing the + anonymous tagged type because the standard says in + [dcl.typedef] that the naming applies only for + linkage purposes. */ + /*debug_hooks->set_name (t, decl);*/ + TYPE_NAME (t) = decl; + } + + if (TYPE_LANG_SPECIFIC (type)) + TYPE_WAS_ANONYMOUS (type) = 1; + + /* If this is a typedef within a template class, the nested + type is a (non-primary) template. The name for the + template needs updating as well. */ + if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_TEMPLATE_INFO (type)) + DECL_NAME (CLASSTYPE_TI_TEMPLATE (type)) + = TYPE_IDENTIFIER (type); + + /* Adjust linkage now that we aren't anonymous anymore. */ + reset_type_linkage (type); + + /* FIXME remangle member functions; member functions of a + type with external linkage have external linkage. */ + } + + if (signed_p + || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) + C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; + + bad_specifiers (decl, BSP_TYPE, virtualp, + memfn_quals != TYPE_UNQUALIFIED, + inlinep, friendp, raises != NULL_TREE); + + return decl; + } + + /* Detect the case of an array type of unspecified size + which came, as such, direct from a typedef name. + We must copy the type, so that the array's domain can be + individually set by the object's initializer. */ + + if (type && typedef_type + && TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type) + && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type)) + 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) + { + tree decls = NULL_TREE; + tree args; + + for (args = TYPE_ARG_TYPES (type); + args && args != void_list_node; + args = TREE_CHAIN (args)) + { + tree decl = cp_build_parm_decl (NULL_TREE, TREE_VALUE (args)); + + DECL_CHAIN (decl) = decls; + decls = decl; + } + + parms = nreverse (decls); + + if (decl_context != TYPENAME) + { + /* A cv-qualifier-seq shall only be part of the function type + for a non-static member function. [8.3.5/4 dcl.fct] */ + if (type_memfn_quals (type) != TYPE_UNQUALIFIED + && (current_class_type == NULL_TREE || staticp) ) + { + error (staticp + ? G_("qualified function types cannot be used to " + "declare static member functions") + : G_("qualified function types cannot be used to " + "declare free functions")); + type = TYPE_MAIN_VARIANT (type); + } + + /* The qualifiers on the function type become the qualifiers on + the non-static member function. */ + memfn_quals |= type_memfn_quals (type); + type_quals = TYPE_UNQUALIFIED; + } + } + + /* If this is a type name (such as, in a cast or sizeof), + compute the type and return it now. */ + + if (decl_context == TYPENAME) + { + /* Note that the grammar rejects storage classes + in typenames, fields or parameters. */ + if (type_quals != TYPE_UNQUALIFIED) + type_quals = TYPE_UNQUALIFIED; + + /* Special case: "friend class foo" looks like a TYPENAME context. */ + if (friendp) + { + if (type_quals != TYPE_UNQUALIFIED) + { + error ("type qualifiers specified for friend class declaration"); + type_quals = TYPE_UNQUALIFIED; + } + if (inlinep) + { + error ("% specified for friend class declaration"); + inlinep = 0; + } + + if (!current_aggr) + { + /* Don't allow friend declaration without a class-key. */ + if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) + permerror (input_location, "template parameters cannot be friends"); + else if (TREE_CODE (type) == TYPENAME_TYPE) + permerror (input_location, "friend declaration requires class-key, " + "i.e. %", + TYPE_CONTEXT (type), TYPENAME_TYPE_FULLNAME (type)); + else + permerror (input_location, "friend declaration requires class-key, " + "i.e. %", + type); + } + + /* 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 %qT a friend of global scope", + type); + + type = void_type_node; + } + } + else if (memfn_quals) + { + if (ctype == NULL_TREE + && TREE_CODE (type) == METHOD_TYPE) + ctype = TYPE_METHOD_BASETYPE (type); + + if (ctype) + type = build_memfn_type (type, ctype, memfn_quals); + /* Core issue #547: need to allow this in template type args. */ + else if (template_type_arg && TREE_CODE (type) == FUNCTION_TYPE) + type = apply_memfn_quals (type, memfn_quals); + else + error ("invalid qualifiers on non-member function type"); + } + + return type; + } + else if (unqualified_id == NULL_TREE && decl_context != PARM + && decl_context != CATCHPARM + && TREE_CODE (type) != UNION_TYPE + && ! bitfield) + { + error ("abstract declarator %qT used as declaration", type); + return error_mark_node; + } + + /* Only functions may be declared using an operator-function-id. */ + if (unqualified_id + && IDENTIFIER_OPNAME_P (unqualified_id) + && TREE_CODE (type) != FUNCTION_TYPE + && TREE_CODE (type) != METHOD_TYPE) + { + error ("declaration of %qD as non-function", unqualified_id); + return error_mark_node; + } + + /* We don't check parameter types here because we can emit a better + error message later. */ + if (decl_context != PARM) + { + type = check_var_type (unqualified_id, type); + if (type == error_mark_node) + return error_mark_node; + } + + /* Now create the decl, which may be a VAR_DECL, a PARM_DECL + or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ + + if (decl_context == PARM || decl_context == CATCHPARM) + { + if (ctype || in_namespace) + error ("cannot use %<::%> in parameter declaration"); + + if (type_uses_auto (type)) + { + error ("parameter declared %"); + type = error_mark_node; + } + + /* A parameter declared as an array of T is really a pointer to T. + One declared as a function is really a pointer to a function. + One declared as a member is really a pointer to member. */ + + if (TREE_CODE (type) == ARRAY_TYPE) + { + /* Transfer const-ness of array into that of type pointed to. */ + type = build_pointer_type (TREE_TYPE (type)); + type_quals = TYPE_UNQUALIFIED; + } + else if (TREE_CODE (type) == FUNCTION_TYPE) + type = build_pointer_type (type); + } + + if (ctype && TREE_CODE (type) == FUNCTION_TYPE && staticp < 2 + && !NEW_DELETE_OPNAME_P (unqualified_id)) + type = build_memfn_type (type, ctype, memfn_quals); + + { + tree decl; + + if (decl_context == PARM) + { + decl = cp_build_parm_decl (unqualified_id, type); + + bad_specifiers (decl, BSP_PARM, virtualp, + memfn_quals != TYPE_UNQUALIFIED, + inlinep, friendp, raises != NULL_TREE); + } + 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, + tf_warning_or_error); + type = build_cplus_array_type (TREE_TYPE (type), itype); + } + + if (type == error_mark_node) + { + /* Happens when declaring arrays of sizes which + are error_mark_node, for example. */ + decl = NULL_TREE; + } + else if (in_namespace && !friendp) + { + /* Something like struct S { int N::j; }; */ + error ("invalid use of %<::%>"); + return error_mark_node; + } + else if (TREE_CODE (type) == FUNCTION_TYPE + || TREE_CODE (type) == METHOD_TYPE) + { + int publicp = 0; + tree function_context; + + if (friendp == 0) + { + /* This should never happen in pure C++ (the check + could be an assert). It could happen in + Objective-C++ if someone writes invalid code that + uses a function declaration for an instance + variable or property (instance variables and + properties are parsed as FIELD_DECLs, but they are + part of an Objective-C class, not a C++ class). + That code is invalid and is caught by this + check. */ + if (!ctype) + { + error ("declaration of function %qD in invalid context", + unqualified_id); + return error_mark_node; + } + + /* ``A union may [ ... ] not [ have ] virtual functions.'' + ARM 9.5 */ + if (virtualp && TREE_CODE (ctype) == UNION_TYPE) + { + error ("function %qD declared virtual inside a union", + unqualified_id); + return error_mark_node; + } + + if (NEW_DELETE_OPNAME_P (unqualified_id)) + { + if (virtualp) + { + error ("%qD cannot be declared virtual, since it " + "is always static", + unqualified_id); + virtualp = 0; + } + } + } + + /* Check that the name used for a destructor makes sense. */ + if (sfk == sfk_destructor) + { + tree uqname = id_declarator->u.id.unqualified_name; + + if (!ctype) + { + gcc_assert (friendp); + error ("expected qualified name in friend declaration " + "for destructor %qD", uqname); + return error_mark_node; + } + + if (!check_dtor_name (ctype, TREE_OPERAND (uqname, 0))) + { + error ("declaration of %qD as member of %qT", + uqname, ctype); + return error_mark_node; + } + if (constexpr_p) + { + error ("a destructor cannot be %"); + return error_mark_node; + } + } + else if (sfk == sfk_constructor && friendp && !ctype) + { + error ("expected qualified name in friend declaration " + "for constructor %qD", + id_declarator->u.id.unqualified_name); + return error_mark_node; + } + + /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ + function_context = (ctype != NULL_TREE) ? + decl_function_context (TYPE_MAIN_DECL (ctype)) : NULL_TREE; + publicp = (! friendp || ! staticp) + && function_context == NULL_TREE; + decl = grokfndecl (ctype, type, + TREE_CODE (unqualified_id) != TEMPLATE_ID_EXPR + ? unqualified_id : dname, + parms, + unqualified_id, + virtualp, flags, memfn_quals, raises, + friendp ? -1 : 0, friendp, publicp, + inlinep | (2 * constexpr_p), + sfk, + funcdef_flag, template_count, in_namespace, + attrlist, declarator->id_loc); + if (decl == NULL_TREE) + return error_mark_node; +#if 0 + /* This clobbers the attrs stored in `decl' from `attrlist'. */ + /* The decl and setting of decl_attr is also turned off. */ + decl = build_decl_attribute_variant (decl, decl_attr); +#endif + + /* [class.conv.ctor] + + A constructor declared without the function-specifier + explicit that can be called with a single parameter + specifies a conversion from the type of its first + parameter to the type of its class. Such a constructor + is called a converting constructor. */ + if (explicitp == 2) + DECL_NONCONVERTING_P (decl) = 1; + } + else if (!staticp && !dependent_type_p (type) + && !COMPLETE_TYPE_P (complete_type (type)) + && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) + { + if (unqualified_id) + error ("field %qD has incomplete type", unqualified_id); + else + error ("name %qT has incomplete type", type); + + /* If we're instantiating a template, tell them which + instantiation made the field's type be incomplete. */ + if (current_class_type + && TYPE_NAME (current_class_type) + && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (current_class_type)) + && declspecs->type + && declspecs->type == type) + error (" in instantiation of template %qT", + current_class_type); + + return error_mark_node; + } + else + { + if (friendp) + { + error ("%qE is neither function nor member function; " + "cannot be declared friend", unqualified_id); + friendp = 0; + } + decl = NULL_TREE; + } + + if (friendp) + { + /* Friends are treated specially. */ + if (ctype == current_class_type) + ; /* We already issued a permerror. */ + else if (decl && DECL_NAME (decl)) + { + if (template_class_depth (current_class_type) == 0) + { + decl = check_explicit_specialization + (unqualified_id, decl, template_count, + 2 * funcdef_flag + 4); + if (decl == error_mark_node) + return error_mark_node; + } + + DECL_DECLARED_CONSTEXPR_P (decl) = constexpr_p; + decl = do_friend (ctype, unqualified_id, decl, + *attrlist, flags, + funcdef_flag); + return decl; + } + else + return error_mark_node; + } + + /* Structure field. It may not be a function, except for C++. */ + + if (decl == NULL_TREE) + { + if (initialized) + { + if (!staticp) + { + /* An attempt is being made to initialize a non-static + member. But, from [class.mem]: + + 4 A member-declarator can contain a + constant-initializer only if it declares a static + member (_class.static_) of integral or enumeration + type, see _class.static.data_. + + This used to be relatively common practice, but + the rest of the compiler does not correctly + handle the initialization unless the member is + static so we make it static below. */ + if (cxx_dialect >= cxx0x) + { + sorry ("non-static data member initializers"); + } + else + { + permerror (input_location, "ISO C++ forbids initialization of member %qD", + unqualified_id); + permerror (input_location, "making %qD static", unqualified_id); + staticp = 1; + } + } + + if (uses_template_parms (type)) + /* We'll check at instantiation time. */ + ; + else if (constexpr_p) + /* constexpr has the same requirements. */ + ; + else if (check_static_variable_definition (unqualified_id, + type)) + /* If we just return the declaration, crashes + will sometimes occur. We therefore return + void_type_node, as if this was a friend + declaration, to cause callers to completely + ignore this declaration. */ + return error_mark_node; + } + + if (staticp) + { + /* C++ allows static class members. All other work + for this is done by grokfield. */ + decl = build_lang_decl (VAR_DECL, unqualified_id, type); + set_linkage_for_static_data_member (decl); + /* Even if there is an in-class initialization, DECL + is considered undefined until an out-of-class + definition is provided. */ + DECL_EXTERNAL (decl) = 1; + + if (thread_p) + DECL_TLS_MODEL (decl) = decl_default_tls_model (decl); + + if (constexpr_p && !initialized) + { + error ("constexpr static data member %qD must have an " + "initializer", decl); + constexpr_p = false; + } + } + else + { + if (constexpr_p) + { + error ("non-static data member %qE declared %", + unqualified_id); + constexpr_p = false; + } + decl = build_decl (input_location, + FIELD_DECL, unqualified_id, type); + DECL_NONADDRESSABLE_P (decl) = bitfield; + if (bitfield && !unqualified_id) + TREE_NO_WARNING (decl) = 1; + + if (storage_class == sc_mutable) + { + DECL_MUTABLE_P (decl) = 1; + storage_class = sc_none; + } + } + + bad_specifiers (decl, BSP_FIELD, virtualp, + memfn_quals != TYPE_UNQUALIFIED, + inlinep, friendp, raises != NULL_TREE); + } + } + else if (TREE_CODE (type) == FUNCTION_TYPE + || TREE_CODE (type) == METHOD_TYPE) + { + tree original_name; + int publicp = 0; + + if (!unqualified_id) + return error_mark_node; + + if (TREE_CODE (unqualified_id) == TEMPLATE_ID_EXPR) + original_name = dname; + else + original_name = unqualified_id; + + if (storage_class == sc_auto) + error ("storage class % invalid for function %qs", name); + else if (storage_class == sc_register) + error ("storage class % invalid for function %qs", name); + else if (thread_p) + error ("storage class %<__thread%> invalid for function %qs", name); + + /* Function declaration not at top level. + Storage classes other than `extern' are not allowed + and `extern' makes no difference. */ + if (! toplevel_bindings_p () + && (storage_class == sc_static + || declspecs->specs[(int)ds_inline]) + && pedantic) + { + if (storage_class == sc_static) + pedwarn (input_location, OPT_pedantic, + "% specified invalid for function %qs " + "declared out of global scope", name); + else + pedwarn (input_location, OPT_pedantic, + "% specifier invalid for function %qs " + "declared out of global scope", name); + } + + if (ctype != NULL_TREE + && TREE_CODE (ctype) != NAMESPACE_DECL && !MAYBE_CLASS_TYPE_P (ctype)) + { + error ("%q#T is not a class or a namespace", ctype); + ctype = NULL_TREE; + } + + if (ctype == NULL_TREE) + { + if (virtualp) + { + error ("virtual non-class function %qs", name); + virtualp = 0; + } + else if (sfk == sfk_constructor + || sfk == sfk_destructor) + { + error (funcdef_flag + ? "%qs defined in a non-class scope" + : "%qs declared in a non-class scope", name); + sfk = sfk_none; + } + } + + /* Record presence of `static'. */ + publicp = (ctype != NULL_TREE + || storage_class == sc_extern + || storage_class != sc_static); + + decl = grokfndecl (ctype, type, original_name, parms, unqualified_id, + virtualp, flags, memfn_quals, raises, + 1, friendp, + publicp, inlinep | (2 * constexpr_p), sfk, + funcdef_flag, + template_count, in_namespace, attrlist, + declarator->id_loc); + if (decl == NULL_TREE) + return error_mark_node; + + if (staticp == 1) + { + int invalid_static = 0; + + /* Don't allow a static member function in a class, and forbid + declaring main to be static. */ + if (TREE_CODE (type) == METHOD_TYPE) + { + permerror (input_location, "cannot declare member function %qD to have " + "static linkage", decl); + invalid_static = 1; + } + else if (current_function_decl) + { + /* FIXME need arm citation */ + error ("cannot declare static function inside another function"); + invalid_static = 1; + } + + if (invalid_static) + { + staticp = 0; + storage_class = sc_none; + } + } + } + else + { + /* It's a variable. */ + + /* An uninitialized decl with `extern' is a reference. */ + decl = grokvardecl (type, unqualified_id, + declspecs, + initialized, + (type_quals & TYPE_QUAL_CONST) != 0, + ctype ? ctype : in_namespace); + bad_specifiers (decl, BSP_VAR, virtualp, + memfn_quals != TYPE_UNQUALIFIED, + inlinep, friendp, raises != NULL_TREE); + + if (ctype) + { + DECL_CONTEXT (decl) = ctype; + if (staticp == 1) + { + permerror (input_location, "% may not be used when defining " + "(as opposed to declaring) a static data member"); + staticp = 0; + storage_class = sc_none; + } + if (storage_class == sc_register && TREE_STATIC (decl)) + { + error ("static member %qD declared %", decl); + storage_class = sc_none; + } + if (storage_class == sc_extern && pedantic) + { + pedwarn (input_location, OPT_pedantic, + "cannot explicitly declare member %q#D to have " + "extern linkage", decl); + storage_class = sc_none; + } + } + else if (constexpr_p && DECL_EXTERNAL (decl)) + error ("declaration of constexpr variable %qD is not a definition", + decl); + } + + if (storage_class == sc_extern && initialized && !funcdef_flag) + { + if (toplevel_bindings_p ()) + { + /* It's common practice (and completely valid) to have a const + be initialized and declared extern. */ + if (!(type_quals & TYPE_QUAL_CONST)) + warning (0, "%qs initialized and declared %", name); + } + else + { + error ("%qs has both % and initializer", name); + return error_mark_node; + } + } + + /* Record `register' declaration for warnings on & + and in case doing stupid register allocation. */ + + if (storage_class == sc_register) + DECL_REGISTER (decl) = 1; + else if (storage_class == sc_extern) + DECL_THIS_EXTERN (decl) = 1; + else if (storage_class == sc_static) + DECL_THIS_STATIC (decl) = 1; + + /* Don't forget constexprness. */ + if (constexpr_p) + DECL_DECLARED_CONSTEXPR_P (decl) = true; + + /* Record constancy and volatility on the DECL itself . There's + no need to do this when processing a template; we'll do this + for the instantiated declaration based on the type of DECL. */ + if (!processing_template_decl) + cp_apply_type_quals_to_decl (type_quals, decl); + + return decl; + } +} + +/* 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 = DECL_CHAIN (parms)) + { + if (dependent_type_p (TREE_TYPE (parms))) + continue; + if (!VOID_TYPE_P (TREE_TYPE (parms)) + && complete_type_or_else (TREE_TYPE (parms), parms)) + { + relayout_decl (parms); + DECL_ARG_TYPE (parms) = type_passed_as (TREE_TYPE (parms)); + } + else + /* grokparms or complete_type_or_else will have already issued + an error. */ + TREE_TYPE (parms) = error_mark_node; + } +} + +/* Returns nonzero if T is a local variable. */ + +int +local_variable_p (const_tree t) +{ + if ((TREE_CODE (t) == VAR_DECL + /* A VAR_DECL with a context that is a _TYPE is a static data + member. */ + && !TYPE_P (CP_DECL_CONTEXT (t)) + /* Any other non-local variable must be at namespace scope. */ + && !DECL_NAMESPACE_SCOPE_P (t)) + || (TREE_CODE (t) == PARM_DECL)) + return 1; + + return 0; +} + +/* Like local_variable_p, but suitable for use as a tree-walking + function. */ + +static tree +local_variable_p_walkfn (tree *tp, int *walk_subtrees, + void *data ATTRIBUTE_UNUSED) +{ + if (local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp)) + return *tp; + else if (TYPE_P (*tp)) + *walk_subtrees = 0; + + return NULL_TREE; +} + + +/* Check that ARG, which is a default-argument expression for a + parameter DECL, is valid. Returns ARG, or ERROR_MARK_NODE, if + something goes wrong. DECL may also be a _TYPE node, rather than a + DECL, if there is no DECL available. */ + +tree +check_default_argument (tree decl, tree arg) +{ + tree var; + tree decl_type; + + if (TREE_CODE (arg) == DEFAULT_ARG) + /* We get a DEFAULT_ARG when looking at an in-class declaration + with a default argument. Ignore the argument for now; we'll + deal with it after the class is complete. */ + return arg; + + if (TYPE_P (decl)) + { + decl_type = decl; + decl = NULL_TREE; + } + else + decl_type = TREE_TYPE (decl); + + if (arg == error_mark_node + || decl == error_mark_node + || TREE_TYPE (arg) == error_mark_node + || decl_type == error_mark_node) + /* Something already went wrong. There's no need to check + further. */ + return error_mark_node; + + /* [dcl.fct.default] + + A default argument expression is implicitly converted to the + parameter type. */ + if (!TREE_TYPE (arg) + || !can_convert_arg (decl_type, TREE_TYPE (arg), arg, LOOKUP_NORMAL)) + { + if (decl) + error ("default argument for %q#D has type %qT", + decl, TREE_TYPE (arg)); + else + error ("default argument for parameter of type %qT has type %qT", + decl_type, TREE_TYPE (arg)); + + return error_mark_node; + } + + /* [dcl.fct.default] + + Local variables shall not be used in default argument + expressions. + + The keyword `this' shall not be used in a default argument of a + member function. */ + var = cp_walk_tree_without_duplicates (&arg, local_variable_p_walkfn, NULL); + if (var) + { + error ("default argument %qE uses local variable %qD", arg, var); + return error_mark_node; + } + + /* All is well. */ + return arg; +} + +/* Returns a deprecated type used within TYPE, or NULL_TREE if none. */ + +static tree +type_is_deprecated (tree type) +{ + enum tree_code code; + if (TREE_DEPRECATED (type)) + return type; + if (TYPE_NAME (type) + && TREE_DEPRECATED (TYPE_NAME (type))) + return type; + + /* Do warn about using typedefs to a deprecated class. */ + if (TAGGED_TYPE_P (type) && type != TYPE_MAIN_VARIANT (type)) + return type_is_deprecated (TYPE_MAIN_VARIANT (type)); + + code = TREE_CODE (type); + + if (code == POINTER_TYPE || code == REFERENCE_TYPE + || code == OFFSET_TYPE || code == FUNCTION_TYPE + || code == METHOD_TYPE || code == ARRAY_TYPE) + return type_is_deprecated (TREE_TYPE (type)); + + if (TYPE_PTRMEMFUNC_P (type)) + return type_is_deprecated + (TREE_TYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type)))); + + return NULL_TREE; +} + +/* Decode the list of parameter types for a function type. + Given the list of things declared inside the parens, + return a list of types. + + If this parameter does not end with an ellipsis, we append + void_list_node. + + *PARMS is set to the chain of PARM_DECLs created. */ + +static tree +grokparms (tree parmlist, tree *parms) +{ + tree result = NULL_TREE; + tree decls = NULL_TREE; + tree parm; + int any_error = 0; + + for (parm = parmlist; parm != NULL_TREE; parm = TREE_CHAIN (parm)) + { + tree type = NULL_TREE; + tree init = TREE_PURPOSE (parm); + tree decl = TREE_VALUE (parm); + const char *errmsg; + + if (parm == void_list_node) + break; + + if (! decl || TREE_TYPE (decl) == error_mark_node) + continue; + + type = TREE_TYPE (decl); + if (VOID_TYPE_P (type)) + { + if (same_type_p (type, void_type_node) + && DECL_SELF_REFERENCE_P (type) + && !DECL_NAME (decl) && !result && TREE_CHAIN (parm) == void_list_node) + /* this is a parmlist of `(void)', which is ok. */ + break; + cxx_incomplete_type_error (decl, type); + /* It's not a good idea to actually create parameters of + type `void'; other parts of the compiler assume that a + void type terminates the parameter list. */ + type = error_mark_node; + TREE_TYPE (decl) = error_mark_node; + } + + if (type != error_mark_node + && TYPE_FOR_JAVA (type) + && MAYBE_CLASS_TYPE_P (type)) + { + error ("parameter %qD has Java class type", decl); + type = error_mark_node; + TREE_TYPE (decl) = error_mark_node; + init = NULL_TREE; + } + + if (type != error_mark_node + && (errmsg = targetm.invalid_parameter_type (type))) + { + error (errmsg); + type = error_mark_node; + TREE_TYPE (decl) = error_mark_node; + } + + if (type != error_mark_node) + { + if (deprecated_state != DEPRECATED_SUPPRESS) + { + tree deptype = type_is_deprecated (type); + if (deptype) + warn_deprecated_use (deptype, NULL_TREE); + } + + /* 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 %qD 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)) + { + /* [dcl.fct]/6, parameter types cannot contain pointers + (references) to arrays of unknown bound. */ + tree t = TREE_TYPE (type); + int ptr = TYPE_PTR_P (type); + + while (1) + { + if (TYPE_PTR_P (t)) + ptr = 1; + else if (TREE_CODE (t) != ARRAY_TYPE) + break; + else if (!TYPE_DOMAIN (t)) + break; + t = TREE_TYPE (t); + } + if (TREE_CODE (t) == ARRAY_TYPE) + error (ptr + ? G_("parameter %qD includes pointer to array of " + "unknown bound %qT") + : G_("parameter %qD includes reference to array of " + "unknown bound %qT"), + decl, t); + } + + if (any_error) + init = NULL_TREE; + else if (init && !processing_template_decl) + init = check_default_argument (decl, init); + } + + DECL_CHAIN (decl) = decls; + decls = decl; + result = tree_cons (init, type, result); + } + decls = nreverse (decls); + result = nreverse (result); + if (parm) + result = chainon (result, void_list_node); + *parms = decls; + + return result; +} + + +/* D is a constructor or overloaded `operator='. + + Let T be the class in which D is declared. Then, this function + returns: + + -1 if D's is an ill-formed constructor or copy assignment operator + whose first parameter is of type `T'. + 0 if D is not a copy constructor or copy assignment + operator. + 1 if D is a copy constructor or copy assignment operator whose + first parameter is a reference to non-const qualified T. + 2 if D is a copy constructor or copy assignment operator whose + first parameter is a reference to const qualified T. + + This function can be used as a predicate. Positive values indicate + a copy constructor and nonzero values indicate a copy assignment + operator. */ + +int +copy_fn_p (const_tree d) +{ + tree args; + tree arg_type; + int result = 1; + + gcc_assert (DECL_FUNCTION_MEMBER_P (d)); + + if (TREE_CODE (d) == TEMPLATE_DECL + || (DECL_TEMPLATE_INFO (d) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d)))) + /* Instantiations of template member functions are never copy + functions. Note that member functions of templated classes are + represented as template functions internally, and we must + accept those as copy functions. */ + return 0; + + args = FUNCTION_FIRST_USER_PARMTYPE (d); + if (!args) + return 0; + + arg_type = TREE_VALUE (args); + if (arg_type == error_mark_node) + return 0; + + if (TYPE_MAIN_VARIANT (arg_type) == DECL_CONTEXT (d)) + { + /* Pass by value copy assignment operator. */ + result = -1; + } + else if (TREE_CODE (arg_type) == REFERENCE_TYPE + && !TYPE_REF_IS_RVALUE (arg_type) + && TYPE_MAIN_VARIANT (TREE_TYPE (arg_type)) == DECL_CONTEXT (d)) + { + if (CP_TYPE_CONST_P (TREE_TYPE (arg_type))) + result = 2; + } + else + return 0; + + args = TREE_CHAIN (args); + + if (args && args != void_list_node && !TREE_PURPOSE (args)) + /* There are more non-optional args. */ + return 0; + + return result; +} + +/* D is a constructor or overloaded `operator='. + + Let T be the class in which D is declared. Then, this function + returns true when D is a move constructor or move assignment + operator, false otherwise. */ + +bool +move_fn_p (const_tree d) +{ + tree args; + tree arg_type; + bool result = false; + + gcc_assert (DECL_FUNCTION_MEMBER_P (d)); + + if (cxx_dialect == cxx98) + /* There are no move constructors if we are in C++98 mode. */ + return false; + + if (TREE_CODE (d) == TEMPLATE_DECL + || (DECL_TEMPLATE_INFO (d) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d)))) + /* Instantiations of template member functions are never copy + functions. Note that member functions of templated classes are + represented as template functions internally, and we must + accept those as copy functions. */ + return 0; + + args = FUNCTION_FIRST_USER_PARMTYPE (d); + if (!args) + return 0; + + arg_type = TREE_VALUE (args); + if (arg_type == error_mark_node) + return 0; + + if (TREE_CODE (arg_type) == REFERENCE_TYPE + && TYPE_REF_IS_RVALUE (arg_type) + && same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (arg_type)), + DECL_CONTEXT (d))) + result = true; + + args = TREE_CHAIN (args); + + if (args && args != void_list_node && !TREE_PURPOSE (args)) + /* There are more non-optional args. */ + return false; + + return result; +} + +/* Remember any special properties of member function DECL. */ + +void +grok_special_member_properties (tree decl) +{ + tree class_type; + + if (!DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)) + return; + + class_type = DECL_CONTEXT (decl); + if (DECL_CONSTRUCTOR_P (decl)) + { + int ctor = copy_fn_p (decl); + + if (!DECL_ARTIFICIAL (decl)) + TYPE_HAS_USER_CONSTRUCTOR (class_type) = 1; + + if (ctor > 0) + { + /* [class.copy] + + A non-template constructor for class X is a copy + constructor if its first parameter is of type X&, const + X&, volatile X& or const volatile X&, and either there + are no other parameters or else all other parameters have + default arguments. */ + TYPE_HAS_COPY_CTOR (class_type) = 1; + if (user_provided_p (decl)) + TYPE_HAS_COMPLEX_COPY_CTOR (class_type) = 1; + if (ctor > 1) + TYPE_HAS_CONST_COPY_CTOR (class_type) = 1; + } + else if (sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (decl))) + { + TYPE_HAS_DEFAULT_CONSTRUCTOR (class_type) = 1; + if (user_provided_p (decl)) + TYPE_HAS_COMPLEX_DFLT (class_type) = 1; + } + else if (move_fn_p (decl) && user_provided_p (decl)) + TYPE_HAS_COMPLEX_MOVE_CTOR (class_type) = 1; + else if (is_list_ctor (decl)) + TYPE_HAS_LIST_CTOR (class_type) = 1; + + if (DECL_DECLARED_CONSTEXPR_P (decl) + && !copy_fn_p (decl) && !move_fn_p (decl)) + TYPE_HAS_CONSTEXPR_CTOR (class_type) = 1; + } + else if (DECL_OVERLOADED_OPERATOR_P (decl) == NOP_EXPR) + { + /* [class.copy] + + A non-template assignment operator for class X is a copy + assignment operator if its parameter is of type X, X&, const + X&, volatile X& or const volatile X&. */ + + int assop = copy_fn_p (decl); + + if (assop) + { + TYPE_HAS_COPY_ASSIGN (class_type) = 1; + if (user_provided_p (decl)) + TYPE_HAS_COMPLEX_COPY_ASSIGN (class_type) = 1; + if (assop != 1) + TYPE_HAS_CONST_COPY_ASSIGN (class_type) = 1; + } + else if (move_fn_p (decl) && user_provided_p (decl)) + TYPE_HAS_COMPLEX_MOVE_ASSIGN (class_type) = 1; + } + /* Destructors are handled in check_methods. */ +} + +/* Check a constructor DECL has the correct form. Complains + if the class has a constructor of the form X(X). */ + +int +grok_ctor_properties (const_tree ctype, const_tree decl) +{ + int ctor_parm = copy_fn_p (decl); + + if (ctor_parm < 0) + { + /* [class.copy] + + A declaration of a constructor for a class X is ill-formed if + its first parameter is of type (optionally cv-qualified) X + and either there are no other parameters or else all other + parameters have default arguments. + + We *don't* complain about member template instantiations that + have this form, though; they can occur as we try to decide + what constructor to use during overload resolution. Since + overload resolution will never prefer such a constructor to + the non-template copy constructor (which is either explicitly + or implicitly defined), there's no need to worry about their + existence. Theoretically, they should never even be + instantiated, but that's hard to forestall. */ + error ("invalid constructor; you probably meant %<%T (const %T&)%>", + ctype, ctype); + return 0; + } + + return 1; +} + +/* 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 + || code == UNARY_PLUS_EXPR + || code == NEGATE_EXPR + || code == PREINCREMENT_EXPR + || code == PREDECREMENT_EXPR); +} + +/* 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 + || code == COMPONENT_REF + || code == TYPE_EXPR); +} + +/* DECL is a declaration for an overloaded operator. If COMPLAIN is true, + errors are issued for invalid declarations. */ + +bool +grok_op_properties (tree decl, bool complain) +{ + tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); + tree argtype; + int methodp = (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE); + tree name = DECL_NAME (decl); + enum tree_code operator_code; + int arity; + bool ellipsis_p; + tree class_type; + + /* Count the number of arguments and check for ellipsis. */ + for (argtype = argtypes, arity = 0; + argtype && argtype != void_list_node; + argtype = TREE_CHAIN (argtype)) + ++arity; + ellipsis_p = !argtype; + + class_type = DECL_CONTEXT (decl); + if (class_type && !CLASS_TYPE_P (class_type)) + class_type = NULL_TREE; + + if (DECL_CONV_FN_P (decl)) + operator_code = TYPE_EXPR; + else + do + { +#define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P) \ + if (ansi_opname (CODE) == name) \ + { \ + operator_code = (CODE); \ + break; \ + } \ + else if (ansi_assopname (CODE) == name) \ + { \ + operator_code = (CODE); \ + DECL_ASSIGNMENT_OPERATOR_P (decl) = 1; \ + break; \ + } + +#include "operators.def" +#undef DEF_OPERATOR + + gcc_unreachable (); + } + while (0); + gcc_assert (operator_code != MAX_TREE_CODES); + SET_OVERLOADED_OPERATOR_CODE (decl, operator_code); + + if (class_type) + switch (operator_code) + { + case NEW_EXPR: + TYPE_HAS_NEW_OPERATOR (class_type) = 1; + break; + + case DELETE_EXPR: + TYPE_GETS_DELETE (class_type) |= 1; + break; + + case VEC_NEW_EXPR: + TYPE_HAS_ARRAY_NEW_OPERATOR (class_type) = 1; + break; + + case VEC_DELETE_EXPR: + TYPE_GETS_DELETE (class_type) |= 2; + break; + + default: + break; + } + + /* [basic.std.dynamic.allocation]/1: + + A program is ill-formed if an allocation function is declared + in a namespace scope other than global scope or declared static + in global scope. + + The same also holds true for deallocation functions. */ + if (operator_code == NEW_EXPR || operator_code == VEC_NEW_EXPR + || operator_code == DELETE_EXPR || operator_code == VEC_DELETE_EXPR) + { + if (DECL_NAMESPACE_SCOPE_P (decl)) + { + if (CP_DECL_CONTEXT (decl) != global_namespace) + { + error ("%qD may not be declared within a namespace", decl); + return false; + } + else if (!TREE_PUBLIC (decl)) + { + error ("%qD may not be declared as static", decl); + return false; + } + } + } + + if (operator_code == NEW_EXPR || operator_code == VEC_NEW_EXPR) + { + TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl)); + DECL_IS_OPERATOR_NEW (decl) = 1; + } + 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 + or have at least one parameter of a class, a reference to a class, + an enumeration, or a reference to an enumeration. 13.4.0.6 */ + if (! methodp || DECL_STATIC_FUNCTION_P (decl)) + { + if (operator_code == TYPE_EXPR + || operator_code == CALL_EXPR + || operator_code == COMPONENT_REF + || operator_code == ARRAY_REF + || operator_code == NOP_EXPR) + { + error ("%qD must be a nonstatic member function", decl); + return false; + } + else + { + tree p; + + if (DECL_STATIC_FUNCTION_P (decl)) + { + error ("%qD must be either a non-static member " + "function or a non-member function", decl); + return false; + } + + for (p = argtypes; p && p != void_list_node; p = TREE_CHAIN (p)) + { + tree arg = non_reference (TREE_VALUE (p)); + if (arg == error_mark_node) + return false; + + /* MAYBE_CLASS_TYPE_P, rather than CLASS_TYPE_P, is used + because these checks are performed even on + template functions. */ + if (MAYBE_CLASS_TYPE_P (arg) + || TREE_CODE (arg) == ENUMERAL_TYPE) + break; + } + + if (!p || p == void_list_node) + { + if (complain) + error ("%qD must have an argument of class or " + "enumerated type", decl); + return false; + } + } + } + + /* There are no restrictions on the arguments to an overloaded + "operator ()". */ + if (operator_code == CALL_EXPR) + return true; + + /* Warn about conversion operators that will never be used. */ + if (IDENTIFIER_TYPENAME_P (name) + && ! DECL_TEMPLATE_INFO (decl) + && warn_conversion + /* Warn only declaring the function; there is no need to + warn again about out-of-class definitions. */ + && class_type == current_class_type) + { + tree t = TREE_TYPE (name); + int ref = (TREE_CODE (t) == REFERENCE_TYPE); + + if (ref) + t = TYPE_MAIN_VARIANT (TREE_TYPE (t)); + + if (TREE_CODE (t) == VOID_TYPE) + warning (OPT_Wconversion, + ref + ? G_("conversion to a reference to void " + "will never use a type conversion operator") + : G_("conversion to void " + "will never use a type conversion operator")); + else if (class_type) + { + if (t == class_type) + warning (OPT_Wconversion, + ref + ? G_("conversion to a reference to the same type " + "will never use a type conversion operator") + : G_("conversion to the same type " + "will never use a type conversion operator")); + /* Don't force t to be complete here. */ + else if (MAYBE_CLASS_TYPE_P (t) + && COMPLETE_TYPE_P (t) + && DERIVED_FROM_P (t, class_type)) + warning (OPT_Wconversion, + ref + ? G_("conversion to a reference to a base class " + "will never use a type conversion operator") + : G_("conversion to a base class " + "will never use a type conversion operator")); + } + + } + + if (operator_code == COND_EXPR) + { + /* 13.4.0.3 */ + error ("ISO C++ prohibits overloading operator ?:"); + return false; + } + else if (ellipsis_p) + { + error ("%qD must not have variable number of arguments", decl); + return false; + } + else if (ambi_op_p (operator_code)) + { + if (arity == 1) + /* We pick the one-argument operator codes by default, so + we don't have to change anything. */ + ; + else if (arity == 2) + { + /* If we thought this was a unary operator, we now know + it to be a binary operator. */ + switch (operator_code) + { + case INDIRECT_REF: + operator_code = MULT_EXPR; + break; + + case ADDR_EXPR: + operator_code = BIT_AND_EXPR; + break; + + case UNARY_PLUS_EXPR: + operator_code = PLUS_EXPR; + break; + + case NEGATE_EXPR: + operator_code = MINUS_EXPR; + break; + + case PREINCREMENT_EXPR: + operator_code = POSTINCREMENT_EXPR; + break; + + case PREDECREMENT_EXPR: + operator_code = POSTDECREMENT_EXPR; + break; + + default: + gcc_unreachable (); + } + + SET_OVERLOADED_OPERATOR_CODE (decl, operator_code); + + if ((operator_code == POSTINCREMENT_EXPR + || operator_code == POSTDECREMENT_EXPR) + && ! processing_template_decl + && ! same_type_p (TREE_VALUE (TREE_CHAIN (argtypes)), integer_type_node)) + { + if (methodp) + error ("postfix %qD must take % as its argument", + decl); + else + error ("postfix %qD must take % as its second " + "argument", decl); + return false; + } + } + else + { + if (methodp) + error ("%qD must take either zero or one argument", decl); + else + error ("%qD must take either one or two arguments", decl); + return false; + } + + /* More Effective C++ rule 6. */ + if (warn_ecpp + && (operator_code == POSTINCREMENT_EXPR + || operator_code == POSTDECREMENT_EXPR + || operator_code == PREINCREMENT_EXPR + || operator_code == PREDECREMENT_EXPR)) + { + tree arg = TREE_VALUE (argtypes); + tree ret = TREE_TYPE (TREE_TYPE (decl)); + if (methodp || TREE_CODE (arg) == REFERENCE_TYPE) + arg = TREE_TYPE (arg); + arg = TYPE_MAIN_VARIANT (arg); + if (operator_code == PREINCREMENT_EXPR + || operator_code == PREDECREMENT_EXPR) + { + if (TREE_CODE (ret) != REFERENCE_TYPE + || !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ret)), + arg)) + warning (OPT_Weffc__, "prefix %qD should return %qT", decl, + build_reference_type (arg)); + } + else + { + if (!same_type_p (TYPE_MAIN_VARIANT (ret), arg)) + warning (OPT_Weffc__, "postfix %qD should return %qT", decl, arg); + } + } + } + else if (unary_op_p (operator_code)) + { + if (arity != 1) + { + if (methodp) + error ("%qD must take %", decl); + else + error ("%qD must take exactly one argument", decl); + return false; + } + } + else /* if (binary_op_p (operator_code)) */ + { + if (arity != 2) + { + if (methodp) + error ("%qD must take exactly one argument", decl); + else + error ("%qD must take exactly two arguments", decl); + return false; + } + + /* More Effective C++ rule 7. */ + if (warn_ecpp + && (operator_code == TRUTH_ANDIF_EXPR + || operator_code == TRUTH_ORIF_EXPR + || operator_code == COMPOUND_EXPR)) + warning (OPT_Weffc__, "user-defined %qD always evaluates both arguments", + decl); + } + + /* Effective C++ rule 23. */ + if (warn_ecpp + && arity == 2 + && !DECL_ASSIGNMENT_OPERATOR_P (decl) + && (operator_code == PLUS_EXPR + || operator_code == MINUS_EXPR + || operator_code == TRUNC_DIV_EXPR + || operator_code == MULT_EXPR + || operator_code == TRUNC_MOD_EXPR) + && TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) == REFERENCE_TYPE) + warning (OPT_Weffc__, "%qD should return by value", decl); + + /* [over.oper]/8 */ + for (; argtypes && argtypes != void_list_node; + argtypes = TREE_CHAIN (argtypes)) + if (TREE_PURPOSE (argtypes)) + { + TREE_PURPOSE (argtypes) = NULL_TREE; + if (operator_code == POSTINCREMENT_EXPR + || operator_code == POSTDECREMENT_EXPR) + { + pedwarn (input_location, OPT_pedantic, "%qD cannot have default arguments", + decl); + } + else + { + error ("%qD cannot have default arguments", decl); + return false; + } + } + } + return true; +} + +/* Return a string giving the keyword associate with CODE. */ + +static const char * +tag_name (enum tag_types code) +{ + switch (code) + { + case record_type: + return "struct"; + case class_type: + return "class"; + case union_type: + return "union"; + case enum_type: + return "enum"; + case typename_type: + return "typename"; + default: + gcc_unreachable (); + } +} + +/* 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); + + /* Check TEMPLATE_TYPE_PARM first because DECL_IMPLICIT_TYPEDEF_P + is false for this case as well. */ + if (TREE_CODE (type) == TEMPLATE_TYPE_PARM) + { + error ("using template type parameter %qT after %qs", + type, tag_name (tag_code)); + return error_mark_node; + } + /* [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. */ + else if (!DECL_IMPLICIT_TYPEDEF_P (decl) + && !DECL_SELF_REFERENCE_P (decl) + && tag_code != typename_type) + { + error ("using typedef-name %qD after %qs", decl, tag_name (tag_code)); + error ("%q+D has a previous declaration here", decl); + return error_mark_node; + } + else if (TREE_CODE (type) != RECORD_TYPE + && TREE_CODE (type) != UNION_TYPE + && tag_code != enum_type + && tag_code != typename_type) + { + error ("%qT referred to as %qs", type, tag_name (tag_code)); + error ("%q+T has a previous declaration here", type); + return error_mark_node; + } + else if (TREE_CODE (type) != ENUMERAL_TYPE + && tag_code == enum_type) + { + error ("%qT referred to as enum", type); + error ("%q+T has a previous declaration here", 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; +} + +/* Lookup NAME in elaborate type specifier in scope according to + SCOPE and issue diagnostics if necessary. + Return *_TYPE node upon success, NULL_TREE when the NAME is not + found, and ERROR_MARK_NODE for type error. */ + +static tree +lookup_and_check_tag (enum tag_types tag_code, tree name, + tag_scope scope, bool template_header_p) +{ + tree t; + tree decl; + if (scope == ts_global) + { + /* First try ordinary name lookup, ignoring hidden class name + injected via friend declaration. */ + decl = lookup_name_prefer_type (name, 2); + /* If that fails, the name will be placed in the smallest + non-class, non-function-prototype scope according to 3.3.1/5. + We may already have a hidden name declared as friend in this + scope. So lookup again but not ignoring hidden names. + If we find one, that name will be made visible rather than + creating a new tag. */ + if (!decl) + decl = lookup_type_scope (name, ts_within_enclosing_non_class); + } + else + decl = lookup_type_scope (name, scope); + + if (decl && DECL_CLASS_TEMPLATE_P (decl)) + decl = DECL_TEMPLATE_RESULT (decl); + + if (decl && TREE_CODE (decl) == TYPE_DECL) + { + /* Look for invalid nested type: + class C { + class C {}; + }; */ + if (scope == ts_current && DECL_SELF_REFERENCE_P (decl)) + { + error ("%qD has the same name as the class in which it is " + "declared", + decl); + return error_mark_node; + } + + /* 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)); + return t; + } + else if (decl && TREE_CODE (decl) == TREE_LIST) + { + error ("reference to %qD is ambiguous", name); + print_candidates (decl); + return error_mark_node; + } + else + return NULL_TREE; +} + +/* 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. + + SCOPE is TS_CURRENT when this is also a definition. Only look in + the current frame for the name (since C++ allows new names in any + scope.) It is TS_WITHIN_ENCLOSING_NON_CLASS if this is a friend + declaration. Only look beginning from the current scope outward up + till the nearest non-class scope. Otherwise it is TS_GLOBAL. + + 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, + tag_scope scope, bool template_header_p) +{ + enum tree_code code; + tree t; + tree context = NULL_TREE; + + timevar_push (TV_NAME_LOOKUP); + + gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); + + switch (tag_code) + { + case record_type: + case class_type: + code = RECORD_TYPE; + break; + case union_type: + code = UNION_TYPE; + break; + case enum_type: + code = ENUMERAL_TYPE; + break; + default: + gcc_unreachable (); + } + + /* In case of anonymous name, xref_tag is only called to + make type node and push name. Name lookup is not required. */ + if (ANON_AGGRNAME_P (name)) + t = NULL_TREE; + else + t = lookup_and_check_tag (tag_code, name, + scope, template_header_p); + + if (t == error_mark_node) + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + + if (scope != ts_current && t && current_class_type + && template_class_depth (current_class_type) + && template_header_p) + { + /* Since SCOPE is not TS_CURRENT, we are not looking at a + definition of this tag. Since, in addition, we are currently + processing a (member) template declaration of a template + class, we must be very careful; consider: + + template + struct S1 + + template + struct S2 + { template + friend struct S1; }; + + Here, the S2::S1 declaration should not be confused with the + outer declaration. In particular, the inner version should + have a template parameter of level 2, not level 1. This + would be particularly important if the member declaration + were instead: + + template friend struct S1; + + say, when we should tsubst into `U' when instantiating + S2. On the other hand, when presented with: + + template + struct S1 { + template + struct S2 {}; + template + friend struct S2; + }; + + we must find the inner binding eventually. We + 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". + When a real declaration of this type is found, + the forward-reference will be altered into a real type. */ + if (code == ENUMERAL_TYPE) + { + error ("use of enum %q#D without previous declaration", name); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + } + else + { + t = make_class_type (code); + TYPE_CONTEXT (t) = context; + t = pushtag (name, t, scope); + } + } + else + { + if (template_header_p && MAYBE_CLASS_TYPE_P (t)) + { + if (!redeclare_class_template (t, current_template_parms)) + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + } + else if (!processing_template_decl + && CLASS_TYPE_P (t) + && CLASSTYPE_IS_TEMPLATE (t)) + { + error ("redeclaration of %qT as a non-template", t); + error ("previous declaration %q+D", t); + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node); + } + + /* Make injected friend class visible. */ + if (scope != ts_within_enclosing_non_class + && hidden_name_p (TYPE_NAME (t))) + { + DECL_ANTICIPATED (TYPE_NAME (t)) = 0; + DECL_FRIEND_P (TYPE_NAME (t)) = 0; + + if (TYPE_TEMPLATE_INFO (t)) + { + DECL_ANTICIPATED (TYPE_TI_TEMPLATE (t)) = 0; + DECL_FRIEND_P (TYPE_TI_TEMPLATE (t)) = 0; + } + } + } + + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); +} + +tree +xref_tag_from_type (tree old, tree id, tag_scope scope) +{ + enum tag_types tag_kind; + + if (TREE_CODE (old) == RECORD_TYPE) + tag_kind = (CLASSTYPE_DECLARED_CLASS (old) ? class_type : record_type); + else + tag_kind = union_type; + + if (id == NULL_TREE) + id = TYPE_IDENTIFIER (old); + + return xref_tag (tag_kind, id, scope, false); +} + +/* Create the binfo hierarchy for REF with (possibly NULL) base list + BASE_LIST. For each element on BASE_LIST the TREE_PURPOSE is an + access_* node, and the TREE_VALUE is the type of the base-class. + Non-NULL TREE_TYPE indicates virtual inheritance. + + Returns true if the binfo hierarchy was successfully created, + false if an error was detected. */ + +bool +xref_basetypes (tree ref, tree base_list) +{ + tree *basep; + tree binfo, base_binfo; + unsigned max_vbases = 0; /* Maximum direct & indirect virtual bases. */ + unsigned max_bases = 0; /* Maximum direct bases. */ + int i; + tree default_access; + tree igo_prev; /* Track Inheritance Graph Order. */ + + if (ref == error_mark_node) + return false; + + /* The base of a derived class is private by default, all others are + public. */ + default_access = (TREE_CODE (ref) == RECORD_TYPE + && CLASSTYPE_DECLARED_CLASS (ref) + ? access_private_node : access_public_node); + + /* 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 + { + max_bases++; + if (TREE_TYPE (*basep)) + max_vbases++; + if (CLASS_TYPE_P (basetype)) + max_vbases += VEC_length (tree, CLASSTYPE_VBASECLASSES (basetype)); + basep = &TREE_CHAIN (*basep); + } + } + + TYPE_MARKED_P (ref) = 1; + + /* The binfo slot should be empty, unless this is an (ill-formed) + redefinition. */ + if (TYPE_BINFO (ref) && !TYPE_SIZE (ref)) + { + error ("redefinition of %q#T", ref); + return false; + } + + gcc_assert (TYPE_MAIN_VARIANT (ref) == ref); + + binfo = make_tree_binfo (max_bases); + + TYPE_BINFO (ref) = binfo; + BINFO_OFFSET (binfo) = size_zero_node; + BINFO_TYPE (binfo) = ref; + + /* Apply base-class info set up to the variants of this type. */ + fixup_type_variants (ref); + + if (max_bases) + { + BINFO_BASE_ACCESSES (binfo) = VEC_alloc (tree, gc, max_bases); + /* An aggregate cannot have baseclasses. */ + CLASSTYPE_NON_AGGREGATE (ref) = 1; + + if (TREE_CODE (ref) == UNION_TYPE) + { + error ("derived union %qT invalid", ref); + return false; + } + } + + if (max_bases > 1) + { + if (TYPE_FOR_JAVA (ref)) + { + error ("Java class %qT cannot have multiple bases", ref); + return false; + } + } + + if (max_vbases) + { + CLASSTYPE_VBASECLASSES (ref) = VEC_alloc (tree, gc, max_vbases); + + if (TYPE_FOR_JAVA (ref)) + { + error ("Java class %qT cannot have virtual bases", ref); + return false; + } + } + + for (igo_prev = binfo; base_list; base_list = TREE_CHAIN (base_list)) + { + tree access = TREE_PURPOSE (base_list); + int via_virtual = TREE_TYPE (base_list) != NULL_TREE; + tree basetype = TREE_VALUE (base_list); + + if (access == access_default_node) + access = default_access; + + if (PACK_EXPANSION_P (basetype)) + basetype = PACK_EXPANSION_PATTERN (basetype); + if (TREE_CODE (basetype) == TYPE_DECL) + basetype = TREE_TYPE (basetype); + if (!MAYBE_CLASS_TYPE_P (basetype) || TREE_CODE (basetype) == UNION_TYPE) + { + error ("base type %qT fails to be a struct or class type", + basetype); + return false; + } + + if (TYPE_FOR_JAVA (basetype) && (current_lang_depth () == 0)) + TYPE_FOR_JAVA (ref) = 1; + + base_binfo = NULL_TREE; + if (CLASS_TYPE_P (basetype) && !dependent_type_p (basetype)) + { + base_binfo = TYPE_BINFO (basetype); + /* The original basetype could have been a typedef'd type. */ + basetype = BINFO_TYPE (base_binfo); + + /* Inherit flags from the base. */ + TYPE_HAS_NEW_OPERATOR (ref) + |= TYPE_HAS_NEW_OPERATOR (basetype); + TYPE_HAS_ARRAY_NEW_OPERATOR (ref) + |= TYPE_HAS_ARRAY_NEW_OPERATOR (basetype); + TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype); + TYPE_HAS_CONVERSION (ref) |= TYPE_HAS_CONVERSION (basetype); + CLASSTYPE_DIAMOND_SHAPED_P (ref) + |= CLASSTYPE_DIAMOND_SHAPED_P (basetype); + CLASSTYPE_REPEATED_BASE_P (ref) + |= CLASSTYPE_REPEATED_BASE_P (basetype); + } + + /* We must do this test after we've seen through a typedef + type. */ + if (TYPE_MARKED_P (basetype)) + { + if (basetype == ref) + error ("recursive type %qT undefined", basetype); + else + error ("duplicate base type %qT invalid", basetype); + return false; + } + + if (PACK_EXPANSION_P (TREE_VALUE (base_list))) + /* Regenerate the pack expansion for the bases. */ + basetype = make_pack_expansion (basetype); + + TYPE_MARKED_P (basetype) = 1; + + base_binfo = copy_binfo (base_binfo, basetype, ref, + &igo_prev, via_virtual); + if (!BINFO_INHERITANCE_CHAIN (base_binfo)) + BINFO_INHERITANCE_CHAIN (base_binfo) = binfo; + + BINFO_BASE_APPEND (binfo, base_binfo); + BINFO_BASE_ACCESS_APPEND (binfo, access); + } + + if (VEC_space (tree, CLASSTYPE_VBASECLASSES (ref), 1)) + /* If we have space in the vbase vector, we must have shared at + least one of them, and are therefore diamond shaped. */ + CLASSTYPE_DIAMOND_SHAPED_P (ref) = 1; + + /* Unmark all the types. */ + for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) + TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 0; + TYPE_MARKED_P (ref) = 0; + + /* Now see if we have a repeated base type. */ + if (!CLASSTYPE_REPEATED_BASE_P (ref)) + { + for (base_binfo = binfo; base_binfo; + base_binfo = TREE_CHAIN (base_binfo)) + { + if (TYPE_MARKED_P (BINFO_TYPE (base_binfo))) + { + CLASSTYPE_REPEATED_BASE_P (ref) = 1; + break; + } + TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 1; + } + for (base_binfo = binfo; base_binfo; + base_binfo = TREE_CHAIN (base_binfo)) + if (TYPE_MARKED_P (BINFO_TYPE (base_binfo))) + TYPE_MARKED_P (BINFO_TYPE (base_binfo)) = 0; + else + break; + } + + return true; +} + + +/* Copies the enum-related properties from type SRC to type DST. + Used with the underlying type of an enum and the enum itself. */ +static void +copy_type_enum (tree dst, tree src) +{ + tree t; + for (t = dst; t; t = TYPE_NEXT_VARIANT (t)) + { + TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (src); + TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (src); + TYPE_SIZE (t) = TYPE_SIZE (src); + TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (src); + SET_TYPE_MODE (dst, TYPE_MODE (src)); + TYPE_PRECISION (t) = TYPE_PRECISION (src); + TYPE_ALIGN (t) = TYPE_ALIGN (src); + TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (src); + TYPE_UNSIGNED (t) = TYPE_UNSIGNED (src); + } +} + +/* Begin compiling the definition of an enumeration type. + NAME is its name, + + if ENUMTYPE is not NULL_TREE then the type has alredy been found. + + UNDERLYING_TYPE is the type that will be used as the storage for + the enumeration type. This should be NULL_TREE if no storage type + was specified. + + SCOPED_ENUM_P is true if this is a scoped enumeration type. + + if IS_NEW is not NULL, gets TRUE iff a new type is created. + + Returns the type object, as yet incomplete. + Also records info about it so that build_enumerator + may be used to declare the individual values as they are read. */ + +tree +start_enum (tree name, tree enumtype, tree underlying_type, + bool scoped_enum_p, bool *is_new) +{ + tree prevtype = NULL_TREE; + gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE); + + if (is_new) + *is_new = false; + /* [C++0x dcl.enum]p5: + + If not explicitly specified, the underlying type of a scoped + enumeration type is int. */ + if (!underlying_type && scoped_enum_p) + underlying_type = integer_type_node; + + if (underlying_type) + underlying_type = cv_unqualified (underlying_type); + + /* If this is the real definition for a previous forward reference, + fill in the contents in the same object that used to be the + forward reference. */ + if (!enumtype) + enumtype = lookup_and_check_tag (enum_type, name, + /*tag_scope=*/ts_current, + /*template_header_p=*/false); + + /* In case of a template_decl, the only check that should be deferred + to instantiation time is the comparison of underlying types. */ + if (enumtype && TREE_CODE (enumtype) == ENUMERAL_TYPE) + { + if (scoped_enum_p != SCOPED_ENUM_P (enumtype)) + { + error_at (input_location, "scoped/unscoped mismatch " + "in enum %q#T", enumtype); + error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)), + "previous definition here"); + enumtype = error_mark_node; + } + else if (ENUM_FIXED_UNDERLYING_TYPE_P (enumtype) != !! underlying_type) + { + error_at (input_location, "underlying type mismatch " + "in enum %q#T", enumtype); + error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)), + "previous definition here"); + enumtype = error_mark_node; + } + else if (underlying_type && ENUM_UNDERLYING_TYPE (enumtype) + && !dependent_type_p (underlying_type) + && !dependent_type_p (ENUM_UNDERLYING_TYPE (enumtype)) + && !same_type_p (underlying_type, + ENUM_UNDERLYING_TYPE (enumtype))) + { + error_at (input_location, "different underlying type " + "in enum %q#T", enumtype); + error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (enumtype)), + "previous definition here"); + underlying_type = NULL_TREE; + } + } + + if (!enumtype || TREE_CODE (enumtype) != ENUMERAL_TYPE + || processing_template_decl) + { + /* In case of error, make a dummy enum to allow parsing to + continue. */ + if (enumtype == error_mark_node) + { + name = make_anon_name (); + enumtype = NULL_TREE; + } + + /* enumtype may be an ENUMERAL_TYPE if this is a redefinition + of an opaque enum, or an opaque enum of an already defined + enumeration (C++0x only). + In any other case, it'll be NULL_TREE. */ + if (!enumtype) + { + if (is_new) + *is_new = true; + } + prevtype = enumtype; + enumtype = cxx_make_type (ENUMERAL_TYPE); + enumtype = pushtag (name, enumtype, /*tag_scope=*/ts_current); + if (enumtype == error_mark_node) + return error_mark_node; + + /* The enum is considered opaque until the opening '{' of the + enumerator list. */ + SET_OPAQUE_ENUM_P (enumtype, true); + ENUM_FIXED_UNDERLYING_TYPE_P (enumtype) = !! underlying_type; + } + + SET_SCOPED_ENUM_P (enumtype, scoped_enum_p); + + if (underlying_type) + { + if (CP_INTEGRAL_TYPE_P (underlying_type)) + { + copy_type_enum (enumtype, underlying_type); + ENUM_UNDERLYING_TYPE (enumtype) = underlying_type; + } + else if (dependent_type_p (underlying_type)) + ENUM_UNDERLYING_TYPE (enumtype) = underlying_type; + else + error ("underlying type %<%T%> of %<%T%> must be an integral type", + underlying_type, enumtype); + } + + /* If into a template class, the returned enum is always the first + declaration (opaque or not) seen. This way all the references to + this type will be to the same declaration. The following ones are used + only to check for definition errors. */ + if (prevtype && processing_template_decl) + return prevtype; + else + return enumtype; +} + +/* After processing and defining all the values of an enumeration type, + install their decls in the enumeration type. + ENUMTYPE is the type object. */ + +void +finish_enum_value_list (tree enumtype) +{ + tree values; + tree underlying_type; + tree decl; + tree value; + tree minnode, maxnode; + tree t; + + bool fixed_underlying_type_p + = ENUM_UNDERLYING_TYPE (enumtype) != NULL_TREE; + + /* We built up the VALUES in reverse order. */ + TYPE_VALUES (enumtype) = nreverse (TYPE_VALUES (enumtype)); + + /* For an enum defined in a template, just set the type of the values; + all further processing is postponed until the template is + instantiated. We need to set the type so that tsubst of a CONST_DECL + works. */ + if (processing_template_decl) + { + for (values = TYPE_VALUES (enumtype); + values; + values = TREE_CHAIN (values)) + TREE_TYPE (TREE_VALUE (values)) = 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 + closing brace, the type of each enumerator is the type of its + initializing value. */ + TREE_TYPE (decl) = enumtype; + + /* Update the minimum and maximum values, if appropriate. */ + value = DECL_INITIAL (decl); + if (value == error_mark_node) + value = integer_zero_node; + /* Figure out what the minimum and maximum values of the + enumerators are. */ + if (!minnode) + minnode = maxnode = value; + else if (tree_int_cst_lt (maxnode, value)) + maxnode = value; + else if (tree_int_cst_lt (value, minnode)) + minnode = value; + } + } + 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; + + if (!fixed_underlying_type_p) + { + /* Compute the number of bits require to represent all values of the + enumeration. We must do this before the type of MINNODE and + MAXNODE are transformed, since tree_int_cst_min_precision relies + on the TREE_TYPE of the value it is passed. */ + bool unsignedp = tree_int_cst_sgn (minnode) >= 0; + int lowprec = tree_int_cst_min_precision (minnode, unsignedp); + int highprec = tree_int_cst_min_precision (maxnode, unsignedp); + int precision = MAX (lowprec, highprec); + unsigned int itk; + bool use_short_enum; + + /* 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. The + user can request that for all enumerations with a command line + flag, or for just one enumeration with an attribute. */ + + use_short_enum = flag_short_enums + || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype)); + + for (itk = (use_short_enum ? itk_char : itk_int); + itk != itk_none; + itk++) + { + underlying_type = integer_types[itk]; + if (underlying_type != NULL_TREE + && TYPE_PRECISION (underlying_type) >= precision + && TYPE_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 %qT", enumtype); + precision = TYPE_PRECISION (long_long_integer_type_node); + underlying_type = integer_types[itk_unsigned_long_long]; + } + + /* [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. */ + copy_type_enum (enumtype, underlying_type); + + /* Compute the minimum 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. */ + + /* The middle-end currently assumes that types with TYPE_PRECISION + narrower than their underlying type are suitably zero or sign + extended to fill their mode. Similarly, it assumes that the front + end assures that a value of a particular type must be within + TYPE_MIN_VALUE and TYPE_MAX_VALUE. + + We used to set these fields based on bmin and bmax, but that led + to invalid assumptions like optimizing away bounds checking. So + now we just set the TYPE_PRECISION, TYPE_MIN_VALUE, and + TYPE_MAX_VALUE to the values for the mode above and only restrict + the ENUM_UNDERLYING_TYPE for the benefit of diagnostics. */ + ENUM_UNDERLYING_TYPE (enumtype) + = build_distinct_type_copy (underlying_type); + TYPE_PRECISION (ENUM_UNDERLYING_TYPE (enumtype)) = precision; + set_min_and_max_values_for_integral_type + (ENUM_UNDERLYING_TYPE (enumtype), precision, unsignedp); + + /* If -fstrict-enums, still constrain TYPE_MIN/MAX_VALUE. */ + if (flag_strict_enums) + set_min_and_max_values_for_integral_type (enumtype, precision, + unsignedp); + } + else + underlying_type = ENUM_UNDERLYING_TYPE (enumtype); + + /* 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)) + { + location_t saved_location; + + decl = TREE_VALUE (values); + saved_location = input_location; + input_location = DECL_SOURCE_LOCATION (decl); + if (fixed_underlying_type_p) + /* If the enumeration type has a fixed underlying type, we + already checked all of the enumerator values. */ + value = DECL_INITIAL (decl); + else + value = perform_implicit_conversion (underlying_type, + DECL_INITIAL (decl), + tf_warning_or_error); + input_location = saved_location; + + /* Do not clobber shared ints. */ + value = copy_node (value); + + TREE_TYPE (value) = enumtype; + DECL_INITIAL (decl) = value; + } + + /* Fix up all variant types of this enum type. */ + for (t = TYPE_MAIN_VARIANT (enumtype); t; t = TYPE_NEXT_VARIANT (t)) + TYPE_VALUES (t) = TYPE_VALUES (enumtype); + + /* Finish debugging output for this type. */ + rest_of_type_compilation (enumtype, namespace_bindings_p ()); +} + +/* Finishes the enum type. This is called only the first time an + enumeration is seen, be it opaque or odinary. + ENUMTYPE is the type object. */ + +void +finish_enum (tree enumtype) +{ + if (processing_template_decl) + { + if (at_function_scope_p ()) + add_stmt (build_min (TAG_DEFN, enumtype)); + return; + } + + /* If this is a forward declaration, there should not be any variants, + though we can get a variant in the middle of an enum-specifier with + wacky code like 'enum E { e = sizeof(const E*) };' */ + gcc_assert (enumtype == TYPE_MAIN_VARIANT (enumtype) + && (TYPE_VALUES (enumtype) + || !TYPE_NEXT_VARIANT (enumtype))); +} + +/* Build and install a CONST_DECL for an enumeration constant of the + enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. + LOC is the location of NAME. + Assignment of sequential values by default is handled here. */ + +void +build_enumerator (tree name, tree value, tree enumtype, location_t loc) +{ + tree decl; + tree context; + tree type; + + /* If the VALUE was erroneous, pretend it wasn't there; that will + result in the enum being assigned the next value in sequence. */ + if (value == error_mark_node) + value = NULL_TREE; + + /* Remove no-op casts from the value. */ + if (value) + STRIP_TYPE_NOPS (value); + + if (! processing_template_decl) + { + /* Validate and default VALUE. */ + if (value != NULL_TREE) + { + value = cxx_constant_value (value); + + if (TREE_CODE (value) == INTEGER_CST + && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (value))) + { + value = perform_integral_promotions (value); + } + else + { + error ("enumerator value for %qD is not an integer constant", name); + value = NULL_TREE; + } + } + + /* Default based on previous value. */ + if (value == NULL_TREE) + { + if (TYPE_VALUES (enumtype)) + { + HOST_WIDE_INT hi; + unsigned HOST_WIDE_INT lo; + tree prev_value; + bool overflowed; + + /* The next value is the previous value plus one. + add_double doesn't know the type of the target expression, + so we must check with int_fits_type_p as well. */ + prev_value = DECL_INITIAL (TREE_VALUE (TYPE_VALUES (enumtype))); + if (error_operand_p (prev_value)) + value = error_mark_node; + else + { + overflowed = add_double (TREE_INT_CST_LOW (prev_value), + TREE_INT_CST_HIGH (prev_value), + 1, 0, &lo, &hi); + value = build_int_cst_wide (TREE_TYPE (prev_value), lo, hi); + overflowed + |= !int_fits_type_p (value, TREE_TYPE (prev_value)); + + if (overflowed) + { + error ("overflow in enumeration values at %qD", name); + value = error_mark_node; + } + } + } + else + value = integer_zero_node; + } + + /* Remove no-op casts from the value. */ + STRIP_TYPE_NOPS (value); + + /* If the underlying type of the enum is fixed, check whether + the enumerator values fits in the underlying type. If it + does not fit, the program is ill-formed [C++0x dcl.enum]. */ + if (ENUM_UNDERLYING_TYPE (enumtype) + && value + && TREE_CODE (value) == INTEGER_CST + && !int_fits_type_p (value, ENUM_UNDERLYING_TYPE (enumtype))) + { + error ("enumerator value %E is too large for underlying type %<%T%>", + value, ENUM_UNDERLYING_TYPE (enumtype)); + + /* Silently convert the value so that we can continue. */ + value = perform_implicit_conversion (ENUM_UNDERLYING_TYPE (enumtype), + value, tf_none); + } + } + + /* C++ associates enums with global, function, or class declarations. */ + context = current_scope (); + + /* Build the actual enumeration constant. Note that the enumeration + constants have the underlying type of the enum (if it is fixed) + or the type of their initializer (if the underlying type of the + enum is not fixed): + + [ C++0x dcl.enum ] + + If the underlying type is fixed, the type of each enumerator + prior to the closing brace is the underlying type; if the + initializing value of an enumerator cannot be represented by + the underlying type, the program is ill-formed. If the + underlying type is not fixed, the type of each enumerator is + the type of its initializing value. + + If the underlying type is not fixed, it will be computed by + finish_enum and we will reset the type of this enumerator. Of + course, if we're processing a template, there may be no value. */ + type = value ? TREE_TYPE (value) : NULL_TREE; + + if (context && context == current_class_type) + /* This enum declaration is local to the class. We need the full + lang_decl so that we can record DECL_CLASS_CONTEXT, for example. */ + decl = build_lang_decl_loc (loc, CONST_DECL, name, type); + else + /* It's a global enum, or it's local to a function. (Note local to + a function could mean local to a class method. */ + decl = build_decl (loc, CONST_DECL, name, type); + + DECL_CONTEXT (decl) = FROB_CONTEXT (context); + TREE_CONSTANT (decl) = 1; + TREE_READONLY (decl) = 1; + DECL_INITIAL (decl) = value; + + if (context && context == current_class_type && !SCOPED_ENUM_P (enumtype)) + /* 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)); +} + +/* Look for an enumerator with the given NAME within the enumeration + type ENUMTYPE. This routine is used primarily for qualified name + lookup into an enumerator in C++0x, e.g., + + enum class Color { Red, Green, Blue }; + + Color color = Color::Red; + + Returns the value corresponding to the enumerator, or + NULL_TREE if no such enumerator was found. */ +tree +lookup_enumerator (tree enumtype, tree name) +{ + tree e; + gcc_assert (enumtype && TREE_CODE (enumtype) == ENUMERAL_TYPE); + + e = purpose_member (name, TYPE_VALUES (enumtype)); + return e? TREE_VALUE (e) : NULL_TREE; +} + + +/* We're defining DECL. Make sure that its 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)); + + /* In a function definition, arg types must be complete. */ + require_complete_types_for_parms (current_function_parms); + + if (dependent_type_p (return_type)) + return; + if (!COMPLETE_OR_VOID_TYPE_P (return_type) + || (TYPE_FOR_JAVA (return_type) && MAYBE_CLASS_TYPE_P (return_type))) + { + tree args = TYPE_ARG_TYPES (fntype); + + if (!COMPLETE_OR_VOID_TYPE_P (return_type)) + error ("return type %q#T is incomplete", return_type); + else + error ("return type has Java class type %q#T", return_type); + + /* Make it return void instead. */ + if (TREE_CODE (fntype) == METHOD_TYPE) + fntype = build_method_type_directly (TREE_TYPE (TREE_VALUE (args)), + void_type_node, + TREE_CHAIN (args)); + else + fntype = build_function_type (void_type_node, args); + fntype + = build_exception_variant (fntype, + TYPE_RAISES_EXCEPTIONS (TREE_TYPE (decl))); + fntype = (cp_build_type_attribute_variant + (fntype, TYPE_ATTRIBUTES (TREE_TYPE (decl)))); + TREE_TYPE (decl) = fntype; + } + else + abstract_virtuals_error (decl, TREE_TYPE (fntype)); +} + +/* Create the FUNCTION_DECL for a function definition. + DECLSPECS and DECLARATOR are the parts of the declaration; + they describe the function's name and the type it returns, + but twisted together in a fashion that parallels the syntax of C. + + FLAGS is a bitwise or of SF_PRE_PARSED (indicating that the + DECLARATOR is really the DECL for the function we are about to + process and that DECLSPECS should be ignored), SF_INCLASS_INLINE + indicating that the function is an inline defined in-class. + + This function creates a binding context for the function body + as well as setting up the FUNCTION_DECL in current_function_decl. + + For C++, we must first check whether that datum makes any sense. + For example, "class A local_a(1,2);" means that variable local_a + is an aggregate of type A, which should have a constructor + applied to it with the argument list [1, 2]. + + On entry, DECL_INITIAL (decl1) should be NULL_TREE or error_mark_node, + or may be a BLOCK if the function has been defined previously + in this translation unit. On exit, DECL_INITIAL (decl1) will be + error_mark_node if the function has never been defined, or + a BLOCK if the function has been defined somewhere. */ + +void +start_preparsed_function (tree decl1, tree attrs, int flags) +{ + tree ctype = NULL_TREE; + tree fntype; + tree restype; + int doing_friend = 0; + struct cp_binding_level *bl; + tree current_function_parms; + struct c_fileinfo *finfo + = get_fileinfo (LOCATION_FILE (DECL_SOURCE_LOCATION (decl1))); + bool honor_interface; + + /* Sanity check. */ + gcc_assert (TREE_CODE (TREE_VALUE (void_list_node)) == VOID_TYPE); + gcc_assert (TREE_CHAIN (void_list_node) == NULL_TREE); + + fntype = TREE_TYPE (decl1); + if (TREE_CODE (fntype) == METHOD_TYPE) + ctype = TYPE_METHOD_BASETYPE (fntype); + + /* ISO C++ 11.4/5. A friend function defined in a class is in + the (lexical) scope of the class in which it is defined. */ + if (!ctype && DECL_FRIEND_P (decl1)) + { + ctype = DECL_FRIEND_CONTEXT (decl1); + + /* CTYPE could be null here if we're dealing with a template; + for example, `inline friend float foo()' inside a template + will have no CTYPE set. */ + if (ctype && TREE_CODE (ctype) != RECORD_TYPE) + ctype = NULL_TREE; + else + doing_friend = 1; + } + + if (DECL_DECLARED_INLINE_P (decl1) + && lookup_attribute ("noinline", attrs)) + warning (0, "inline function %q+D given attribute noinline", decl1); + + /* Handle gnu_inline attribute. */ + if (GNU_INLINE_P (decl1)) + { + DECL_EXTERNAL (decl1) = 1; + DECL_NOT_REALLY_EXTERN (decl1) = 0; + DECL_INTERFACE_KNOWN (decl1) = 1; + DECL_DISREGARD_INLINE_LIMITS (decl1) = 1; + } + + if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl1)) + /* This is a constructor, we must ensure that any default args + introduced by this definition are propagated to the clones + now. The clones are used directly in overload resolution. */ + adjust_clone_args (decl1); + + /* Sometimes we don't notice that a function is a static member, and + build a METHOD_TYPE for it. Fix that up now. */ + if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1) + && TREE_CODE (TREE_TYPE (decl1)) == METHOD_TYPE) + { + revert_static_member_fn (decl1); + ctype = NULL_TREE; + } + + /* 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 + is an inline member template. (Order is important; consider the + case where a template parameter has the same name as a field of + the class.) It is not until after this point that + PROCESSING_TEMPLATE_DECL is guaranteed to be set up correctly. */ + if (flags & SF_INCLASS_INLINE) + maybe_begin_member_template_processing (decl1); + + /* Effective C++ rule 15. */ + if (warn_ecpp + && DECL_OVERLOADED_OPERATOR_P (decl1) == NOP_EXPR + && TREE_CODE (TREE_TYPE (fntype)) == VOID_TYPE) + warning (OPT_Weffc__, "% should return a reference to %<*this%>"); + + /* Make the init_value nonzero so pushdecl knows this is not tentative. + error_mark_node is replaced below (in poplevel) with the BLOCK. */ + if (!DECL_INITIAL (decl1)) + DECL_INITIAL (decl1) = error_mark_node; + + /* This function exists in static storage. + (This does not mean `static' in the C sense!) */ + TREE_STATIC (decl1) = 1; + + /* We must call push_template_decl after current_class_type is set + up. (If we are processing inline definitions after exiting a + class scope, current_class_type will be NULL_TREE until set above + by push_nested_class.) */ + if (processing_template_decl) + { + /* FIXME: Handle error_mark_node more gracefully. */ + tree newdecl1 = push_template_decl (decl1); + if (newdecl1 != error_mark_node) + decl1 = newdecl1; + } + + /* We are now in the scope of the function being defined. */ + current_function_decl = decl1; + + /* 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 + must be complete when you define the function. */ + check_function_type (decl1, current_function_parms); + + /* Build the return declaration for the function. */ + restype = TREE_TYPE (fntype); + if (DECL_RESULT (decl1) == NULL_TREE) + { + tree resdecl; + + resdecl = build_decl (input_location, RESULT_DECL, 0, restype); + DECL_ARTIFICIAL (resdecl) = 1; + DECL_IGNORED_P (resdecl) = 1; + DECL_RESULT (decl1) = resdecl; + + cp_apply_type_quals_to_decl (cp_type_quals (restype), resdecl); + } + + /* Let the user know we're compiling this function. */ + announce_function (decl1); + + /* Record the decl so that the function name is defined. + If we already have a decl for this name, and it is a FUNCTION_DECL, + use the old decl. */ + 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. */ + + if (warn_missing_declarations + && olddecl == decl1 + && !DECL_MAIN_P (decl1) + && TREE_PUBLIC (decl1) + && !DECL_DECLARED_INLINE_P (decl1)) + { + tree context; + + /* Check whether DECL1 is in an anonymous + namespace. */ + for (context = DECL_CONTEXT (decl1); + context; + context = DECL_CONTEXT (context)) + { + if (TREE_CODE (context) == NAMESPACE_DECL + && DECL_NAME (context) == NULL_TREE) + break; + } + + if (context == NULL) + warning (OPT_Wmissing_declarations, + "no previous declaration for %q+D", decl1); + } + + decl1 = olddecl; + } + } + else + { + /* We need to set the DECL_CONTEXT. */ + if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1)) + DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1)); + } + fntype = TREE_TYPE (decl1); + + /* If #pragma weak applies, mark the decl appropriately now. + The pragma only applies to global functions. Because + determining whether or not the #pragma applies involves + computing the mangled name for the declaration, we cannot + apply the pragma until after we have merged this declaration + with any previous declarations; if the original declaration + has a linkage specification, that specification applies to + the definition as well, and may affect the mangled name. */ + if (DECL_FILE_SCOPE_P (decl1)) + maybe_apply_pragma_weak (decl1); + } + + /* constexpr functions must have literal argument types and + literal return type. */ + validate_constexpr_fundecl (decl1); + + /* Reset this in case the call to pushdecl changed it. */ + current_function_decl = decl1; + + gcc_assert (DECL_INITIAL (decl1)); + + /* This function may already have been parsed, in which case just + return; our caller will skip over the body without parsing. */ + if (DECL_INITIAL (decl1) != error_mark_node) + return; + + /* Initialize RTL machinery. We cannot do this until + CURRENT_FUNCTION_DECL and DECL_RESULT are set up. We do this + even when processing a template; this is how we get + CFUN set up, and our per-function variables initialized. + FIXME factor out the non-RTL stuff. */ + bl = current_binding_level; + allocate_struct_function (decl1, processing_template_decl); + + /* Initialize the language data structures. Whenever we start + a new function, we destroy temporaries in the usual way. */ + cfun->language = ggc_alloc_cleared_language_function (); + current_stmt_tree ()->stmts_are_full_exprs_p = 1; + current_binding_level = bl; + + /* Even though we're inside a function body, we still don't want to + call expand_expr to calculate the size of a variable-sized array. + We haven't necessarily assigned RTL to all variables yet, so it's + not safe to try to expand expressions involving them. */ + cfun->dont_save_pending_sizes_p = 1; + + /* Start the statement-tree, start the tree now. */ + DECL_SAVED_TREE (decl1) = push_stmt_list (); + + /* If we are (erroneously) defining a function that we have already + defined before, wipe out what we knew before. */ + if (!DECL_PENDING_INLINE_P (decl1)) + DECL_SAVED_FUNCTION_DATA (decl1) = NULL; + + if (ctype && !doing_friend && !DECL_STATIC_FUNCTION_P (decl1)) + { + /* We know that this was set up by `grokclassfn'. We do not + wait until `store_parm_decls', since evil parse errors may + never get us to that point. Here we keep the consistency + between `current_class_type' and `current_class_ptr'. */ + tree t = DECL_ARGUMENTS (decl1); + + gcc_assert (t != NULL_TREE && TREE_CODE (t) == PARM_DECL); + gcc_assert (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE); + + cp_function_chain->x_current_class_ref + = cp_build_indirect_ref (t, RO_NULL, tf_warning_or_error); + cp_function_chain->x_current_class_ptr = t; + + /* Constructors and destructors need to know whether they're "in + charge" of initializing virtual base classes. */ + t = DECL_CHAIN (t); + if (DECL_HAS_IN_CHARGE_PARM_P (decl1)) + { + current_in_charge_parm = t; + t = DECL_CHAIN (t); + } + if (DECL_HAS_VTT_PARM_P (decl1)) + { + gcc_assert (DECL_NAME (t) == vtt_parm_identifier); + current_vtt_parm = t; + } + } + + honor_interface = (!DECL_TEMPLATE_INSTANTIATION (decl1) + /* Implicitly-defined methods (like the + destructor for a class in which no destructor + is explicitly declared) must not be defined + until their definition is needed. So, we + ignore interface specifications for + compiler-generated functions. */ + && !DECL_ARTIFICIAL (decl1)); + + if (DECL_INTERFACE_KNOWN (decl1)) + { + tree ctx = decl_function_context (decl1); + + if (DECL_NOT_REALLY_EXTERN (decl1)) + DECL_EXTERNAL (decl1) = 0; + + if (ctx != NULL_TREE && DECL_DECLARED_INLINE_P (ctx) + && !processing_template_decl + && TREE_PUBLIC (ctx)) + /* This is a function in a local class in an extern inline + function. */ + comdat_linkage (decl1); + } + /* If this function belongs to an interface, it is public. + If it belongs to someone else's interface, it is also external. + This only affects inlines and template instantiations. */ + else if (!finfo->interface_unknown && honor_interface) + { + if (DECL_DECLARED_INLINE_P (decl1) + || DECL_TEMPLATE_INSTANTIATION (decl1) + || processing_template_decl) + { + DECL_EXTERNAL (decl1) + = (finfo->interface_only + || (DECL_DECLARED_INLINE_P (decl1) + && ! flag_implement_inlines + && !DECL_VINDEX (decl1))); + + /* For WIN32 we also want to put these in linkonce sections. */ + maybe_make_one_only (decl1); + } + else + DECL_EXTERNAL (decl1) = 0; + DECL_INTERFACE_KNOWN (decl1) = 1; + /* If this function is in an interface implemented in this file, + make sure that the back end knows to emit this function + here. */ + if (!DECL_EXTERNAL (decl1)) + mark_needed (decl1); + } + else if (finfo->interface_unknown && finfo->interface_only + && honor_interface) + { + /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma + interface, we will have both finfo->interface_unknown and + finfo->interface_only set. In that case, we don't want to + use the normal heuristics because someone will supply a + #pragma implementation elsewhere, and deducing it here would + produce a conflict. */ + comdat_linkage (decl1); + DECL_EXTERNAL (decl1) = 0; + DECL_INTERFACE_KNOWN (decl1) = 1; + DECL_DEFER_OUTPUT (decl1) = 1; + } + else + { + /* This is a definition, not a reference. + So clear DECL_EXTERNAL, unless this is a GNU extern inline. */ + if (!GNU_INLINE_P (decl1)) + DECL_EXTERNAL (decl1) = 0; + + if ((DECL_DECLARED_INLINE_P (decl1) + || DECL_TEMPLATE_INSTANTIATION (decl1)) + && ! DECL_INTERFACE_KNOWN (decl1)) + DECL_DEFER_OUTPUT (decl1) = 1; + else + DECL_INTERFACE_KNOWN (decl1) = 1; + } + + /* Determine the ELF visibility attribute for the function. We must not + do this before calling "pushdecl", as we must allow "duplicate_decls" + to merge any attributes appropriately. We also need to wait until + linkage is set. */ + if (!DECL_CLONED_FUNCTION_P (decl1)) + determine_visibility (decl1); + + begin_scope (sk_function_parms, decl1); + + ++function_depth; + + if (DECL_DESTRUCTOR_P (decl1) + || (DECL_CONSTRUCTOR_P (decl1) + && targetm.cxx.cdtor_returns_this ())) + { + cdtor_label = build_decl (input_location, + LABEL_DECL, NULL_TREE, NULL_TREE); + DECL_CONTEXT (cdtor_label) = current_function_decl; + } + + start_fname_decls (); + + store_parm_decls (current_function_parms); +} + + +/* Like start_preparsed_function, except that instead of a + FUNCTION_DECL, this function takes DECLSPECS and DECLARATOR. + + Returns 1 on success. If the DECLARATOR is not suitable for a function + (it defines a datum instead), we return 0, which tells + yyparse to report a parse error. */ + +int +start_function (cp_decl_specifier_seq *declspecs, + const cp_declarator *declarator, + tree attrs) +{ + tree decl1; + + decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, &attrs); + if (decl1 == error_mark_node) + return 0; + /* If the declarator is not suitable for a function definition, + cause a syntax error. */ + if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) + { + error ("invalid function declaration"); + return 0; + } + + if (DECL_MAIN_P (decl1)) + /* main must return int. grokfndecl should have corrected it + (and issued a diagnostic) if the user got it wrong. */ + gcc_assert (same_type_p (TREE_TYPE (TREE_TYPE (decl1)), + integer_type_node)); + + start_preparsed_function (decl1, attrs, /*flags=*/SF_DEFAULT); + + return 1; +} + +/* Returns true iff an EH_SPEC_BLOCK should be created in the body of + FN. */ + +static bool +use_eh_spec_block (tree fn) +{ + return (flag_exceptions && flag_enforce_eh_specs + && !processing_template_decl + && !type_throw_all_p (TREE_TYPE (fn)) + /* We insert the EH_SPEC_BLOCK only in the original + function; then, it is copied automatically to the + clones. */ + && !DECL_CLONED_FUNCTION_P (fn) + /* Implicitly-generated constructors and destructors have + exception specifications. However, those specifications + are the union of the possible exceptions specified by the + constructors/destructors for bases and members, so no + unallowed exception will ever reach this function. By + not creating the EH_SPEC_BLOCK we save a little memory, + and we avoid spurious warnings about unreachable + code. */ + && !DECL_DEFAULTED_FN (fn)); +} + +/* Store the parameter declarations into the current function declaration. + This is called after parsing the parameter declarations, before + digesting the body of the function. + + 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; + then CONST_DECLs for foo and bar are put here. */ + tree nonparms = NULL_TREE; + + if (current_function_parms) + { + /* This case is when the function was defined with an ANSI prototype. + The parms already have decls, so we need not do anything here + except record them as in effect + and complain if any redundant old-style parm decls were written. */ + + tree specparms = current_function_parms; + tree next; + + /* 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 + they end in the correct forward order. */ + specparms = nreverse (specparms); + + for (parm = specparms; parm; parm = next) + { + next = DECL_CHAIN (parm); + if (TREE_CODE (parm) == PARM_DECL) + { + if (DECL_NAME (parm) == NULL_TREE + || TREE_CODE (parm) != VOID_TYPE) + pushdecl (parm); + else + error ("parameter %qD declared void", parm); + } + else + { + /* If we find an enum constant or a type tag, + put it aside for the moment. */ + TREE_CHAIN (parm) = NULL_TREE; + nonparms = chainon (nonparms, parm); + } + } + + /* Get the decls in their original chain order and record in the + function. This is all and only the PARM_DECLs that were + pushed into scope by the loop above. */ + DECL_ARGUMENTS (fndecl) = getdecls (); + } + else + DECL_ARGUMENTS (fndecl) = NULL_TREE; + + /* Now store the final chain of decls for the arguments + 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)); + + if (use_eh_spec_block (current_function_decl)) + current_eh_spec_block = begin_eh_spec_block (); +} + + +/* We have finished doing semantic analysis on DECL, but have not yet + generated RTL for its body. Save away our current state, so that + when we want to generate RTL later we know what to do. */ + +static void +save_function_data (tree decl) +{ + struct language_function *f; + + /* Save the language-specific per-function data so that we can + get it back when we really expand this function. */ + gcc_assert (!DECL_PENDING_INLINE_P (decl)); + + /* Make a copy. */ + f = ggc_alloc_language_function (); + memcpy (f, cp_function_chain, sizeof (struct language_function)); + DECL_SAVED_FUNCTION_DATA (decl) = f; + + /* Clear out the bits we don't need. */ + f->base.x_stmt_tree.x_cur_stmt_list = NULL_TREE; + f->bindings = NULL; + f->x_local_names = NULL; +} + + +/* Set the return value of the constructor (if present). */ + +static void +finish_constructor_body (void) +{ + tree val; + tree exprstmt; + + if (targetm.cxx.cdtor_returns_this () + && (! TYPE_FOR_JAVA (current_class_type))) + { + /* Any return from a constructor will end up here. */ + add_stmt (build_stmt (input_location, LABEL_EXPR, cdtor_label)); + + val = DECL_ARGUMENTS (current_function_decl); + val = build2 (MODIFY_EXPR, TREE_TYPE (val), + DECL_RESULT (current_function_decl), val); + /* Return the address of the object. */ + exprstmt = build_stmt (input_location, RETURN_EXPR, val); + add_stmt (exprstmt); + } +} + +/* Do all the processing for the beginning of a destructor; set up the + vtable pointers and cleanups for bases and members. */ + +static void +begin_destructor_body (void) +{ + tree compound_stmt; + + /* If the CURRENT_CLASS_TYPE is incomplete, we will have already + issued an error message. We still want to try to process the + body of the function, but initialize_vtbl_ptrs will crash if + TYPE_BINFO is NULL. */ + if (COMPLETE_TYPE_P (current_class_type)) + { + compound_stmt = begin_compound_stmt (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 (compound_stmt); + + /* And insert cleanups for our bases and members so that they + will be properly destroyed if we throw. */ + push_base_cleanups (); + } +} + +/* At the end of every destructor we generate code to delete the object if + necessary. Do that now. */ + +static void +finish_destructor_body (void) +{ + tree exprstmt; + + /* Any return from a destructor will end up here; that way all base + and member cleanups will be run when the function returns. */ + add_stmt (build_stmt (input_location, LABEL_EXPR, cdtor_label)); + + /* In a virtual destructor, we must call delete. */ + if (DECL_VIRTUAL_P (current_function_decl)) + { + tree if_stmt; + tree virtual_size = cxx_sizeof (current_class_type); + + /* [class.dtor] + + At the point of definition of a virtual destructor (including + an implicit definition), non-placement operator delete shall + be looked up in the scope of the destructor's class and if + found shall be accessible and unambiguous. */ + exprstmt = build_op_delete_call(DELETE_EXPR, current_class_ptr, + virtual_size, + /*global_p=*/false, + /*placement=*/NULL_TREE, + /*alloc_fn=*/NULL_TREE); + + if_stmt = begin_if_stmt (); + finish_if_stmt_cond (build2 (BIT_AND_EXPR, integer_type_node, + current_in_charge_parm, + integer_one_node), + if_stmt); + finish_expr_stmt (exprstmt); + finish_then_clause (if_stmt); + finish_if_stmt (if_stmt); + } + + if (targetm.cxx.cdtor_returns_this ()) + { + tree val; + + val = DECL_ARGUMENTS (current_function_decl); + val = build2 (MODIFY_EXPR, TREE_TYPE (val), + DECL_RESULT (current_function_decl), val); + /* Return the address of the object. */ + exprstmt = build_stmt (input_location, RETURN_EXPR, val); + add_stmt (exprstmt); + } +} + +/* Do the necessary processing for the beginning of a function body, which + in this case includes member-initializers, but not the catch clauses of + a function-try-block. Currently, this means opening a binding level + for the member-initializers (in a ctor) and member cleanups (in a dtor). */ + +tree +begin_function_body (void) +{ + tree stmt; + + if (! FUNCTION_NEEDS_BODY_BLOCK (current_function_decl)) + return NULL_TREE; + + if (processing_template_decl) + /* Do nothing now. */; + else + /* 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 (BCS_FN_BODY); + + if (processing_template_decl) + /* Do nothing now. */; + else if (DECL_DESTRUCTOR_P (current_function_decl)) + begin_destructor_body (); + + return stmt; +} + +/* Do the processing for the end of a function body. Currently, this means + closing out the cleanups for fully-constructed bases and members, and in + the case of the destructor, deleting the object if desired. Again, this + is only meaningful for [cd]tors, since they are the only functions where + there is a significant distinction between the main body and any + function catch clauses. Handling, say, main() return semantics here + would be wrong, as flowing off the end of a function catch clause for + main() would also need to return 0. */ + +void +finish_function_body (tree compstmt) +{ + if (compstmt == NULL_TREE) + return; + + /* Close the block. */ + finish_compound_stmt (compstmt); + + if (processing_template_decl) + /* Do nothing now. */; + else if (DECL_CONSTRUCTOR_P (current_function_decl)) + finish_constructor_body (); + else if (DECL_DESTRUCTOR_P (current_function_decl)) + finish_destructor_body (); +} + +/* Given a function, returns the BLOCK corresponding to the outermost level + of curly braces, skipping the artificial block created for constructor + initializers. */ + +tree +outer_curly_brace_block (tree fndecl) +{ + tree block = BLOCK_SUBBLOCKS (DECL_INITIAL (fndecl)); + if (FUNCTION_NEEDS_BODY_BLOCK (current_function_decl)) + /* Skip the artificial function body block. */ + block = BLOCK_SUBBLOCKS (block); + return block; +} + +/* If FNDECL is a class's key method, add the class to the list of + keyed classes that should be emitted. */ + +static void +record_key_method_defined (tree fndecl) +{ + if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl) + && DECL_VIRTUAL_P (fndecl) + && !processing_template_decl) + { + tree fnclass = DECL_CONTEXT (fndecl); + if (fndecl == CLASSTYPE_KEY_METHOD (fnclass)) + keyed_classes = tree_cons (NULL_TREE, fnclass, keyed_classes); + } +} + +/* Subroutine of finish_function. + Save the body of constexpr functions for possible + future compile time evaluation. */ + +static void +maybe_save_function_definition (tree fun) +{ + if (!processing_template_decl + && DECL_DECLARED_CONSTEXPR_P (fun) + && !DECL_CLONED_FUNCTION_P (fun)) + register_constexpr_fundef (fun, DECL_SAVED_TREE (fun)); +} + +/* Finish up a function declaration and compile that function + all the way to assembler language output. The free the storage + for the function definition. + + FLAGS is a bitwise or of the following values: + 2 - INCLASS_INLINE + We just finished processing the body of an in-class inline + function definition. (This processing will have taken place + 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; + + /* When we get some parse errors, we can end up without a + current_function_decl, so cope. */ + if (fndecl == NULL_TREE) + return error_mark_node; + + if (c_dialect_objc ()) + objc_finish_function (); + + gcc_assert (!defer_mark_used_calls); + defer_mark_used_calls = true; + + record_key_method_defined (fndecl); + + fntype = TREE_TYPE (fndecl); + + /* TREE_READONLY (fndecl) = 1; + This caused &foo to be of type ptr-to-const-function + which then got a warning when stored in a ptr-to-function variable. */ + + gcc_assert (building_stmt_tree ()); + /* The current function is being defined, so its DECL_INITIAL should + be set, and unless there's a multiple definition, it should be + error_mark_node. */ + gcc_assert (DECL_INITIAL (fndecl) == error_mark_node); + + /* For a cloned function, we've already got all the code we need; + there's no need to add any extra bits. */ + if (!DECL_CLONED_FUNCTION_P (fndecl)) + { + if (DECL_MAIN_P (current_function_decl)) + { + tree stmt; + + /* Make it so that `main' always returns 0 by default (or + 1 for VMS). */ +#if VMS_TARGET + stmt = finish_return_stmt (integer_one_node); +#else + stmt = finish_return_stmt (integer_zero_node); +#endif + /* Hack. We don't want the middle-end to warn that this + return is unreachable, so put the statement on the + special line 0. */ + { + location_t linezero = linemap_line_start (line_table, 0, 1); + SET_EXPR_LOCATION (stmt, linezero); + } + } + + if (use_eh_spec_block (current_function_decl)) + finish_eh_spec_block (TYPE_RAISES_EXCEPTIONS + (TREE_TYPE (current_function_decl)), + current_eh_spec_block); + } + + /* If we're saving up tree structure, tie off the function now. */ + DECL_SAVED_TREE (fndecl) = pop_stmt_list (DECL_SAVED_TREE (fndecl)); + + finish_fname_decls (); + + /* If this function can't throw any exceptions, remember that. */ + if (!processing_template_decl + && !cp_function_chain->can_throw + && !flag_non_call_exceptions + && !decl_replaceable_p (fndecl)) + TREE_NOTHROW (fndecl) = 1; + + /* This must come after expand_function_end because cleanups might + have declarations (from inline functions) that need to go into + this function's blocks. */ + + /* 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. */ + gcc_assert (errorcount); + + /* Throw away the broken statement tree and extra binding + levels. */ + DECL_SAVED_TREE (fndecl) = alloc_stmt_list (); + + while (current_binding_level->kind != sk_function_parms) + { + if (current_binding_level->kind == sk_class) + pop_nested_class (); + else + poplevel (0, 0, 0); + } + } + poplevel (1, 0, 1); + + /* Statements should always be full-expressions at the outermost set + of curly braces for a function. */ + gcc_assert (stmts_are_full_exprs_p ()); + + /* Save constexpr function body before it gets munged by + the NRV transformation. */ + maybe_save_function_definition (fndecl); + + /* Set up the named return value optimization, if we can. Candidate + variables are selected in check_return_expr. */ + if (current_function_return_value) + { + tree r = current_function_return_value; + tree outer; + + 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. */ + && (outer = outer_curly_brace_block (fndecl)) + && chain_member (r, BLOCK_VARS (outer))) + finalize_nrv (&DECL_SAVED_TREE (fndecl), r, DECL_RESULT (fndecl)); + + current_function_return_value = NULL_TREE; + } + + /* Remember that we were in class scope. */ + if (current_class_name) + ctype = current_class_type; + + /* Must mark the RESULT_DECL as being in this function. */ + DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl; + + /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point + to the FUNCTION_DECL node itself. */ + BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; + + /* Save away current state, if appropriate. */ + if (!processing_template_decl) + save_function_data (fndecl); + + /* 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 + /* Don't complain if we are declared noreturn. */ + && !TREE_THIS_VOLATILE (fndecl) + && !DECL_NAME (DECL_RESULT (fndecl)) + && !TREE_NO_WARNING (fndecl) + /* Structor return values (if any) are set by the compiler. */ + && !DECL_CONSTRUCTOR_P (fndecl) + && !DECL_DESTRUCTOR_P (fndecl)) + { + warning (OPT_Wreturn_type, + "no return statement in function returning non-void"); + TREE_NO_WARNING (fndecl) = 1; + } + + /* Store the end of the function, so that we get good line number + info for the epilogue. */ + cfun->function_end_locus = input_location; + + /* Complain about parameters that are only set, but never otherwise used. */ + if (warn_unused_but_set_parameter + && !processing_template_decl + && errorcount == unused_but_set_errorcount + && !DECL_CLONED_FUNCTION_P (fndecl)) + { + tree decl; + + for (decl = DECL_ARGUMENTS (fndecl); + decl; + decl = DECL_CHAIN (decl)) + if (TREE_USED (decl) + && TREE_CODE (decl) == PARM_DECL + && !DECL_READ_P (decl) + && DECL_NAME (decl) + && !DECL_ARTIFICIAL (decl) + && !TREE_NO_WARNING (decl) + && !DECL_IN_SYSTEM_HEADER (decl) + && TREE_TYPE (decl) != error_mark_node + && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE + && (!CLASS_TYPE_P (TREE_TYPE (decl)) + || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) + warning (OPT_Wunused_but_set_parameter, + "parameter %q+D set but not used", decl); + unused_but_set_errorcount = errorcount; + } + + /* Genericize before inlining. */ + if (!processing_template_decl) + { + struct language_function *f = DECL_SAVED_FUNCTION_DATA (fndecl); + invoke_plugin_callbacks (PLUGIN_PRE_GENERICIZE, fndecl); + cp_genericize (fndecl); + /* Clear out the bits we don't need. */ + f->x_current_class_ptr = NULL; + f->x_current_class_ref = NULL; + f->x_eh_spec_block = NULL; + f->x_in_charge_parm = NULL; + f->x_vtt_parm = NULL; + f->x_return_value = NULL; + f->bindings = NULL; + f->extern_decl_map = NULL; + } + /* Clear out the bits we don't need. */ + local_names = NULL; + + /* We're leaving the context of this function, so zap cfun. It's still in + DECL_STRUCT_FUNCTION, and we'll restore it in tree_rest_of_compilation. */ + set_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 + maybe_begin_member_template_processing when start_function was + called. */ + if (inclass_inline) + maybe_end_member_template_processing (); + + /* Leave the scope of the class. */ + if (ctype) + pop_nested_class (); + + --function_depth; + + /* Clean up. */ + current_function_decl = NULL_TREE; + + defer_mark_used_calls = false; + if (deferred_mark_used_calls) + { + unsigned int i; + tree decl; + + FOR_EACH_VEC_ELT (tree, deferred_mark_used_calls, i, decl) + mark_used (decl); + VEC_free (tree, gc, deferred_mark_used_calls); + } + + return fndecl; +} + +/* Create the FUNCTION_DECL for a function definition. + DECLSPECS and DECLARATOR are the parts of the declaration; + they describe the return type and the name of the function, + but twisted together in a fashion that parallels the syntax of C. + + This function creates a binding context for the function body + as well as setting up the FUNCTION_DECL in current_function_decl. + + Returns a FUNCTION_DECL on success. + + If the DECLARATOR is not suitable for a function (it defines a datum + instead), we return 0, which tells yyparse to report a parse error. + + May return void_type_node indicating that this method is actually + a friend. See grokfield for more details. + + Came here with a `.pushlevel' . + + DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING + CHANGES TO CODE IN `grokfield'. */ + +tree +grokmethod (cp_decl_specifier_seq *declspecs, + const cp_declarator *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); + + /* Pass friends other than inline friend functions back. */ + if (fndecl == void_type_node) + return fndecl; + + if (DECL_IN_AGGR_P (fndecl)) + { + if (DECL_CLASS_SCOPE_P (fndecl)) + error ("%qD is already defined in class %qT", fndecl, + DECL_CONTEXT (fndecl)); + return error_mark_node; + } + + check_template_shadow (fndecl); + + DECL_DECLARED_INLINE_P (fndecl) = 1; + DECL_NO_INLINE_WARNING_P (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)) + { + if (DECL_CHAIN (fndecl)) + { + fndecl = copy_node (fndecl); + TREE_CHAIN (fndecl) = NULL_TREE; + } + } + + cp_finish_decl (fndecl, NULL_TREE, false, NULL_TREE, 0); + + DECL_IN_AGGR_P (fndecl) = 1; + return fndecl; +} + + +/* VAR is a VAR_DECL. If its type is incomplete, remember VAR so that + we can lay it out later, when and if its type becomes complete. */ + +void +maybe_register_incomplete_var (tree var) +{ + gcc_assert (TREE_CODE (var) == VAR_DECL); + + /* Keep track of variables with incomplete types. */ + if (!processing_template_decl && TREE_TYPE (var) != error_mark_node + && DECL_EXTERNAL (var)) + { + tree inner_type = TREE_TYPE (var); + + while (TREE_CODE (inner_type) == ARRAY_TYPE) + inner_type = TREE_TYPE (inner_type); + inner_type = TYPE_MAIN_VARIANT (inner_type); + + if ((!COMPLETE_TYPE_P (inner_type) && CLASS_TYPE_P (inner_type)) + /* RTTI TD entries are created while defining the type_info. */ + || (TYPE_LANG_SPECIFIC (inner_type) + && TYPE_BEING_DEFINED (inner_type))) + { + incomplete_var *iv + = VEC_safe_push (incomplete_var, gc, incomplete_vars, NULL); + iv->decl = var; + iv->incomplete_type = inner_type; + } + } +} + +/* Called when a class type (given by TYPE) is defined. If there are + any existing VAR_DECLs whose type has been completed by this + declaration, update them now. */ + +void +complete_vars (tree type) +{ + unsigned ix; + incomplete_var *iv; + + for (ix = 0; VEC_iterate (incomplete_var, incomplete_vars, ix, iv); ) + { + if (same_type_p (type, iv->incomplete_type)) + { + tree var = iv->decl; + tree type = TREE_TYPE (var); + /* Complete the type of the variable. The VAR_DECL itself + will be laid out in expand_expr. */ + complete_type (type); + cp_apply_type_quals_to_decl (cp_type_quals (type), var); + /* Remove this entry from the list. */ + VEC_unordered_remove (incomplete_var, incomplete_vars, ix); + } + else + ix++; + } + + /* Check for pending declarations which may have abstract type. */ + complete_type_check_abstract (type); +} + +/* If DECL is of a type which needs a cleanup, build and return an + expression to perform that cleanup here. Return NULL_TREE if no + cleanup need be done. */ + +tree +cxx_maybe_build_cleanup (tree decl) +{ + tree type; + tree attr; + tree cleanup; + + /* Assume no cleanup is required. */ + cleanup = NULL_TREE; + + if (error_operand_p (decl)) + return cleanup; + + /* Handle "__attribute__((cleanup))". We run the cleanup function + before the destructor since the destructor is what actually + terminates the lifetime of the object. */ + attr = lookup_attribute ("cleanup", DECL_ATTRIBUTES (decl)); + if (attr) + { + tree id; + tree fn; + tree arg; + + /* Get the name specified by the user for the cleanup function. */ + id = TREE_VALUE (TREE_VALUE (attr)); + /* Look up the name to find the cleanup function to call. It is + important to use lookup_name here because that is what is + used in c-common.c:handle_cleanup_attribute when performing + initial checks on the attribute. Note that those checks + include ensuring that the function found is not an overloaded + function, or an object with an overloaded call operator, + etc.; we can rely on the fact that the function found is an + ordinary FUNCTION_DECL. */ + fn = lookup_name (id); + arg = build_address (decl); + mark_used (decl); + cleanup = cp_build_function_call_nary (fn, tf_warning_or_error, + arg, NULL_TREE); + } + /* Handle ordinary C++ destructors. */ + type = TREE_TYPE (decl); + if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)) + { + int flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; + bool has_vbases = (TREE_CODE (type) == RECORD_TYPE + && CLASSTYPE_VBASECLASSES (type)); + tree addr; + tree call; + + if (TREE_CODE (type) == ARRAY_TYPE) + addr = decl; + else + addr = build_address (decl); + + /* Optimize for space over speed here. */ + if (!has_vbases || flag_expensive_optimizations) + flags |= LOOKUP_NONVIRTUAL; + + call = build_delete (TREE_TYPE (addr), addr, + sfk_complete_destructor, flags, 0); + if (cleanup) + cleanup = build_compound_expr (input_location, cleanup, call); + else + cleanup = call; + } + + /* build_delete sets the location of the destructor call to the + current location, even though the destructor is going to be + called later, at the end of the current scope. This can lead to + a "jumpy" behaviour for users of debuggers when they step around + the end of the block. So let's unset the location of the + destructor call instead. */ + if (cleanup != NULL && EXPR_P (cleanup)) + SET_EXPR_LOCATION (cleanup, UNKNOWN_LOCATION); + return cleanup; +} + + +/* When a stmt has been parsed, this function is called. */ + +void +finish_stmt (void) +{ +} + +/* Return the FUNCTION_TYPE that corresponds to MEMFNTYPE, which can be a + FUNCTION_DECL, METHOD_TYPE, FUNCTION_TYPE, pointer or reference to + METHOD_TYPE or FUNCTION_TYPE, or pointer to member function. */ + +tree +static_fn_type (tree memfntype) +{ + tree fntype; + tree args; + + if (TYPE_PTRMEMFUNC_P (memfntype)) + memfntype = TYPE_PTRMEMFUNC_FN_TYPE (memfntype); + if (POINTER_TYPE_P (memfntype) + || TREE_CODE (memfntype) == FUNCTION_DECL) + memfntype = TREE_TYPE (memfntype); + if (TREE_CODE (memfntype) == FUNCTION_TYPE) + return memfntype; + gcc_assert (TREE_CODE (memfntype) == METHOD_TYPE); + args = TYPE_ARG_TYPES (memfntype); + fntype = build_function_type (TREE_TYPE (memfntype), TREE_CHAIN (args)); + fntype = apply_memfn_quals (fntype, type_memfn_quals (memfntype)); + fntype = (cp_build_type_attribute_variant + (fntype, TYPE_ATTRIBUTES (memfntype))); + fntype = (build_exception_variant + (fntype, TYPE_RAISES_EXCEPTIONS (memfntype))); + return fntype; +} + +/* DECL was originally constructed as a non-static member function, + but turned out to be static. Update it accordingly. */ + +void +revert_static_member_fn (tree decl) +{ + tree stype = static_fn_type (decl); + cp_cv_quals quals = type_memfn_quals (stype); + + if (quals != TYPE_UNQUALIFIED) + { + if (quals == TYPE_QUAL_CONST && DECL_DECLARED_CONSTEXPR_P (decl)) + /* The const was implicit, don't complain. */; + else + error ("static member function %q#D declared with type qualifiers", + decl); + stype = apply_memfn_quals (stype, TYPE_UNQUALIFIED); + } + TREE_TYPE (decl) = stype; + + if (DECL_ARGUMENTS (decl)) + DECL_ARGUMENTS (decl) = DECL_CHAIN (DECL_ARGUMENTS (decl)); + DECL_STATIC_FUNCTION_P (decl) = 1; +} + +/* Return which tree structure is used by T, or TS_CP_GENERIC if T is + 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 STATIC_ASSERT: return TS_CP_STATIC_ASSERT; + case ARGUMENT_PACK_SELECT: return TS_CP_ARGUMENT_PACK_SELECT; + case TRAIT_EXPR: return TS_CP_TRAIT_EXPR; + case LAMBDA_EXPR: return TS_CP_LAMBDA_EXPR; + case TEMPLATE_INFO: return TS_CP_TEMPLATE_INFO; + 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); + return t; +} + +bool +cp_missing_noreturn_ok_p (tree decl) +{ + /* A missing noreturn is ok for the `main' function. */ + return DECL_MAIN_P (decl); +} + +/* Return the COMDAT group into which DECL should be placed. */ + +tree +cxx_comdat_group (tree decl) +{ + tree name; + + /* Virtual tables, construction virtual tables, and virtual table + tables all go in a single COMDAT group, named after the primary + virtual table. */ + if (TREE_CODE (decl) == VAR_DECL && DECL_VTABLE_OR_VTT_P (decl)) + name = DECL_ASSEMBLER_NAME (CLASSTYPE_VTABLES (DECL_CONTEXT (decl))); + /* For all other DECLs, the COMDAT group is the mangled name of the + declaration itself. */ + else + { + while (DECL_THUNK_P (decl)) + { + /* If TARGET_USE_LOCAL_THUNK_ALIAS_P, use_thunk puts the thunk + into the same section as the target function. In that case + we must return target's name. */ + tree target = THUNK_TARGET (decl); + if (TARGET_USE_LOCAL_THUNK_ALIAS_P (target) + && DECL_SECTION_NAME (target) != NULL + && DECL_ONE_ONLY (target)) + decl = target; + else + break; + } + name = DECL_ASSEMBLER_NAME (decl); + } + + return name; +} + +#include "gt-cp-decl.h" diff --git a/gcc/cp/decl.h b/gcc/cp/decl.h new file mode 100644 index 000000000..a8a2b784c --- /dev/null +++ b/gcc/cp/decl.h @@ -0,0 +1,51 @@ +/* Variables and structures for declaration processing. + Copyright (C) 1993, 2000, 2002, 2004, 2005, 2007, 2008 + 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 3, 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 COPYING3. If not see +. */ + +/* In grokdeclarator, distinguish syntactic contexts of declarators. */ +enum decl_context +{ NORMAL, /* Ordinary declaration */ + FUNCDEF, /* Function definition */ + PARM, /* Declaration of parm before function body */ + TPARM, /* Declaration of template parm */ + CATCHPARM, /* Declaration of catch parm */ + FIELD, /* Declaration inside struct or union */ + BITFIELD, /* Likewise but with specified width */ + TYPENAME, /* Typename (inside cast or sizeof) */ + TEMPLATE_TYPE_ARG, /* Almost the same as TYPENAME */ + MEMFUNCDEF /* Member function definition */ +}; + +/* We need this in here to get the decl_context definition. */ +extern tree grokdeclarator (const cp_declarator *, + const cp_decl_specifier_seq *, + enum decl_context, int, tree*); + +/* States indicating how grokdeclarator() should handle declspecs marked + with __attribute__((deprecated)). An object declared as + __attribute__((deprecated)) suppresses warnings of uses of other + deprecated items. */ + +enum deprecated_states { + DEPRECATED_NORMAL, + DEPRECATED_SUPPRESS +}; + +extern enum deprecated_states deprecated_state; + diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c new file mode 100644 index 000000000..4c55f4fc3 --- /dev/null +++ b/gcc/cp/decl2.c @@ -0,0 +1,4328 @@ +/* Process declarations and variables for C++ compiler. + Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, + 2011 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 3, 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 COPYING3. If not see +. */ + + +/* 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. */ + +/* ??? not all decl nodes are given the most useful possible + line numbers. For example, the CONST_DECLs for enum values. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "flags.h" +#include "cp-tree.h" +#include "decl.h" +#include "output.h" +#include "toplev.h" +#include "timevar.h" +#include "cpplib.h" +#include "target.h" +#include "c-family/c-common.h" +#include "c-family/c-objc.h" +#include "tree-mudflap.h" +#include "cgraph.h" +#include "tree-inline.h" +#include "c-family/c-pragma.h" +#include "tree-dump.h" +#include "intl.h" +#include "gimple.h" +#include "pointer-set.h" +#include "splay-tree.h" +#include "langhooks.h" +#include "c-family/c-ada-spec.h" + +extern cpp_reader *parse_in; + +/* This structure contains information about the initializations + and/or destructions required for a particular priority level. */ +typedef struct priority_info_s { + /* Nonzero if there have been any initializations at this priority + throughout the translation unit. */ + int initializations_p; + /* Nonzero if there have been any destructions at this priority + throughout the translation unit. */ + int destructions_p; +} *priority_info; + +static void mark_vtable_entries (tree); +static bool maybe_emit_vtables (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_or_destruction (tree, bool); +static void one_static_initialization_or_destruction (tree, tree, bool); +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); +static void determine_visibility_from_class (tree, tree); +static bool decl_defined_p (tree); + +/* A list of static class variables. This is needed, because a + static class variable can be declared inside the class without + an initializer, and then initialized, statically, outside the class. */ +static GTY(()) VEC(tree,gc) *pending_statics; + +/* A list of functions which were declared inline, but which we + may need to emit outline anyway. */ +static GTY(()) VEC(tree,gc) *deferred_fns; + +/* A list of decls that use types with no linkage, which we need to make + sure are defined. */ +static GTY(()) VEC(tree,gc) *no_linkage_decls; + +/* Nonzero if we're done parsing and into end-of-file activities. */ + +int at_eof; + + + +/* Return a member function type (a METHOD_TYPE), given FNTYPE (a + FUNCTION_TYPE), CTYPE (class type), and QUALS (the cv-qualifiers + that apply to the function). */ + +tree +build_memfn_type (tree fntype, tree ctype, cp_cv_quals quals) +{ + tree raises; + tree attrs; + int type_quals; + + if (fntype == error_mark_node || ctype == error_mark_node) + return error_mark_node; + + gcc_assert (TREE_CODE (fntype) == FUNCTION_TYPE + || TREE_CODE (fntype) == METHOD_TYPE); + + type_quals = quals & ~TYPE_QUAL_RESTRICT; + ctype = cp_build_qualified_type (ctype, type_quals); + raises = TYPE_RAISES_EXCEPTIONS (fntype); + attrs = TYPE_ATTRIBUTES (fntype); + 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); + if (attrs) + fntype = cp_build_type_attribute_variant (fntype, attrs); + + return fntype; +} + +/* Return a variant of FNTYPE, a FUNCTION_TYPE or METHOD_TYPE, with its + return type changed to NEW_RET. */ + +tree +change_return_type (tree new_ret, tree fntype) +{ + tree newtype; + tree args = TYPE_ARG_TYPES (fntype); + tree raises = TYPE_RAISES_EXCEPTIONS (fntype); + tree attrs = TYPE_ATTRIBUTES (fntype); + + if (same_type_p (new_ret, TREE_TYPE (fntype))) + return fntype; + + if (TREE_CODE (fntype) == FUNCTION_TYPE) + { + newtype = build_function_type (new_ret, args); + newtype = apply_memfn_quals (newtype, type_memfn_quals (fntype)); + } + else + newtype = build_method_type_directly + (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))), + new_ret, TREE_CHAIN (args)); + if (raises) + newtype = build_exception_variant (newtype, raises); + if (attrs) + newtype = cp_build_type_attribute_variant (newtype, attrs); + + return newtype; +} + +/* Build a PARM_DECL with NAME and TYPE, and set DECL_ARG_TYPE + appropriately. */ + +tree +cp_build_parm_decl (tree name, tree type) +{ + tree parm = build_decl (input_location, + 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); + + /* If the type is a pack expansion, then we have a function + parameter pack. */ + if (type && TREE_CODE (type) == TYPE_PACK_EXPANSION) + FUNCTION_PARAMETER_PACK_P (parm) = 1; + + return parm; +} + +/* Returns a PARM_DECL for a parameter of the indicated TYPE, with the + indicated NAME. */ + +tree +build_artificial_parm (tree name, tree type) +{ + tree parm = cp_build_parm_decl (name, type); + DECL_ARTIFICIAL (parm) = 1; + /* All our artificial parms are implicitly `const'; they cannot be + assigned to. */ + TREE_READONLY (parm) = 1; + return parm; +} + +/* Constructors for types with virtual baseclasses need an "in-charge" flag + saying whether this constructor is responsible for initialization of + virtual baseclasses or not. All destructors also need this "in-charge" + flag, which additionally determines whether or not the destructor should + free the memory for the object. + + This function adds the "in-charge" flag to member function FN if + appropriate. It is called from grokclassfn and tsubst. + FN must be either a constructor or destructor. + + The in-charge flag follows the 'this' parameter, and is followed by the + VTT parm (if any), then the user-written parms. */ + +void +maybe_retrofit_in_chrg (tree fn) +{ + tree basetype, arg_types, parms, parm, fntype; + + /* If we've already add the in-charge parameter don't do it again. */ + if (DECL_HAS_IN_CHARGE_PARM_P (fn)) + return; + + /* 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 + have virtual bases. */ + if (DECL_CONSTRUCTOR_P (fn) + && !CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn))) + return; + + arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn)); + basetype = TREE_TYPE (TREE_VALUE (arg_types)); + arg_types = TREE_CHAIN (arg_types); + + parms = DECL_CHAIN (DECL_ARGUMENTS (fn)); + + /* If this is a subobject constructor or destructor, our caller will + pass us a pointer to our VTT. */ + if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn))) + { + parm = build_artificial_parm (vtt_parm_identifier, vtt_parm_type); + + /* First add it to DECL_ARGUMENTS between 'this' and the real args... */ + DECL_CHAIN (parm) = parms; + parms = parm; + + /* ...and then to TYPE_ARG_TYPES. */ + arg_types = hash_tree_chain (vtt_parm_type, arg_types); + + DECL_HAS_VTT_PARM_P (fn) = 1; + } + + /* Then add the in-charge parm (before the VTT parm). */ + parm = build_artificial_parm (in_charge_identifier, integer_type_node); + DECL_CHAIN (parm) = parms; + parms = parm; + arg_types = hash_tree_chain (integer_type_node, arg_types); + + /* Insert our new parameter(s) into the list. */ + DECL_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))); + if (TYPE_ATTRIBUTES (TREE_TYPE (fn))) + fntype = (cp_build_type_attribute_variant + (fntype, TYPE_ATTRIBUTES (TREE_TYPE (fn)))); + TREE_TYPE (fn) = fntype; + + /* Now we've got the in-charge parameter. */ + DECL_HAS_IN_CHARGE_PARM_P (fn) = 1; +} + +/* Classes overload their constituent function names automatically. + When a function name is declared in a record structure, + its name is changed to it overloaded name. Since names for + constructors and destructors can conflict, we place a leading + '$' for destructors. + + CNAME is the name of the class we are grokking for. + + FUNCTION is a FUNCTION_DECL. It was created by `grokdeclarator'. + + FLAGS contains bits saying what's special about today's + arguments. DTOR_FLAG == DESTRUCTOR. + + If FUNCTION is a destructor, then we must add the `auto-delete' field + as a second parameter. There is some hair associated with the fact + that we must "declare" this variable in the manner consistent with the + way the rest of the arguments were declared. + + QUALS are the qualifiers for the this pointer. */ + +void +grokclassfn (tree ctype, tree function, enum overload_flags flags) +{ + tree fn_name = DECL_NAME (function); + + /* Even within an `extern "C"' block, members get C++ linkage. See + [dcl.link] for details. */ + SET_DECL_LANGUAGE (function, lang_cplusplus); + + if (fn_name == NULL_TREE) + { + error ("name missing for member function"); + fn_name = get_identifier (""); + DECL_NAME (function) = fn_name; + } + + DECL_CONTEXT (function) = ctype; + + if (flags == DTOR_FLAG) + DECL_DESTRUCTOR_P (function) = 1; + + 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, + NULL_TREE, NULL_TREE); + array_expr = build_non_dependent_expr (array_expr); + index_exp = build_non_dependent_expr (index_exp); + } + + type = TREE_TYPE (array_expr); + gcc_assert (type); + type = non_reference (type); + + /* If they have an `operator[]', use that. */ + if (MAYBE_CLASS_TYPE_P (type) || MAYBE_CLASS_TYPE_P (TREE_TYPE (index_exp))) + expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL, + array_expr, index_exp, NULL_TREE, + /*overloaded_p=*/NULL, tf_warning_or_error); + 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 (input_location, 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, + NULL_TREE, NULL_TREE); + 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; + + if (processing_template_decl) + { + t = build_min (DELETE_EXPR, void_type_node, exp, size); + DELETE_EXPR_USE_GLOBAL (t) = use_global_delete; + DELETE_EXPR_USE_VEC (t) = doing_vec; + TREE_SIDE_EFFECTS (t) = 1; + return t; + } + + /* 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 (0, "deleting array %q#D", exp); + + t = build_expr_type_conversion (WANT_POINTER, exp, true); + + if (t == NULL_TREE || t == error_mark_node) + { + error ("type %q#T argument given to %, expected pointer", + TREE_TYPE (exp)); + return error_mark_node; + } + + type = TREE_TYPE (t); + + /* As of Valley Forge, you can delete a pointer to const. */ + + /* You can't delete functions. */ + if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) + { + error ("cannot delete a function. Only pointer-to-objects are " + "valid arguments to %"); + return error_mark_node; + } + + /* Deleting ptr to void is undefined behavior [expr.delete/3]. */ + if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE) + { + warning (0, "deleting %qT is undefined", type); + 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, + LOOKUP_NORMAL, use_global_delete); +} + +/* Report an error if the indicated template declaration is not the + sort of thing that should be a member template. */ + +void +check_member_template (tree tmpl) +{ + tree decl; + + gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL); + decl = DECL_TEMPLATE_RESULT (tmpl); + + if (TREE_CODE (decl) == FUNCTION_DECL + || (TREE_CODE (decl) == TYPE_DECL + && MAYBE_CLASS_TYPE_P (TREE_TYPE (decl)))) + { + /* The parser rejects template declarations in local classes. */ + gcc_assert (!current_function_decl); + /* The parser rejects any use of virtual in a function template. */ + gcc_assert (!(TREE_CODE (decl) == FUNCTION_DECL + && DECL_VIRTUAL_P (decl))); + + /* The debug-information generating code doesn't know what to do + with member templates. */ + DECL_IGNORED_P (tmpl) = 1; + } + else + error ("template declaration of %q#D", decl); +} + +/* Return true iff TYPE is a valid Java parameter or return type. */ + +static bool +acceptable_java_type (tree type) +{ + if (type == error_mark_node) + return false; + + if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type)) + return true; + if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE) + { + type = TREE_TYPE (type); + if (TREE_CODE (type) == RECORD_TYPE) + { + 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) + { + type = TREE_VEC_ELT (args, i); + 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 %qD has non-Java return type %qT", + 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)) + { + if (type != error_mark_node) + error ("Java method %qD has non-Java parameter type %qT", + 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. + TEMPLATE_PARMS is used to specify the template parameters of a member + template passed as FUNCTION_DECL. If the member template is passed as a + TEMPLATE_DECL, it can be NULL since the parameters can be extracted + from the declaration. If the function is not a function template, it + must be NULL. + It returns the original declaration for the function, NULL_TREE if + no declaration was found, error_mark_node if an error was emitted. */ + +tree +check_classfn (tree ctype, tree function, tree template_parms) +{ + int ix; + bool is_template; + tree pushed_scope; + + if (DECL_USE_TEMPLATE (function) + && !(TREE_CODE (function) == TEMPLATE_DECL + && DECL_TEMPLATE_SPECIALIZATION (function)) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (function))) + /* Since this is a specialization of a member template, + we're not going to find the declaration in the class. + For example, in: + + struct S { template void f(T); }; + template <> void S::f(int); + + we're not going to find `S::f(int)', but there's no + reason we should, either. We let our callers know we didn't + find the method, but we don't complain. */ + return NULL_TREE; + + /* Basic sanity check: for a template function, the template parameters + either were not passed, or they are the same of DECL_TEMPLATE_PARMS. */ + if (TREE_CODE (function) == TEMPLATE_DECL) + { + if (template_parms + && !comp_template_parms (template_parms, + DECL_TEMPLATE_PARMS (function))) + { + error ("template parameter lists provided don%'t match the " + "template parameters of %qD", function); + return error_mark_node; + } + template_parms = DECL_TEMPLATE_PARMS (function); + } + + /* OK, is this a definition of a member template? */ + is_template = (template_parms != NULL_TREE); + + /* We must enter the scope here, because conversion operators are + named by target type, and type equivalence relies on typenames + resolving within the scope of CTYPE. */ + pushed_scope = push_scope (ctype); + ix = class_method_index_for_fn (complete_type (ctype), function); + if (ix >= 0) + { + VEC(tree,gc) *methods = CLASSTYPE_METHOD_VEC (ctype); + tree fndecls, fndecl = 0; + bool is_conv_op; + const char *format = NULL; + + for (fndecls = VEC_index (tree, methods, ix); + fndecls; fndecls = OVL_NEXT (fndecls)) + { + tree p1, p2; + + fndecl = OVL_CURRENT (fndecls); + p1 = TYPE_ARG_TYPES (TREE_TYPE (function)); + p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); + + /* We cannot simply call decls_match because this doesn't + work for static member functions that are pretending to + be methods, and because the name may have been changed by + asm("new_name"). */ + + /* Get rid of the this parameter on functions that become + static. */ + if (DECL_STATIC_FUNCTION_P (fndecl) + && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE) + p1 = TREE_CHAIN (p1); + + /* A member template definition only matches a member template + declaration. */ + if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL)) + continue; + + if (same_type_p (TREE_TYPE (TREE_TYPE (function)), + TREE_TYPE (TREE_TYPE (fndecl))) + && compparms (p1, p2) + && (!is_template + || comp_template_parms (template_parms, + DECL_TEMPLATE_PARMS (fndecl))) + && (DECL_TEMPLATE_SPECIALIZATION (function) + == DECL_TEMPLATE_SPECIALIZATION (fndecl)) + && (!DECL_TEMPLATE_SPECIALIZATION (function) + || (DECL_TI_TEMPLATE (function) + == DECL_TI_TEMPLATE (fndecl)))) + break; + } + if (fndecls) + { + if (pushed_scope) + pop_scope (pushed_scope); + return OVL_CURRENT (fndecls); + } + + error_at (DECL_SOURCE_LOCATION (function), + "prototype for %q#D does not match any in class %qT", + function, ctype); + is_conv_op = DECL_CONV_FN_P (fndecl); + + if (is_conv_op) + ix = CLASSTYPE_FIRST_CONVERSION_SLOT; + fndecls = VEC_index (tree, methods, ix); + while (fndecls) + { + fndecl = OVL_CURRENT (fndecls); + fndecls = OVL_NEXT (fndecls); + + if (!fndecls && is_conv_op) + { + if (VEC_length (tree, methods) > (size_t) ++ix) + { + fndecls = VEC_index (tree, methods, ix); + if (!DECL_CONV_FN_P (OVL_CURRENT (fndecls))) + { + fndecls = NULL_TREE; + is_conv_op = false; + } + } + else + is_conv_op = false; + } + if (format) + format = " %+#D"; + else if (fndecls) + format = N_("candidates are: %+#D"); + else + format = N_("candidate is: %+#D"); + error (format, fndecl); + } + } + else if (!COMPLETE_TYPE_P (ctype)) + cxx_incomplete_type_error (function, ctype); + else + error ("no %q#D member function declared in class %qT", + function, ctype); + + if (pushed_scope) + pop_scope (pushed_scope); + return error_mark_node; +} + +/* DECL is a function with vague linkage. Remember it so that at the + end of the translation unit we can decide whether or not to emit + it. */ + +void +note_vague_linkage_fn (tree decl) +{ + DECL_DEFER_OUTPUT (decl) = 1; + VEC_safe_push (tree, gc, deferred_fns, decl); +} + +/* We have just processed the DECL, which is a static data member. + The other parameters are as for cp_finish_decl. */ + +void +finish_static_data_member_decl (tree decl, + tree init, bool init_const_expr_p, + tree asmspec_tree, + int flags) +{ + DECL_CONTEXT (decl) = current_class_type; + + /* We cannot call pushdecl here, because that would fill in the + TREE_CHAIN of our decl. Instead, we modify cp_finish_decl to do + the right thing, namely, to put this decl out straight away. */ + + if (! processing_template_decl) + VEC_safe_push (tree, gc, pending_statics, decl); + + if (LOCAL_CLASS_P (current_class_type)) + permerror (input_location, "local class %q#T shall not have static data member %q#D", + current_class_type, decl); + + DECL_IN_AGGR_P (decl) = 1; + + if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE + && TYPE_DOMAIN (TREE_TYPE (decl)) == NULL_TREE) + SET_VAR_HAD_UNKNOWN_BOUND (decl); + + cp_finish_decl (decl, init, init_const_expr_p, asmspec_tree, flags); +} + +/* DECLARATOR and DECLSPECS correspond to a class member. The other + parameters are as for cp_finish_decl. Return the DECL for the + class member declared. */ + +tree +grokfield (const cp_declarator *declarator, + cp_decl_specifier_seq *declspecs, + tree init, bool init_const_expr_p, + tree asmspec_tree, + tree attrlist) +{ + tree value; + const char *asmspec = 0; + int flags = LOOKUP_ONLYCONVERTING; + tree name; + + if (init + && TREE_CODE (init) == TREE_LIST + && TREE_VALUE (init) == error_mark_node + && TREE_CHAIN (init) == NULL_TREE) + 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) + { + error ("typedef %qD is initialized (use decltype instead)", value); + init = NULL_TREE; + } + + /* 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; + + name = DECL_NAME (value); + + if (name != NULL_TREE) + { + if (TREE_CODE (name) == TEMPLATE_ID_EXPR) + { + error ("explicit template argument list not allowed"); + return error_mark_node; + } + + if (IDENTIFIER_POINTER (name)[0] == '_' + && ! strcmp (IDENTIFIER_POINTER (name), "_vptr")) + error ("member %qD conflicts with virtual function table field name", + value); + } + + /* Stash away type declarations. */ + if (TREE_CODE (value) == TYPE_DECL) + { + DECL_NONLOCAL (value) = 1; + DECL_CONTEXT (value) = current_class_type; + + if (processing_template_decl) + value = push_template_decl (value); + + if (attrlist) + { + int attrflags = 0; + + /* If this is a typedef that names the class for linkage purposes + (7.1.3p8), apply any attributes directly to the type. */ + if (TAGGED_TYPE_P (TREE_TYPE (value)) + && value == TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (value)))) + attrflags = ATTR_FLAG_TYPE_IN_PLACE; + + cplus_decl_attributes (&value, attrlist, attrflags); + } + + if (declspecs->specs[(int)ds_typedef] + && TREE_TYPE (value) != error_mark_node + && TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (value))) != value) + set_underlying_type (value); + + return value; + } + + if (DECL_IN_AGGR_P (value)) + { + error ("%qD is already defined in %qT", value, DECL_CONTEXT (value)); + return void_type_node; + } + + if (asmspec_tree && asmspec_tree != error_mark_node) + asmspec = TREE_STRING_POINTER (asmspec_tree); + + if (init) + { + if (TREE_CODE (value) == FUNCTION_DECL) + { + /* Initializers for functions are rejected early in the parser. + If we get here, it must be a pure specifier for a method. */ + if (init == ridpointers[(int)RID_DELETE]) + { + DECL_DELETED_FN (value) = 1; + DECL_DECLARED_INLINE_P (value) = 1; + DECL_INITIAL (value) = error_mark_node; + } + else if (init == ridpointers[(int)RID_DEFAULT]) + { + if (defaultable_fn_check (value)) + { + DECL_DEFAULTED_FN (value) = 1; + DECL_INITIALIZED_IN_CLASS_P (value) = 1; + DECL_DECLARED_INLINE_P (value) = 1; + } + } + else if (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE) + { + if (integer_zerop (init)) + DECL_PURE_VIRTUAL_P (value) = 1; + else if (error_operand_p (init)) + ; /* An error has already been reported. */ + else + error ("invalid initializer for member function %qD", + value); + } + else + { + gcc_assert (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE); + error ("initializer specified for static member function %qD", + value); + } + } + else if (pedantic && TREE_CODE (value) != VAR_DECL) + /* Already complained in grokdeclarator. */ + init = NULL_TREE; + else if (!processing_template_decl) + { + if (TREE_CODE (init) == CONSTRUCTOR) + init = digest_init (TREE_TYPE (value), init); + init = maybe_constant_init (init); + + if (init != error_mark_node && !TREE_CONSTANT (init)) + { + /* We can allow references to things that are effectively + static, since references are initialized with the + address. */ + if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE + || (TREE_STATIC (init) == 0 + && (!DECL_P (init) || DECL_EXTERNAL (init) == 0))) + { + error ("field initializer is not constant"); + init = error_mark_node; + } + } + } + } + + 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); + + switch (TREE_CODE (value)) + { + case VAR_DECL: + finish_static_data_member_decl (value, init, init_const_expr_p, + asmspec_tree, flags); + return value; + + case FIELD_DECL: + if (asmspec) + error ("% specifiers are not permitted on non-static data members"); + if (DECL_INITIAL (value) == error_mark_node) + init = error_mark_node; + cp_finish_decl (value, init, /*init_const_expr_p=*/false, + NULL_TREE, flags); + DECL_INITIAL (value) = init; + DECL_IN_AGGR_P (value) = 1; + return value; + + case FUNCTION_DECL: + if (asmspec) + set_user_assembler_name (value, asmspec); + + cp_finish_decl (value, + /*init=*/NULL_TREE, + /*init_const_expr_p=*/false, + asmspec_tree, flags); + + /* Pass friends back this way. */ + if (DECL_FRIEND_P (value)) + return void_type_node; + + DECL_IN_AGGR_P (value) = 1; + return value; + + default: + gcc_unreachable (); + } + return NULL_TREE; +} + +/* Like `grokfield', but for bitfields. + WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */ + +tree +grokbitfield (const cp_declarator *declarator, + cp_decl_specifier_seq *declspecs, tree width, + tree attrlist) +{ + tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, &attrlist); + + if (value == error_mark_node) + return NULL_TREE; /* friends went bad. */ + + /* Pass friendly classes back. */ + if (TREE_CODE (value) == VOID_TYPE) + return void_type_node; + + if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (value)) + && (POINTER_TYPE_P (value) + || !dependent_type_p (TREE_TYPE (value)))) + { + error ("bit-field %qD with non-integral type", value); + return error_mark_node; + } + + if (TREE_CODE (value) == TYPE_DECL) + { + error ("cannot declare %qD to be a bit-field type", value); + return NULL_TREE; + } + + /* Usually, finish_struct_1 catches bitfields with invalid types. + But, in the case of bitfields with function type, we confuse + ourselves into thinking they are member functions, so we must + check here. */ + if (TREE_CODE (value) == FUNCTION_DECL) + { + error ("cannot declare bit-field %qD with function type", + DECL_NAME (value)); + return NULL_TREE; + } + + if (DECL_IN_AGGR_P (value)) + { + error ("%qD is already defined in the class %qT", value, + DECL_CONTEXT (value)); + return void_type_node; + } + + if (TREE_STATIC (value)) + { + error ("static member %qD cannot be a bit-field", value); + return NULL_TREE; + } + cp_finish_decl (value, NULL_TREE, false, NULL_TREE, 0); + + if (width != error_mark_node) + { + /* The width must be an integer type. */ + if (!type_dependent_expression_p (width) + && !INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (width))) + error ("width of bit-field %qD has non-integral type %qT", value, + TREE_TYPE (width)); + DECL_INITIAL (value) = width; + SET_DECL_C_BIT_FIELD (value); + } + + DECL_IN_AGGR_P (value) = 1; + + if (attrlist) + cplus_decl_attributes (&value, attrlist, /*flags=*/0); + + return value; +} + + +/* Returns true iff ATTR is an attribute which needs to be applied at + instantiation time rather than template definition time. */ + +static bool +is_late_template_attribute (tree attr, tree decl) +{ + tree name = TREE_PURPOSE (attr); + tree args = TREE_VALUE (attr); + const struct attribute_spec *spec = lookup_attribute_spec (name); + tree arg; + + if (!spec) + /* Unknown attribute. */ + return false; + + /* Attribute weak handling wants to write out assembly right away. */ + if (is_attribute_p ("weak", name)) + return true; + + /* If any of the arguments are dependent expressions, we can't evaluate + the attribute until instantiation time. */ + for (arg = args; arg; arg = TREE_CHAIN (arg)) + { + tree t = TREE_VALUE (arg); + + /* If the first attribute argument is an identifier, only consider + second and following arguments. Attributes like mode, format, + cleanup and several target specific attributes aren't late + just because they have an IDENTIFIER_NODE as first argument. */ + if (arg == args && TREE_CODE (t) == IDENTIFIER_NODE) + continue; + + if (value_dependent_expression_p (t) + || type_dependent_expression_p (t)) + return true; + } + + if (TREE_CODE (decl) == TYPE_DECL + || TYPE_P (decl) + || spec->type_required) + { + tree type = TYPE_P (decl) ? decl : TREE_TYPE (decl); + + /* We can't apply any attributes to a completely unknown type until + instantiation time. */ + enum tree_code code = TREE_CODE (type); + if (code == TEMPLATE_TYPE_PARM + || code == BOUND_TEMPLATE_TEMPLATE_PARM + || code == TYPENAME_TYPE) + return true; + /* Also defer most attributes on dependent types. This is not + necessary in all cases, but is the better default. */ + else if (dependent_type_p (type) + /* But attribute visibility specifically works on + templates. */ + && !is_attribute_p ("visibility", name)) + return true; + else + return false; + } + else + return false; +} + +/* ATTR_P is a list of attributes. Remove any attributes which need to be + applied at instantiation time and return them. If IS_DEPENDENT is true, + the declaration itself is dependent, so all attributes should be applied + at instantiation time. */ + +static tree +splice_template_attributes (tree *attr_p, tree decl) +{ + tree *p = attr_p; + tree late_attrs = NULL_TREE; + tree *q = &late_attrs; + + if (!p) + return NULL_TREE; + + for (; *p; ) + { + if (is_late_template_attribute (*p, decl)) + { + ATTR_IS_DEPENDENT (*p) = 1; + *q = *p; + *p = TREE_CHAIN (*p); + q = &TREE_CHAIN (*q); + *q = NULL_TREE; + } + else + p = &TREE_CHAIN (*p); + } + + return late_attrs; +} + +/* Remove any late attributes from the list in ATTR_P and attach them to + DECL_P. */ + +static void +save_template_attributes (tree *attr_p, tree *decl_p) +{ + tree late_attrs = splice_template_attributes (attr_p, *decl_p); + tree *q; + tree old_attrs = NULL_TREE; + + if (!late_attrs) + return; + + if (DECL_P (*decl_p)) + q = &DECL_ATTRIBUTES (*decl_p); + else + q = &TYPE_ATTRIBUTES (*decl_p); + + old_attrs = *q; + + /* Merge the late attributes at the beginning with the attribute + list. */ + late_attrs = merge_attributes (late_attrs, *q); + *q = late_attrs; + + if (!DECL_P (*decl_p) && *decl_p == TYPE_MAIN_VARIANT (*decl_p)) + { + /* We've added new attributes directly to the main variant, so + now we need to update all of the other variants to include + these new attributes. */ + tree variant; + for (variant = TYPE_NEXT_VARIANT (*decl_p); variant; + variant = TYPE_NEXT_VARIANT (variant)) + { + gcc_assert (TYPE_ATTRIBUTES (variant) == old_attrs); + TYPE_ATTRIBUTES (variant) = TYPE_ATTRIBUTES (*decl_p); + } + } +} + +/* Like reconstruct_complex_type, but handle also template trees. */ + +tree +cp_reconstruct_complex_type (tree type, tree bottom) +{ + tree inner, outer; + + if (TREE_CODE (type) == POINTER_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_pointer_type_for_mode (inner, TYPE_MODE (type), + TYPE_REF_CAN_ALIAS_ALL (type)); + } + else if (TREE_CODE (type) == REFERENCE_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_reference_type_for_mode (inner, TYPE_MODE (type), + TYPE_REF_CAN_ALIAS_ALL (type)); + } + else if (TREE_CODE (type) == ARRAY_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_cplus_array_type (inner, TYPE_DOMAIN (type)); + /* Don't call cp_build_qualified_type on ARRAY_TYPEs, the + element type qualification will be handled by the recursive + cp_reconstruct_complex_type call and cp_build_qualified_type + for ARRAY_TYPEs changes the element type. */ + return outer; + } + else if (TREE_CODE (type) == FUNCTION_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_function_type (inner, TYPE_ARG_TYPES (type)); + outer = apply_memfn_quals (outer, type_memfn_quals (type)); + } + else if (TREE_CODE (type) == METHOD_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + /* The build_method_type_directly() routine prepends 'this' to argument list, + so we must compensate by getting rid of it. */ + outer + = build_method_type_directly + (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))), + inner, + TREE_CHAIN (TYPE_ARG_TYPES (type))); + } + else if (TREE_CODE (type) == OFFSET_TYPE) + { + inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_offset_type (TYPE_OFFSET_BASETYPE (type), inner); + } + else + return bottom; + + if (TYPE_ATTRIBUTES (type)) + outer = cp_build_type_attribute_variant (outer, TYPE_ATTRIBUTES (type)); + return cp_build_qualified_type (outer, cp_type_quals (type)); +} + +/* Replaces any constexpr expression that may be into the attributes + arguments with their reduced value. */ + +static void +cp_check_const_attributes (tree attributes) +{ + tree attr; + for (attr = attributes; attr; attr = TREE_CHAIN (attr)) + { + tree arg; + for (arg = TREE_VALUE (attr); arg; arg = TREE_CHAIN (arg)) + { + tree expr = TREE_VALUE (arg); + if (EXPR_P (expr)) + TREE_VALUE (arg) = maybe_constant_value (expr); + } + } +} + +/* Like decl_attributes, but handle C++ complexity. */ + +void +cplus_decl_attributes (tree *decl, tree attributes, int flags) +{ + if (*decl == NULL_TREE || *decl == void_type_node + || *decl == error_mark_node + || attributes == NULL_TREE) + return; + + if (processing_template_decl) + { + if (check_for_bare_parameter_packs (attributes)) + return; + + save_template_attributes (&attributes, decl); + if (attributes == NULL_TREE) + return; + } + + cp_check_const_attributes (attributes); + + if (TREE_CODE (*decl) == TEMPLATE_DECL) + decl = &DECL_TEMPLATE_RESULT (*decl); + + decl_attributes (decl, attributes, flags); + + if (TREE_CODE (*decl) == TYPE_DECL) + SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl)); +} + +/* Walks through the namespace- or function-scope anonymous union + OBJECT, with the indicated TYPE, building appropriate VAR_DECLs. + Returns one of the fields for use in the mangled name. */ + +static tree +build_anon_union_vars (tree type, tree object) +{ + tree main_decl = NULL_TREE; + tree field; + + /* Rather than write the code to handle the non-union case, + just give an error. */ + if (TREE_CODE (type) != UNION_TYPE) + error ("anonymous struct not inside named type"); + + for (field = TYPE_FIELDS (type); + field != NULL_TREE; + field = DECL_CHAIN (field)) + { + tree decl; + tree ref; + + if (DECL_ARTIFICIAL (field)) + continue; + if (TREE_CODE (field) != FIELD_DECL) + { + permerror (input_location, "%q+#D invalid; an anonymous union can only " + "have non-static data members", field); + continue; + } + + if (TREE_PRIVATE (field)) + permerror (input_location, "private member %q+#D in anonymous union", field); + else if (TREE_PROTECTED (field)) + permerror (input_location, "protected member %q+#D in anonymous union", field); + + if (processing_template_decl) + ref = build_min_nt (COMPONENT_REF, object, + DECL_NAME (field), NULL_TREE); + else + ref = build_class_member_access_expr (object, field, NULL_TREE, + false, tf_warning_or_error); + + if (DECL_NAME (field)) + { + tree base; + + decl = build_decl (input_location, + VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); + DECL_ANON_UNION_VAR_P (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + + base = get_base_address (object); + TREE_PUBLIC (decl) = TREE_PUBLIC (base); + TREE_STATIC (decl) = TREE_STATIC (base); + DECL_EXTERNAL (decl) = DECL_EXTERNAL (base); + + SET_DECL_VALUE_EXPR (decl, ref); + DECL_HAS_VALUE_EXPR_P (decl) = 1; + + decl = pushdecl (decl); + } + else if (ANON_AGGR_TYPE_P (TREE_TYPE (field))) + decl = build_anon_union_vars (TREE_TYPE (field), ref); + else + decl = 0; + + if (main_decl == NULL_TREE) + main_decl = decl; + } + + return main_decl; +} + +/* Finish off the processing of a UNION_TYPE structure. If the union is an + anonymous union, then all members must be laid out together. PUBLIC_P + is nonzero if this union is not declared static. */ + +void +finish_anon_union (tree anon_union_decl) +{ + tree type; + tree main_decl; + bool public_p; + + if (anon_union_decl == error_mark_node) + return; + + type = TREE_TYPE (anon_union_decl); + 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)); + + if (TYPE_FIELDS (type) == NULL_TREE) + return; + + if (public_p) + { + error ("namespace-scope anonymous aggregates must be static"); + return; + } + + main_decl = build_anon_union_vars (type, anon_union_decl); + if (main_decl == error_mark_node) + return; + if (main_decl == NULL_TREE) + { + warning (0, "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); + maybe_commonize_var (anon_union_decl); + if (TREE_STATIC (anon_union_decl) || DECL_EXTERNAL (anon_union_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_expr (anon_union_decl); + else if (!processing_template_decl) + rest_of_decl_compilation (anon_union_decl, + toplevel_bindings_p (), at_eof); +} + +/* Auxiliary functions to make type signatures for + `operator new' and `operator delete' correspond to + what compiler will be expecting. */ + +tree +coerce_new_type (tree type) +{ + int e = 0; + tree args = TYPE_ARG_TYPES (type); + + gcc_assert (TREE_CODE (type) == FUNCTION_TYPE); + + if (!same_type_p (TREE_TYPE (type), ptr_type_node)) + { + e = 1; + error ("% must return type %qT", ptr_type_node); + } + + if (args && args != void_list_node) + { + if (TREE_PURPOSE (args)) + { + /* [basic.stc.dynamic.allocation] + + The first parameter shall not have an associated default + argument. */ + error ("the first parameter of % cannot " + "have a default argument"); + /* Throw away the default argument. */ + TREE_PURPOSE (args) = NULL_TREE; + } + + if (!same_type_p (TREE_VALUE (args), size_type_node)) + { + e = 2; + args = TREE_CHAIN (args); + } + } + else + e = 2; + + if (e == 2) + permerror (input_location, "% takes type % (%qT) " + "as first parameter", size_type_node); + + switch (e) + { + 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); + + gcc_assert (TREE_CODE (type) == FUNCTION_TYPE); + + if (!same_type_p (TREE_TYPE (type), void_type_node)) + { + e = 1; + error ("% must return type %qT", void_type_node); + } + + if (!args || args == void_list_node + || !same_type_p (TREE_VALUE (args), ptr_type_node)) + { + e = 2; + if (args && args != void_list_node) + args = TREE_CHAIN (args); + error ("% takes type %qT as first parameter", + ptr_type_node); + } + switch (e) + { + 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:; + } + + return type; +} + +/* DECL is a VAR_DECL for a vtable: walk through the entries in the vtable + and mark them as needed. */ + +static void +mark_vtable_entries (tree decl) +{ + tree fnaddr; + unsigned HOST_WIDE_INT idx; + + FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (DECL_INITIAL (decl)), + idx, fnaddr) + { + 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 + virtual call offset, an RTTI offset, etc. */ + continue; + + fn = TREE_OPERAND (fnaddr, 0); + TREE_ADDRESSABLE (fn) = 1; + /* When we don't have vcall offsets, we output thunks whenever + we output the vtables that contain them. With vcall offsets, + we know all the thunks we'll need when we emit a virtual + function, so we emit the thunks there instead. */ + if (DECL_THUNK_P (fn)) + use_thunk (fn, /*emit_p=*/0); + mark_used (fn); + } +} + +/* Set DECL up to have the closest approximation of "initialized common" + linkage available. */ + +void +comdat_linkage (tree decl) +{ + if (flag_weak) + make_decl_one_only (decl, cxx_comdat_group (decl)); + else if (TREE_CODE (decl) == FUNCTION_DECL + || (TREE_CODE (decl) == VAR_DECL && DECL_ARTIFICIAL (decl))) + /* We can just emit function and compiler-generated variables + statically; having multiple copies is (for the most part) only + a waste of space. + + There are two correctness issues, however: the address of a + template instantiation with external linkage should be the + same, independent of what translation unit asks for the + address, and this will not hold when we emit multiple copies of + the function. However, there's little else we can do. + + Also, by default, the typeinfo implementation assumes that + there will be only one copy of the string used as the name for + each type. Therefore, if weak symbols are unavailable, the + run-time library should perform a more conservative check; it + should perform a string comparison, rather than an address + comparison. */ + TREE_PUBLIC (decl) = 0; + else + { + /* Static data member template instantiations, however, cannot + have multiple copies. */ + if (DECL_INITIAL (decl) == 0 + || DECL_INITIAL (decl) == error_mark_node) + DECL_COMMON (decl) = 1; + else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl))) + { + DECL_COMMON (decl) = 1; + DECL_INITIAL (decl) = error_mark_node; + } + else if (!DECL_EXPLICIT_INSTANTIATION (decl)) + { + /* We can't do anything useful; leave vars for explicit + instantiation. */ + DECL_EXTERNAL (decl) = 1; + DECL_NOT_REALLY_EXTERN (decl) = 0; + } + } + + DECL_COMDAT (decl) = 1; +} + +/* For win32 we also want to put explicit instantiations in + linkonce sections, so that they will be merged with implicit + instantiations; otherwise we get duplicate symbol errors. + For Darwin we do not want explicit instantiations to be + linkonce. */ + +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 + one. However, that's not actually the case in SVR4; a strong definition + after a weak one is an error. Also, not making explicit + instantiations one_only means that we can end up with two copies of + some template instantiations. */ + if (! flag_weak) + return; + + /* We can't set DECL_COMDAT on functions, or cp_finish_file will think + we can get away with not emitting them if they aren't used. We need + to for variables so that cp_finish_decl will update their linkage, + because their DECL_INITIAL may not have been set properly yet. */ + + if (!TARGET_WEAK_NOT_IN_ARCHIVE_TOC + || (! DECL_EXPLICIT_INSTANTIATION (decl) + && ! DECL_TEMPLATE_SPECIALIZATION (decl))) + { + make_decl_one_only (decl, cxx_comdat_group (decl)); + + if (TREE_CODE (decl) == VAR_DECL) + { + DECL_COMDAT (decl) = 1; + /* Mark it needed so we don't forget to emit it. */ + mark_decl_referenced (decl); + } + } +} + +/* Returns true iff DECL, a FUNCTION_DECL or VAR_DECL, has vague linkage. + This predicate will give the right answer during parsing of the + function, which other tests may not. */ + +bool +vague_linkage_p (tree decl) +{ + /* Unfortunately, import_export_decl has not always been called + before the function is processed, so we cannot simply check + DECL_COMDAT. */ + return (DECL_COMDAT (decl) + || (((TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl)) + || (DECL_LANG_SPECIFIC (decl) + && DECL_TEMPLATE_INSTANTIATION (decl))) + && TREE_PUBLIC (decl))); +} + +/* Determine whether or not we want to specifically import or export CTYPE, + using various heuristics. */ + +static void +import_export_class (tree ctype) +{ + /* -1 for imported, 1 for exported. */ + int import_export = 0; + + /* It only makes sense to call this function at EOF. The reason is + that this function looks at whether or not the first non-inline + non-abstract virtual member function has been defined in this + translation unit. But, we can't possibly know that until we've + seen the entire translation unit. */ + gcc_assert (at_eof); + + if (CLASSTYPE_INTERFACE_KNOWN (ctype)) + return; + + /* If MULTIPLE_SYMBOL_SPACES is set and we saw a #pragma interface, + we will have CLASSTYPE_INTERFACE_ONLY set but not + CLASSTYPE_INTERFACE_KNOWN. In that case, we don't want to use this + heuristic because someone will supply a #pragma implementation + elsewhere, and deducing it here would produce a conflict. */ + if (CLASSTYPE_INTERFACE_ONLY (ctype)) + return; + + if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype))) + import_export = -1; + else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype))) + import_export = 1; + else if (CLASSTYPE_IMPLICIT_INSTANTIATION (ctype) + && !flag_implicit_templates) + /* For a template class, without -fimplicit-templates, check the + repository. If the virtual table is assigned to this + translation unit, then export the class; otherwise, import + it. */ + import_export = repo_export_class_p (ctype) ? 1 : -1; + else if (TYPE_POLYMORPHIC_P (ctype)) + { + /* The ABI specifies that the virtual table and associated + information are emitted with the key method, if any. */ + tree method = CLASSTYPE_KEY_METHOD (ctype); + /* If weak symbol support is not available, then we must be + careful not to emit the vtable when the key function is + inline. An inline function can be defined in multiple + translation units. If we were to emit the vtable in each + translation unit containing a definition, we would get + multiple definition errors at link-time. */ + if (method && (flag_weak || ! DECL_DECLARED_INLINE_P (method))) + import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1); + } + + /* When MULTIPLE_SYMBOL_SPACES is set, we cannot count on seeing + a definition anywhere else. */ + if (MULTIPLE_SYMBOL_SPACES && import_export == -1) + import_export = 0; + + /* Allow back ends the chance to overrule the decision. */ + if (targetm.cxx.import_export_class) + import_export = targetm.cxx.import_export_class (ctype, import_export); + + if (import_export) + { + SET_CLASSTYPE_INTERFACE_KNOWN (ctype); + 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) +{ + return varpool_node (var)->finalized; +} + +/* DECL is a VAR_DECL or FUNCTION_DECL which, for whatever reason, + must be emitted in this translation unit. Mark it as such. */ + +void +mark_needed (tree decl) +{ + /* It's possible that we no longer need to set + TREE_SYMBOL_REFERENCED here directly, but doing so is + harmless. */ + TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = 1; + mark_decl_referenced (decl); +} + +/* DECL is either a FUNCTION_DECL or a VAR_DECL. This function + returns true if a definition of this entity should be provided in + this object file. Callers use this function to determine whether + or not to let the back end know that a definition of DECL is + available in this translation unit. */ + +bool +decl_needed_p (tree decl) +{ + gcc_assert (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL); + /* This function should only be called at the end of the translation + unit. We cannot be sure of whether or not something will be + COMDAT until that point. */ + gcc_assert (at_eof); + + /* All entities with external linkage that are not COMDAT should be + emitted; they may be referred to from other object files. */ + if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl)) + return true; + /* If this entity was used, let the back end see it; it will decide + whether or not to emit it into the object file. */ + if (TREE_USED (decl) + || (DECL_ASSEMBLER_NAME_SET_P (decl) + && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) + return true; + /* Functions marked "dllexport" must be emitted so that they are + visible to other DLLs. */ + if (flag_keep_inline_dllexport + && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) + return true; + /* Otherwise, DECL does not need to be emitted -- yet. A subsequent + reference to DECL might cause it to be emitted later. */ + return false; +} + +/* 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; + int needed = 0; + struct varpool_node *current = NULL, *last = NULL, *first = NULL; + + /* 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; + + /* On some targets, we cannot determine the key method until the end + of the translation unit -- which is when this function is + called. */ + if (!targetm.cxx.key_method_may_be_inline ()) + determine_key_method (ctype); + + /* See if any of the vtables are needed. */ + for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = DECL_CHAIN (vtbl)) + { + import_export_decl (vtbl); + if (DECL_NOT_REALLY_EXTERN (vtbl) && decl_needed_p (vtbl)) + needed = 1; + } + if (!needed) + { + /* If the references to this class' vtables are optimized away, + still emit the appropriate debugging information. See + dfs_debug_mark. */ + if (DECL_COMDAT (primary_vtbl) + && CLASSTYPE_DEBUG_REQUESTED (ctype)) + note_debug_info_needed (ctype); + return false; + } + + /* The ABI requires that we emit all of the vtables if we emit any + of them. */ + for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = DECL_CHAIN (vtbl)) + { + /* Mark entities references from the virtual table as used. */ + mark_vtable_entries (vtbl); + + if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0) + { + tree expr = store_init_value (vtbl, DECL_INITIAL (vtbl), LOOKUP_NORMAL); + + /* It had better be all done at compile-time. */ + gcc_assert (!expr); + } + + /* Write it out. */ + DECL_EXTERNAL (vtbl) = 0; + rest_of_decl_compilation (vtbl, 1, 1); + + /* Because we're only doing syntax-checking, we'll never end up + actually marking the variable as written. */ + if (flag_syntax_only) + TREE_ASM_WRITTEN (vtbl) = 1; + else if (DECL_COMDAT (vtbl)) + { + current = varpool_node (vtbl); + if (last) + last->same_comdat_group = current; + last = current; + if (!first) + first = current; + } + } + + if (first != last) + last->same_comdat_group = first; + + /* Since we're writing out the vtable here, also write the debug + info. */ + note_debug_info_needed (ctype); + + return true; +} + +/* A special return value from type_visibility meaning internal + linkage. */ + +enum { VISIBILITY_ANON = VISIBILITY_INTERNAL+1 }; + +/* walk_tree helper function for type_visibility. */ + +static tree +min_vis_r (tree *tp, int *walk_subtrees, void *data) +{ + int *vis_p = (int *)data; + if (! TYPE_P (*tp)) + { + *walk_subtrees = 0; + } + else if (TAGGED_TYPE_P (*tp) + && !TREE_PUBLIC (TYPE_MAIN_DECL (*tp))) + { + *vis_p = VISIBILITY_ANON; + return *tp; + } + else if (CLASS_TYPE_P (*tp) + && CLASSTYPE_VISIBILITY (*tp) > *vis_p) + *vis_p = CLASSTYPE_VISIBILITY (*tp); + return NULL; +} + +/* Returns the visibility of TYPE, which is the minimum visibility of its + component types. */ + +static int +type_visibility (tree type) +{ + int vis = VISIBILITY_DEFAULT; + cp_walk_tree_without_duplicates (&type, min_vis_r, &vis); + return vis; +} + +/* Limit the visibility of DECL to VISIBILITY, if not explicitly + specified (or if VISIBILITY is static). */ + +static bool +constrain_visibility (tree decl, int visibility) +{ + if (visibility == VISIBILITY_ANON) + { + /* extern "C" declarations aren't affected by the anonymous + namespace. */ + if (!DECL_EXTERN_C_P (decl)) + { + TREE_PUBLIC (decl) = 0; + DECL_WEAK (decl) = 0; + DECL_COMMON (decl) = 0; + DECL_COMDAT_GROUP (decl) = NULL_TREE; + DECL_INTERFACE_KNOWN (decl) = 1; + if (DECL_LANG_SPECIFIC (decl)) + DECL_NOT_REALLY_EXTERN (decl) = 1; + } + } + else if (visibility > DECL_VISIBILITY (decl) + && !DECL_VISIBILITY_SPECIFIED (decl)) + { + DECL_VISIBILITY (decl) = (enum symbol_visibility) visibility; + return true; + } + return false; +} + +/* Constrain the visibility of DECL based on the visibility of its template + arguments. */ + +static void +constrain_visibility_for_template (tree decl, tree targs) +{ + /* If this is a template instantiation, check the innermost + template args for visibility constraints. The outer template + args are covered by the class check. */ + tree args = INNERMOST_TEMPLATE_ARGS (targs); + int i; + for (i = TREE_VEC_LENGTH (args); i > 0; --i) + { + int vis = 0; + + tree arg = TREE_VEC_ELT (args, i-1); + if (TYPE_P (arg)) + vis = type_visibility (arg); + else if (TREE_TYPE (arg) && POINTER_TYPE_P (TREE_TYPE (arg))) + { + STRIP_NOPS (arg); + if (TREE_CODE (arg) == ADDR_EXPR) + arg = TREE_OPERAND (arg, 0); + if (TREE_CODE (arg) == VAR_DECL + || TREE_CODE (arg) == FUNCTION_DECL) + { + if (! TREE_PUBLIC (arg)) + vis = VISIBILITY_ANON; + else + vis = DECL_VISIBILITY (arg); + } + } + if (vis) + constrain_visibility (decl, vis); + } +} + +/* Like c_determine_visibility, but with additional C++-specific + behavior. + + Function-scope entities can rely on the function's visibility because + it is set in start_preparsed_function. + + Class-scope entities cannot rely on the class's visibility until the end + of the enclosing class definition. + + Note that because namespaces have multiple independent definitions, + namespace visibility is handled elsewhere using the #pragma visibility + machinery rather than by decorating the namespace declaration. + + The goal is for constraints from the type to give a diagnostic, and + other constraints to be applied silently. */ + +void +determine_visibility (tree decl) +{ + tree class_type = NULL_TREE; + bool use_template; + bool orig_visibility_specified; + enum symbol_visibility orig_visibility; + + /* Remember that all decls get VISIBILITY_DEFAULT when built. */ + + /* Only relevant for names with external linkage. */ + if (!TREE_PUBLIC (decl)) + return; + + /* Cloned constructors and destructors get the same visibility as + the underlying function. That should be set up in + maybe_clone_body. */ + gcc_assert (!DECL_CLONED_FUNCTION_P (decl)); + + orig_visibility_specified = DECL_VISIBILITY_SPECIFIED (decl); + orig_visibility = DECL_VISIBILITY (decl); + + if (TREE_CODE (decl) == TYPE_DECL) + { + if (CLASS_TYPE_P (TREE_TYPE (decl))) + use_template = CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl)); + else if (TYPE_TEMPLATE_INFO (TREE_TYPE (decl))) + use_template = 1; + else + use_template = 0; + } + else if (DECL_LANG_SPECIFIC (decl)) + use_template = DECL_USE_TEMPLATE (decl); + else + use_template = 0; + + /* If DECL is a member of a class, visibility specifiers on the + class can influence the visibility of the DECL. */ + if (DECL_CLASS_SCOPE_P (decl)) + class_type = DECL_CONTEXT (decl); + else + { + /* Not a class member. */ + + /* Virtual tables have DECL_CONTEXT set to their associated class, + so they are automatically handled above. */ + gcc_assert (TREE_CODE (decl) != VAR_DECL + || !DECL_VTABLE_OR_VTT_P (decl)); + + if (DECL_FUNCTION_SCOPE_P (decl) && ! DECL_VISIBILITY_SPECIFIED (decl)) + { + /* Local statics and classes get the visibility of their + containing function by default, except that + -fvisibility-inlines-hidden doesn't affect them. */ + tree fn = DECL_CONTEXT (decl); + if (DECL_VISIBILITY_SPECIFIED (fn) || ! DECL_CLASS_SCOPE_P (fn)) + { + DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn); + DECL_VISIBILITY_SPECIFIED (decl) = + DECL_VISIBILITY_SPECIFIED (fn); + } + else + determine_visibility_from_class (decl, DECL_CONTEXT (fn)); + + /* Local classes in templates have CLASSTYPE_USE_TEMPLATE set, + but have no TEMPLATE_INFO, so don't try to check it. */ + use_template = 0; + } + else if (TREE_CODE (decl) == VAR_DECL && DECL_TINFO_P (decl) + && flag_visibility_ms_compat) + { + /* Under -fvisibility-ms-compat, types are visible by default, + even though their contents aren't. */ + tree underlying_type = TREE_TYPE (DECL_NAME (decl)); + int underlying_vis = type_visibility (underlying_type); + if (underlying_vis == VISIBILITY_ANON + || (CLASS_TYPE_P (underlying_type) + && CLASSTYPE_VISIBILITY_SPECIFIED (underlying_type))) + constrain_visibility (decl, underlying_vis); + else + DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; + } + else if (TREE_CODE (decl) == VAR_DECL && DECL_TINFO_P (decl)) + { + /* tinfo visibility is based on the type it's for. */ + constrain_visibility + (decl, type_visibility (TREE_TYPE (DECL_NAME (decl)))); + + /* Give the target a chance to override the visibility associated + with DECL. */ + if (TREE_PUBLIC (decl) + && !DECL_REALLY_EXTERN (decl) + && CLASS_TYPE_P (TREE_TYPE (DECL_NAME (decl))) + && !CLASSTYPE_VISIBILITY_SPECIFIED (TREE_TYPE (DECL_NAME (decl)))) + targetm.cxx.determine_class_data_visibility (decl); + } + else if (use_template) + /* Template instantiations and specializations get visibility based + on their template unless they override it with an attribute. */; + else if (! DECL_VISIBILITY_SPECIFIED (decl)) + { + /* Set default visibility to whatever the user supplied with + #pragma GCC visibility or a namespace visibility attribute. */ + DECL_VISIBILITY (decl) = default_visibility; + DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma; + } + } + + if (use_template) + { + /* If the specialization doesn't specify visibility, use the + visibility from the template. */ + tree tinfo = (TREE_CODE (decl) == TYPE_DECL + ? TYPE_TEMPLATE_INFO (TREE_TYPE (decl)) + : DECL_TEMPLATE_INFO (decl)); + tree args = TI_ARGS (tinfo); + + if (args != error_mark_node) + { + int depth = TMPL_ARGS_DEPTH (args); + tree pattern = DECL_TEMPLATE_RESULT (TI_TEMPLATE (tinfo)); + + if (!DECL_VISIBILITY_SPECIFIED (decl)) + { + DECL_VISIBILITY (decl) = DECL_VISIBILITY (pattern); + DECL_VISIBILITY_SPECIFIED (decl) + = DECL_VISIBILITY_SPECIFIED (pattern); + } + + /* FIXME should TMPL_ARGS_DEPTH really return 1 for null input? */ + if (args && depth > template_class_depth (class_type)) + /* Limit visibility based on its template arguments. */ + constrain_visibility_for_template (decl, args); + } + } + + if (class_type) + determine_visibility_from_class (decl, class_type); + + if (decl_anon_ns_mem_p (decl)) + /* Names in an anonymous namespace get internal linkage. + This might change once we implement export. */ + constrain_visibility (decl, VISIBILITY_ANON); + else if (TREE_CODE (decl) != TYPE_DECL) + { + /* Propagate anonymity from type to decl. */ + int tvis = type_visibility (TREE_TYPE (decl)); + if (tvis == VISIBILITY_ANON + || ! DECL_VISIBILITY_SPECIFIED (decl)) + constrain_visibility (decl, tvis); + } + else if (no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/true)) + /* DR 757: A type without linkage shall not be used as the type of a + variable or function with linkage, unless + o the variable or function has extern "C" linkage (7.5 [dcl.link]), or + o the variable or function is not used (3.2 [basic.def.odr]) or is + defined in the same translation unit. + + Since non-extern "C" decls need to be defined in the same + translation unit, we can make the type internal. */ + constrain_visibility (decl, VISIBILITY_ANON); + + /* If visibility changed and DECL already has DECL_RTL, ensure + symbol flags are updated. */ + if ((DECL_VISIBILITY (decl) != orig_visibility + || DECL_VISIBILITY_SPECIFIED (decl) != orig_visibility_specified) + && ((TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) + || TREE_CODE (decl) == FUNCTION_DECL) + && DECL_RTL_SET_P (decl)) + make_decl_rtl (decl); +} + +/* By default, static data members and function members receive + the visibility of their containing class. */ + +static void +determine_visibility_from_class (tree decl, tree class_type) +{ + if (DECL_VISIBILITY_SPECIFIED (decl)) + return; + + if (visibility_options.inlines_hidden + /* Don't do this for inline templates; specializations might not be + inline, and we don't want them to inherit the hidden + visibility. We'll set it here for all inline instantiations. */ + && !processing_template_decl + && TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl) + && (! DECL_LANG_SPECIFIC (decl) + || ! DECL_EXPLICIT_INSTANTIATION (decl))) + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + else + { + /* Default to the class visibility. */ + DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type); + DECL_VISIBILITY_SPECIFIED (decl) + = CLASSTYPE_VISIBILITY_SPECIFIED (class_type); + } + + /* Give the target a chance to override the visibility associated + with DECL. */ + if (TREE_CODE (decl) == VAR_DECL + && (DECL_TINFO_P (decl) + || (DECL_VTABLE_OR_VTT_P (decl) + /* Construction virtual tables are not exported because + they cannot be referred to from other object files; + their name is not standardized by the ABI. */ + && !DECL_CONSTRUCTION_VTABLE_P (decl))) + && TREE_PUBLIC (decl) + && !DECL_REALLY_EXTERN (decl) + && !CLASSTYPE_VISIBILITY_SPECIFIED (class_type)) + targetm.cxx.determine_class_data_visibility (decl); +} + +/* Constrain the visibility of a class TYPE based on the visibility of its + field types. Warn if any fields require lesser visibility. */ + +void +constrain_class_visibility (tree type) +{ + tree binfo; + tree t; + int i; + + int vis = type_visibility (type); + + if (vis == VISIBILITY_ANON + || DECL_IN_SYSTEM_HEADER (TYPE_MAIN_DECL (type))) + return; + + /* Don't warn about visibility if the class has explicit visibility. */ + if (CLASSTYPE_VISIBILITY_SPECIFIED (type)) + vis = VISIBILITY_INTERNAL; + + for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t)) + if (TREE_CODE (t) == FIELD_DECL && TREE_TYPE (t) != error_mark_node) + { + tree ftype = strip_pointer_or_array_types (TREE_TYPE (t)); + int subvis = type_visibility (ftype); + + if (subvis == VISIBILITY_ANON) + { + if (!in_main_input_context ()) + warning (0, "\ +%qT has a field %qD whose type uses the anonymous namespace", + type, t); + } + else if (MAYBE_CLASS_TYPE_P (ftype) + && vis < VISIBILITY_HIDDEN + && subvis >= VISIBILITY_HIDDEN) + warning (OPT_Wattributes, "\ +%qT declared with greater visibility than the type of its field %qD", + type, t); + } + + binfo = TYPE_BINFO (type); + for (i = 0; BINFO_BASE_ITERATE (binfo, i, t); ++i) + { + int subvis = type_visibility (TREE_TYPE (t)); + + if (subvis == VISIBILITY_ANON) + { + if (!in_main_input_context()) + warning (0, "\ +%qT has a base %qT whose type uses the anonymous namespace", + type, TREE_TYPE (t)); + } + else if (vis < VISIBILITY_HIDDEN + && subvis >= VISIBILITY_HIDDEN) + warning (OPT_Wattributes, "\ +%qT declared with greater visibility than its base %qT", + type, TREE_TYPE (t)); + } +} + +/* DECL is a FUNCTION_DECL or VAR_DECL. If the object file linkage + for DECL has not already been determined, do so now by setting + DECL_EXTERNAL, DECL_COMDAT and other related flags. Until this + function is called entities with vague linkage whose definitions + are available must have TREE_PUBLIC set. + + If this function decides to place DECL in COMDAT, it will set + appropriate flags -- but will not clear DECL_EXTERNAL. It is up to + the caller to decide whether or not to clear DECL_EXTERNAL. Some + callers defer that decision until it is clear that DECL is actually + required. */ + +void +import_export_decl (tree decl) +{ + int emit_p; + bool comdat_p; + bool import_p; + tree class_type = NULL_TREE; + + if (DECL_INTERFACE_KNOWN (decl)) + return; + + /* We cannot determine what linkage to give to an entity with vague + linkage until the end of the file. For example, a virtual table + for a class will be defined if and only if the key method is + defined in this translation unit. As a further example, consider + that when compiling a translation unit that uses PCH file with + "-frepo" it would be incorrect to make decisions about what + entities to emit when building the PCH; those decisions must be + delayed until the repository information has been processed. */ + gcc_assert (at_eof); + /* Object file linkage for explicit instantiations is handled in + mark_decl_instantiated. For static variables in functions with + vague linkage, maybe_commonize_var is used. + + Therefore, the only declarations that should be provided to this + function are those with external linkage that are: + + * implicit instantiations of function templates + + * inline function + + * implicit instantiations of static data members of class + templates + + * virtual tables + + * typeinfo objects + + Furthermore, all entities that reach this point must have a + definition available in this translation unit. + + The following assertions check these conditions. */ + gcc_assert (TREE_CODE (decl) == FUNCTION_DECL + || TREE_CODE (decl) == VAR_DECL); + /* Any code that creates entities with TREE_PUBLIC cleared should + also set DECL_INTERFACE_KNOWN. */ + gcc_assert (TREE_PUBLIC (decl)); + if (TREE_CODE (decl) == FUNCTION_DECL) + gcc_assert (DECL_IMPLICIT_INSTANTIATION (decl) + || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl) + || DECL_DECLARED_INLINE_P (decl)); + else + gcc_assert (DECL_IMPLICIT_INSTANTIATION (decl) + || DECL_VTABLE_OR_VTT_P (decl) + || DECL_TINFO_P (decl)); + /* Check that a definition of DECL is available in this translation + unit. */ + gcc_assert (!DECL_REALLY_EXTERN (decl)); + + /* Assume that DECL will not have COMDAT linkage. */ + comdat_p = false; + /* Assume that DECL will not be imported into this translation + unit. */ + import_p = false; + + /* See if the repository tells us whether or not to emit DECL in + this translation unit. */ + emit_p = repo_emit_p (decl); + if (emit_p == 0) + import_p = true; + else if (emit_p == 1) + { + /* The repository indicates that this entity should be defined + here. Make sure the back end honors that request. */ + if (TREE_CODE (decl) == VAR_DECL) + mark_needed (decl); + else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl) + || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl)) + { + tree clone; + FOR_EACH_CLONE (clone, decl) + mark_needed (clone); + } + else + mark_needed (decl); + /* Output the definition as an ordinary strong definition. */ + DECL_EXTERNAL (decl) = 0; + DECL_INTERFACE_KNOWN (decl) = 1; + return; + } + + if (import_p) + /* We have already decided what to do with this DECL; there is no + need to check anything further. */ + ; + else if (TREE_CODE (decl) == VAR_DECL && DECL_VTABLE_OR_VTT_P (decl)) + { + class_type = DECL_CONTEXT (decl); + import_export_class (class_type); + if (TYPE_FOR_JAVA (class_type)) + import_p = true; + else if (CLASSTYPE_INTERFACE_KNOWN (class_type) + && CLASSTYPE_INTERFACE_ONLY (class_type)) + import_p = true; + else if ((!flag_weak || TARGET_WEAK_NOT_IN_ARCHIVE_TOC) + && !CLASSTYPE_USE_TEMPLATE (class_type) + && CLASSTYPE_KEY_METHOD (class_type) + && !DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (class_type))) + /* The ABI requires that all virtual tables be emitted with + COMDAT linkage. However, on systems where COMDAT symbols + don't show up in the table of contents for a static + archive, or on systems without weak symbols (where we + approximate COMDAT linkage by using internal linkage), the + linker will report errors about undefined symbols because + it will not see the virtual table definition. Therefore, + in the case that we know that the virtual table will be + emitted in only one translation unit, we make the virtual + table an ordinary definition with external linkage. */ + DECL_EXTERNAL (decl) = 0; + else if (CLASSTYPE_INTERFACE_KNOWN (class_type)) + { + /* CLASS_TYPE is being exported from this translation unit, + so DECL should be defined here. */ + if (!flag_weak && CLASSTYPE_EXPLICIT_INSTANTIATION (class_type)) + /* If a class is declared in a header with the "extern + template" extension, then it will not be instantiated, + even in translation units that would normally require + it. Often such classes are explicitly instantiated in + one translation unit. Therefore, the explicit + instantiation must be made visible to other translation + units. */ + DECL_EXTERNAL (decl) = 0; + else + { + /* The generic C++ ABI says that class data is always + COMDAT, even if there is a key function. Some + variants (e.g., the ARM EABI) says that class data + only has COMDAT linkage if the class data might be + emitted in more than one translation unit. When the + key method can be inline and is inline, we still have + to arrange for comdat even though + class_data_always_comdat is false. */ + if (!CLASSTYPE_KEY_METHOD (class_type) + || DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (class_type)) + || targetm.cxx.class_data_always_comdat ()) + { + /* The ABI requires COMDAT linkage. Normally, we + only emit COMDAT things when they are needed; + make sure that we realize that this entity is + indeed needed. */ + comdat_p = true; + mark_needed (decl); + } + } + } + else if (!flag_implicit_templates + && CLASSTYPE_IMPLICIT_INSTANTIATION (class_type)) + import_p = true; + else + comdat_p = true; + } + else if (TREE_CODE (decl) == VAR_DECL && DECL_TINFO_P (decl)) + { + tree type = TREE_TYPE (DECL_NAME (decl)); + if (CLASS_TYPE_P (type)) + { + class_type = type; + import_export_class (type); + if (CLASSTYPE_INTERFACE_KNOWN (type) + && TYPE_POLYMORPHIC_P (type) + && CLASSTYPE_INTERFACE_ONLY (type) + /* If -fno-rtti was specified, then we cannot be sure + that RTTI information will be emitted with the + virtual table of the class, so we must emit it + wherever it is used. */ + && flag_rtti) + import_p = true; + else + { + if (CLASSTYPE_INTERFACE_KNOWN (type) + && !CLASSTYPE_INTERFACE_ONLY (type)) + { + comdat_p = (targetm.cxx.class_data_always_comdat () + || (CLASSTYPE_KEY_METHOD (type) + && DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (type)))); + mark_needed (decl); + if (!flag_weak) + { + comdat_p = false; + DECL_EXTERNAL (decl) = 0; + } + } + else + comdat_p = true; + } + } + else + comdat_p = true; + } + else if (DECL_TEMPLATE_INSTANTIATION (decl) + || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) + { + /* DECL is an implicit instantiation of a function or static + data member. */ + if ((flag_implicit_templates + && !flag_use_repository) + || (flag_implicit_inline_templates + && TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl))) + comdat_p = true; + else + /* If we are not implicitly generating templates, then mark + this entity as undefined in this translation unit. */ + import_p = true; + } + else if (DECL_FUNCTION_MEMBER_P (decl)) + { + if (!DECL_DECLARED_INLINE_P (decl)) + { + tree ctype = DECL_CONTEXT (decl); + import_export_class (ctype); + if (CLASSTYPE_INTERFACE_KNOWN (ctype)) + { + DECL_NOT_REALLY_EXTERN (decl) + = ! (CLASSTYPE_INTERFACE_ONLY (ctype) + || (DECL_DECLARED_INLINE_P (decl) + && ! flag_implement_inlines + && !DECL_VINDEX (decl))); + + if (!DECL_NOT_REALLY_EXTERN (decl)) + DECL_EXTERNAL (decl) = 1; + + /* Always make artificials weak. */ + if (DECL_ARTIFICIAL (decl) && flag_weak) + comdat_p = true; + else + maybe_make_one_only (decl); + } + } + else + comdat_p = true; + } + else + comdat_p = true; + + if (import_p) + { + /* If we are importing DECL into this translation unit, mark is + an undefined here. */ + DECL_EXTERNAL (decl) = 1; + DECL_NOT_REALLY_EXTERN (decl) = 0; + } + else if (comdat_p) + { + /* If we decided to put DECL in COMDAT, mark it accordingly at + this point. */ + comdat_linkage (decl); + } + + DECL_INTERFACE_KNOWN (decl) = 1; +} + +/* Return an expression that performs the destruction of DECL, which + must be a VAR_DECL whose type has a non-trivial destructor, or is + an array whose (innermost) elements have a non-trivial destructor. */ + +tree +build_cleanup (tree decl) +{ + tree temp; + tree type = TREE_TYPE (decl); + + /* This function should only be called for declarations that really + require cleanups. */ + gcc_assert (!TYPE_HAS_TRIVIAL_DESTRUCTOR (type)); + + /* Treat all objects with destructors as used; the destructor may do + something substantive. */ + mark_used (decl); + + if (TREE_CODE (type) == ARRAY_TYPE) + temp = decl; + else + temp = build_address (decl); + temp = build_delete (TREE_TYPE (temp), temp, + sfk_complete_destructor, + LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0); + return temp; +} + +/* Returns the initialization guard variable for the variable DECL, + which has static storage duration. */ + +tree +get_guard (tree decl) +{ + tree sname; + tree guard; + + sname = mangle_guard_variable (decl); + guard = IDENTIFIER_GLOBAL_VALUE (sname); + if (! guard) + { + tree guard_type; + + /* We use a type that is big enough to contain a mutex as well + as an integer counter. */ + guard_type = targetm.cxx.guard_type (); + guard = build_decl (DECL_SOURCE_LOCATION (decl), + VAR_DECL, sname, guard_type); + + /* The guard should have the same linkage as what it guards. */ + TREE_PUBLIC (guard) = TREE_PUBLIC (decl); + TREE_STATIC (guard) = TREE_STATIC (decl); + DECL_COMMON (guard) = DECL_COMMON (decl); + DECL_COMDAT (guard) = DECL_COMDAT (decl); + if (DECL_ONE_ONLY (decl)) + make_decl_one_only (guard, cxx_comdat_group (guard)); + if (TREE_PUBLIC (decl)) + DECL_WEAK (guard) = DECL_WEAK (decl); + DECL_VISIBILITY (guard) = DECL_VISIBILITY (decl); + DECL_VISIBILITY_SPECIFIED (guard) = DECL_VISIBILITY_SPECIFIED (decl); + + DECL_ARTIFICIAL (guard) = 1; + DECL_IGNORED_P (guard) = 1; + TREE_USED (guard) = 1; + pushdecl_top_level_and_finish (guard, NULL_TREE); + } + return guard; +} + +/* Return those bits of the GUARD variable that should be set when the + guarded entity is actually initialized. */ + +static tree +get_guard_bits (tree guard) +{ + if (!targetm.cxx.guard_mask_bit ()) + { + /* We only set the first byte of the guard, in order to leave room + for a mutex in the high-order bits. */ + guard = build1 (ADDR_EXPR, + build_pointer_type (TREE_TYPE (guard)), + guard); + guard = build1 (NOP_EXPR, + build_pointer_type (char_type_node), + guard); + guard = build1 (INDIRECT_REF, char_type_node, guard); + } + + return guard; +} + +/* Return an expression which determines whether or not the GUARD + variable has already been initialized. */ + +tree +get_guard_cond (tree guard) +{ + tree guard_value; + + /* Check to see if the GUARD is zero. */ + guard = get_guard_bits (guard); + + /* Mask off all but the low bit. */ + if (targetm.cxx.guard_mask_bit ()) + { + guard_value = integer_one_node; + if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard))) + guard_value = convert (TREE_TYPE (guard), guard_value); + guard = cp_build_binary_op (input_location, + BIT_AND_EXPR, guard, guard_value, + tf_warning_or_error); + } + + guard_value = integer_zero_node; + if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard))) + guard_value = convert (TREE_TYPE (guard), guard_value); + return cp_build_binary_op (input_location, + EQ_EXPR, guard, guard_value, + tf_warning_or_error); +} + +/* Return an expression which sets the GUARD variable, indicating that + the variable being guarded has been initialized. */ + +tree +set_guard (tree guard) +{ + tree guard_init; + + /* Set the GUARD to one. */ + guard = get_guard_bits (guard); + guard_init = integer_one_node; + if (!same_type_p (TREE_TYPE (guard_init), TREE_TYPE (guard))) + guard_init = convert (TREE_TYPE (guard), guard_init); + return cp_build_modify_expr (guard, NOP_EXPR, guard_init, + tf_warning_or_error); +} + +/* Start the process of running a particular set of global constructors + or destructors. Subroutine of do_[cd]tors. */ + +static tree +start_objects (int method_type, int initp) +{ + tree body; + tree fndecl; + char type[14]; + + /* Make ctor or dtor function. METHOD_TYPE may be 'I' or 'D'. */ + + if (initp != DEFAULT_INIT_PRIORITY) + { + char joiner; + +#ifdef JOINER + joiner = JOINER; +#else + joiner = '_'; +#endif + + sprintf (type, "sub_%c%c%.5u", method_type, joiner, initp); + } + else + sprintf (type, "sub_%c", method_type); + + fndecl = build_lang_decl (FUNCTION_DECL, + get_file_function_name (type), + build_function_type_list (void_type_node, + NULL_TREE)); + start_preparsed_function (fndecl, /*attrs=*/NULL_TREE, SF_PRE_PARSED); + + TREE_PUBLIC (current_function_decl) = 0; + + /* Mark as artificial because it's not explicitly in the user's + source code. */ + DECL_ARTIFICIAL (current_function_decl) = 1; + + /* Mark this declaration as used to avoid spurious warnings. */ + TREE_USED (current_function_decl) = 1; + + /* Mark this function as a global constructor or destructor. */ + if (method_type == 'I') + DECL_GLOBAL_CTOR_P (current_function_decl) = 1; + else + DECL_GLOBAL_DTOR_P (current_function_decl) = 1; + + body = begin_compound_stmt (BCS_FN_BODY); + + return body; +} + +/* Finish the process of running a particular set of global constructors + 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); + + if (method_type == 'I') + { + DECL_STATIC_CONSTRUCTOR (fn) = 1; + decl_init_priority_insert (fn, initp); + } + else + { + DECL_STATIC_DESTRUCTOR (fn) = 1; + decl_fini_priority_insert (fn, initp); + } + + expand_or_defer_fn (fn); +} + +/* The names of the parameters to the function created to handle + initializations and destructions for objects with static storage + duration. */ +#define INITIALIZE_P_IDENTIFIER "__initialize_p" +#define PRIORITY_IDENTIFIER "__priority" + +/* The name of the function we create to handle initializations and + destructions for objects with static storage duration. */ +#define SSDF_IDENTIFIER "__static_initialization_and_destruction" + +/* The declaration for the __INITIALIZE_P argument. */ +static GTY(()) tree initialize_p_decl; + +/* The declaration for the __PRIORITY argument. */ +static GTY(()) tree priority_decl; + +/* The declaration for the static storage duration function. */ +static GTY(()) tree ssdf_decl; + +/* All the static storage duration functions created in this + translation unit. */ +static GTY(()) VEC(tree,gc) *ssdf_decls; + +/* A map from priority levels to information about that priority + level. There may be many such levels, so efficient lookup is + important. */ +static splay_tree priority_info_map; + +/* Begins the generation of the function that will handle all + initialization and destruction of objects with static storage + duration. The function generated takes two parameters of type + `int': __INITIALIZE_P and __PRIORITY. If __INITIALIZE_P is + nonzero, it performs initializations. Otherwise, it performs + destructions. It only performs those initializations or + destructions with the indicated __PRIORITY. The generated function + returns no value. + + It is assumed that this function will only be called once per + translation unit. */ + +static tree +start_static_storage_duration_function (unsigned count) +{ + tree type; + tree body; + char id[sizeof (SSDF_IDENTIFIER) + 1 /* '\0' */ + 32]; + + /* Create the identifier for this function. It will be of the form + SSDF_IDENTIFIER_. */ + sprintf (id, "%s_%u", SSDF_IDENTIFIER, count); + + type = build_function_type_list (void_type_node, + integer_type_node, integer_type_node, + NULL_TREE); + + /* Create the FUNCTION_DECL itself. */ + ssdf_decl = build_lang_decl (FUNCTION_DECL, + get_identifier (id), + type); + TREE_PUBLIC (ssdf_decl) = 0; + DECL_ARTIFICIAL (ssdf_decl) = 1; + + /* Put this function in the list of functions to be called from the + static constructors and destructors. */ + if (!ssdf_decls) + { + ssdf_decls = VEC_alloc (tree, gc, 32); + + /* Take this opportunity to initialize the map from priority + numbers to information about that priority level. */ + priority_info_map = splay_tree_new (splay_tree_compare_ints, + /*delete_key_fn=*/0, + /*delete_value_fn=*/ + (splay_tree_delete_value_fn) &free); + + /* We always need to generate functions for the + DEFAULT_INIT_PRIORITY so enter it now. That way when we walk + priorities later, we'll be sure to find the + DEFAULT_INIT_PRIORITY. */ + get_priority_info (DEFAULT_INIT_PRIORITY); + } + + VEC_safe_push (tree, gc, ssdf_decls, ssdf_decl); + + /* Create the argument list. */ + initialize_p_decl = cp_build_parm_decl + (get_identifier (INITIALIZE_P_IDENTIFIER), integer_type_node); + DECL_CONTEXT (initialize_p_decl) = ssdf_decl; + TREE_USED (initialize_p_decl) = 1; + priority_decl = cp_build_parm_decl + (get_identifier (PRIORITY_IDENTIFIER), integer_type_node); + DECL_CONTEXT (priority_decl) = ssdf_decl; + TREE_USED (priority_decl) = 1; + + DECL_CHAIN (initialize_p_decl) = priority_decl; + DECL_ARGUMENTS (ssdf_decl) = initialize_p_decl; + + /* 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); + + It is static because we only need to call this function from the + various constructor and destructor functions for this module. */ + start_preparsed_function (ssdf_decl, + /*attrs=*/NULL_TREE, + SF_PRE_PARSED); + + /* Set up the scope of the outermost block in the function. */ + body = begin_compound_stmt (BCS_FN_BODY); + + return body; +} + +/* Finish the generation of the function which performs initialization + and destruction of objects with static storage duration. After + 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 + code to handle this level has yet been generated, generate the + appropriate prologue. */ + +static priority_info +get_priority_info (int priority) +{ + priority_info pi; + splay_tree_node n; + + n = splay_tree_lookup (priority_info_map, + (splay_tree_key) priority); + if (!n) + { + /* Create a new priority information structure, and insert it + into the map. */ + pi = XNEW (struct priority_info_s); + pi->initializations_p = 0; + pi->destructions_p = 0; + splay_tree_insert (priority_info_map, + (splay_tree_key) priority, + (splay_tree_value) pi); + } + else + pi = (priority_info) n->value; + + return pi; +} + +/* The effective initialization priority of a DECL. */ + +#define DECL_EFFECTIVE_INIT_PRIORITY(decl) \ + ((!DECL_HAS_INIT_PRIORITY_P (decl) || DECL_INIT_PRIORITY (decl) == 0) \ + ? DEFAULT_INIT_PRIORITY : DECL_INIT_PRIORITY (decl)) + +/* Whether a DECL needs a guard to protect it against multiple + initialization. */ + +#define NEEDS_GUARD_P(decl) (TREE_PUBLIC (decl) && (DECL_COMMON (decl) \ + || DECL_ONE_ONLY (decl) \ + || DECL_WEAK (decl))) + +/* Called from one_static_initialization_or_destruction(), + via walk_tree. + Walks the initializer list of a global variable and looks for + temporary variables (DECL_NAME() == NULL and DECL_ARTIFICIAL != 0) + and that have their DECL_CONTEXT() == NULL. + For each such temporary variable, set their DECL_CONTEXT() to + the current function. This is necessary because otherwise + some optimizers (enabled by -O2 -fprofile-arcs) might crash + when trying to refer to a temporary variable that does not have + it's DECL_CONTECT() properly set. */ +static tree +fix_temporary_vars_context_r (tree *node, + int *unused ATTRIBUTE_UNUSED, + void *unused1 ATTRIBUTE_UNUSED) +{ + gcc_assert (current_function_decl); + + if (TREE_CODE (*node) == BIND_EXPR) + { + tree var; + + for (var = BIND_EXPR_VARS (*node); var; var = DECL_CHAIN (var)) + if (TREE_CODE (var) == VAR_DECL + && !DECL_NAME (var) + && DECL_ARTIFICIAL (var) + && !DECL_CONTEXT (var)) + DECL_CONTEXT (var) = current_function_decl; + } + + return NULL_TREE; +} + +/* Set up to handle the initialization or destruction of DECL. If + INITP is nonzero, we are initializing the variable. Otherwise, we + are destroying it. */ + +static void +one_static_initialization_or_destruction (tree decl, tree init, bool initp) +{ + tree guard_if_stmt = NULL_TREE; + tree guard; + + /* If we are supposed to destruct and there's a trivial destructor, + nothing has to be done. */ + if (!initp + && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) + return; + + /* Trick the compiler into thinking we are at the file and line + 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); + + /* Make sure temporary variables in the initialiser all have + their DECL_CONTEXT() set to a value different from NULL_TREE. + This can happen when global variables initialisers are built. + In that case, the DECL_CONTEXT() of the global variables _AND_ of all + the temporary variables that might have been generated in the + accompagning initialisers is NULL_TREE, meaning the variables have been + declared in the global namespace. + What we want to do here is to fix that and make sure the DECL_CONTEXT() + of the temporaries are set to the current function decl. */ + cp_walk_tree_without_duplicates (&init, + fix_temporary_vars_context_r, + NULL); + + /* Because of: + + [class.access.spec] + + Access control for implicit calls to the constructors, + the conversion functions, or the destructor called to + create and destroy a static data member is performed as + if these calls appeared in the scope of the member's + class. + + we pretend we are in a static member function of the class of + which the DECL is a member. */ + if (member_p (decl)) + { + DECL_CONTEXT (current_function_decl) = DECL_CONTEXT (decl); + DECL_STATIC_FUNCTION_P (current_function_decl) = 1; + } + + /* Assume we don't need a guard. */ + guard = NULL_TREE; + /* We need a guard if this is an object with external linkage that + might be initialized in more than one place. (For example, a + static data member of a template, when the data member requires + construction.) */ + if (NEEDS_GUARD_P (decl)) + { + tree guard_cond; + + guard = get_guard (decl); + + /* When using __cxa_atexit, we just check the GUARD as we would + for a local static. */ + if (flag_use_cxa_atexit) + { + /* When using __cxa_atexit, we never try to destroy + anything from a static destructor. */ + gcc_assert (initp); + guard_cond = get_guard_cond (guard); + } + /* If we don't have __cxa_atexit, then we will be running + destructors from .fini sections, or their equivalents. So, + we need to know how many times we've tried to initialize this + object. We do initializations only if the GUARD is zero, + i.e., if we are the first to initialize the variable. We do + destructions only if the GUARD is one, i.e., if we are the + last to destroy the variable. */ + else if (initp) + guard_cond + = cp_build_binary_op (input_location, + EQ_EXPR, + cp_build_unary_op (PREINCREMENT_EXPR, + guard, + /*noconvert=*/1, + tf_warning_or_error), + integer_one_node, + tf_warning_or_error); + else + guard_cond + = cp_build_binary_op (input_location, + EQ_EXPR, + cp_build_unary_op (PREDECREMENT_EXPR, + guard, + /*noconvert=*/1, + tf_warning_or_error), + integer_zero_node, + tf_warning_or_error); + + guard_if_stmt = begin_if_stmt (); + finish_if_stmt_cond (guard_cond, guard_if_stmt); + } + + + /* If we're using __cxa_atexit, we have not already set the GUARD, + so we must do so now. */ + if (guard && initp && flag_use_cxa_atexit) + finish_expr_stmt (set_guard (guard)); + + /* Perform the initialization or destruction. */ + if (initp) + { + if (init) + finish_expr_stmt (init); + + /* If we're using __cxa_atexit, register a function that calls the + destructor for the object. */ + if (flag_use_cxa_atexit) + finish_expr_stmt (register_dtor_fn (decl)); + } + else + finish_expr_stmt (build_cleanup (decl)); + + /* Finish the guard if-stmt, if necessary. */ + if (guard) + { + finish_then_clause (guard_if_stmt); + finish_if_stmt (guard_if_stmt); + } + + /* Now that we're done with DECL we don't need to pretend to be a + member of its class any longer. */ + DECL_CONTEXT (current_function_decl) = NULL_TREE; + DECL_STATIC_FUNCTION_P (current_function_decl) = 0; +} + +/* Generate code to do the initialization or destruction of the decls in VARS, + a TREE_LIST of VAR_DECL with static storage duration. + Whether initialization or destruction is performed is specified by INITP. */ + +static void +do_static_initialization_or_destruction (tree vars, bool initp) +{ + tree node, init_if_stmt, cond; + + /* Build the outer if-stmt to check for initialization or destruction. */ + init_if_stmt = begin_if_stmt (); + cond = initp ? integer_one_node : integer_zero_node; + cond = cp_build_binary_op (input_location, + EQ_EXPR, + initialize_p_decl, + cond, + tf_warning_or_error); + finish_if_stmt_cond (cond, init_if_stmt); + + node = vars; + do { + tree decl = TREE_VALUE (node); + tree priority_if_stmt; + int priority; + priority_info pi; + + /* If we don't need a destructor, there's nothing to do. Avoid + creating a possibly empty if-stmt. */ + if (!initp && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl))) + { + node = TREE_CHAIN (node); + continue; + } + + /* Remember that we had an initialization or finalization at this + priority. */ + priority = DECL_EFFECTIVE_INIT_PRIORITY (decl); + pi = get_priority_info (priority); + if (initp) + pi->initializations_p = 1; + else + pi->destructions_p = 1; + + /* Conditionalize this initialization on being in the right priority + and being initializing/finalizing appropriately. */ + priority_if_stmt = begin_if_stmt (); + cond = cp_build_binary_op (input_location, + EQ_EXPR, + priority_decl, + build_int_cst (NULL_TREE, priority), + tf_warning_or_error); + finish_if_stmt_cond (cond, priority_if_stmt); + + /* Process initializers with same priority. */ + for (; node + && DECL_EFFECTIVE_INIT_PRIORITY (TREE_VALUE (node)) == priority; + node = TREE_CHAIN (node)) + /* Do one initialization or destruction. */ + one_static_initialization_or_destruction (TREE_VALUE (node), + TREE_PURPOSE (node), initp); + + /* Finish up the priority if-stmt body. */ + finish_then_clause (priority_if_stmt); + finish_if_stmt (priority_if_stmt); + + } while (node); + + /* Finish up the init/destruct if-stmt body. */ + finish_then_clause (init_if_stmt); + finish_if_stmt (init_if_stmt); +} + +/* VARS is a list of variables with static storage duration which may + need initialization and/or finalization. Remove those variables + that don't really need to be initialized or finalized, and return + the resulting list. The order in which the variables appear in + VARS is in reverse order of the order in which they should actually + be initialized. The list we return is in the unreversed order; + 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; + + while (*var) + { + tree t = *var; + tree decl = TREE_VALUE (t); + tree init = TREE_PURPOSE (t); + + /* Deal gracefully with error. */ + if (decl == error_mark_node) + { + var = &TREE_CHAIN (t); + continue; + } + + /* The only things that can be initialized are variables. */ + gcc_assert (TREE_CODE (decl) == VAR_DECL); + + /* If this object is not defined, we don't need to do anything + here. */ + if (DECL_EXTERNAL (decl)) + { + var = &TREE_CHAIN (t); + continue; + } + + /* Also, if the initializer already contains errors, we can bail + out now. */ + if (init && TREE_CODE (init) == TREE_LIST + && value_member (error_mark_node, init)) + { + var = &TREE_CHAIN (t); + continue; + } + + /* This variable is going to need initialization and/or + finalization, so we add it to the list. */ + *var = TREE_CHAIN (t); + TREE_CHAIN (t) = result; + result = t; + } + + return result; +} + +/* Make sure we have told the back end about all the variables in + VARS. */ + +static void +write_out_vars (tree vars) +{ + tree v; + + for (v = vars; v; v = TREE_CHAIN (v)) + { + tree var = TREE_VALUE (v); + if (!var_finalized_p (var)) + { + import_export_decl (var); + rest_of_decl_compilation (var, 1, 1); + } + } +} + +/* Generate a static constructor (if CONSTRUCTOR_P) or destructor + (otherwise) that will initialize all global objects with static + 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 fndecl; + tree body; + size_t i; + + input_location = *locus; + /* ??? */ + /* Was: 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; + + /* For Objective-C++, we may need to initialize metadata found in this module. + This must be done _before_ any other static initializations. */ + if (c_dialect_objc () && (priority == DEFAULT_INIT_PRIORITY) + && constructor_p && objc_static_init_needed_p ()) + { + body = start_objects (function_key, priority); + objc_generate_static_init_call (NULL_TREE); + } + + /* Call the static storage duration function with appropriate + arguments. */ + FOR_EACH_VEC_ELT (tree, ssdf_decls, i, fndecl) + { + /* Calls to pure or const functions will expand to nothing. */ + if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE))) + { + tree call; + + if (! body) + body = start_objects (function_key, priority); + + call = cp_build_function_call_nary (fndecl, tf_warning_or_error, + build_int_cst (NULL_TREE, + constructor_p), + build_int_cst (NULL_TREE, + priority), + NULL_TREE); + finish_expr_stmt (call); + } + } + + /* 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 = (location_t *) data; + int priority = (int) n->key; + priority_info pi = (priority_info) n->value; + + /* Generate the functions themselves, but only if they are really + needed. */ + if (pi->initializations_p) + generate_ctor_or_dtor_function (/*constructor_p=*/true, priority, locus); + if (pi->destructions_p) + 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 front-end 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 t = *tp; + + switch (TREE_CODE (t)) + { + case PTRMEM_CST: + if (TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) + cgraph_mark_address_taken_node (cgraph_node (PTRMEM_CST_MEMBER (t))); + break; + case BASELINK: + if (TREE_CODE (BASELINK_FUNCTIONS (t)) == FUNCTION_DECL) + cgraph_mark_address_taken_node (cgraph_node (BASELINK_FUNCTIONS (t))); + break; + case VAR_DECL: + if (DECL_CONTEXT (t) + && flag_use_repository + && TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL) + /* If we need a static variable in a function, then we + need the containing function. */ + mark_decl_referenced (DECL_CONTEXT (t)); + break; + default: + break; + } + + return NULL; +} + +/* Java requires that we be able to reference a local address for a + method, and not be confused by PLT entries. If hidden aliases are + supported, collect and return all the functions for which we should + emit a hidden alias. */ + +static struct pointer_set_t * +collect_candidates_for_java_method_aliases (void) +{ + struct cgraph_node *node; + struct pointer_set_t *candidates = NULL; + +#ifndef HAVE_GAS_HIDDEN + return candidates; +#endif + + for (node = cgraph_nodes; node ; node = node->next) + { + tree fndecl = node->decl; + + if (DECL_CONTEXT (fndecl) + && TYPE_P (DECL_CONTEXT (fndecl)) + && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl)) + && TARGET_USE_LOCAL_THUNK_ALIAS_P (fndecl)) + { + if (candidates == NULL) + candidates = pointer_set_create (); + pointer_set_insert (candidates, fndecl); + } + } + + return candidates; +} + + +/* Java requires that we be able to reference a local address for a + method, and not be confused by PLT entries. If hidden aliases are + supported, emit one for each java function that we've emitted. + CANDIDATES is the set of FUNCTION_DECLs that were gathered + by collect_candidates_for_java_method_aliases. */ + +static void +build_java_method_aliases (struct pointer_set_t *candidates) +{ + struct cgraph_node *node; + +#ifndef HAVE_GAS_HIDDEN + return; +#endif + + for (node = cgraph_nodes; node ; node = node->next) + { + tree fndecl = node->decl; + + if (TREE_ASM_WRITTEN (fndecl) + && pointer_set_contains (candidates, fndecl)) + { + /* Mangle the name in a predictable way; we need to reference + this from a java compiled object file. */ + tree oid, nid, alias; + const char *oname; + char *nname; + + oid = DECL_ASSEMBLER_NAME (fndecl); + oname = IDENTIFIER_POINTER (oid); + gcc_assert (oname[0] == '_' && oname[1] == 'Z'); + nname = ACONCAT (("_ZGA", oname+2, NULL)); + nid = get_identifier (nname); + + alias = make_alias_for (fndecl, nid); + TREE_PUBLIC (alias) = 1; + DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN; + + assemble_alias (alias, oid); + } + } +} + +/* Return C++ property of T, based on given operation OP. */ + +static int +cpp_check (tree t, cpp_operation op) +{ + switch (op) + { + case IS_ABSTRACT: + return DECL_PURE_VIRTUAL_P (t); + case IS_CONSTRUCTOR: + return DECL_CONSTRUCTOR_P (t); + case IS_DESTRUCTOR: + return DECL_DESTRUCTOR_P (t); + case IS_COPY_CONSTRUCTOR: + return DECL_COPY_CONSTRUCTOR_P (t); + case IS_TEMPLATE: + return TREE_CODE (t) == TEMPLATE_DECL; + default: + return 0; + } +} + +/* Collect source file references recursively, starting from NAMESPC. */ + +static void +collect_source_refs (tree namespc) +{ + tree t; + + if (!namespc) + return; + + /* Iterate over names in this name space. */ + for (t = NAMESPACE_LEVEL (namespc)->names; t; t = TREE_CHAIN (t)) + if (!DECL_IS_BUILTIN (t) ) + collect_source_ref (DECL_SOURCE_FILE (t)); + + /* Dump siblings, if any */ + collect_source_refs (TREE_CHAIN (namespc)); + + /* Dump children, if any */ + collect_source_refs (NAMESPACE_LEVEL (namespc)->namespaces); +} + +/* Collect decls relevant to SOURCE_FILE from all namespaces recursively, + starting from NAMESPC. */ + +static void +collect_ada_namespace (tree namespc, const char *source_file) +{ + if (!namespc) + return; + + /* Collect decls from this namespace */ + collect_ada_nodes (NAMESPACE_LEVEL (namespc)->names, source_file); + + /* Collect siblings, if any */ + collect_ada_namespace (TREE_CHAIN (namespc), source_file); + + /* Collect children, if any */ + collect_ada_namespace (NAMESPACE_LEVEL (namespc)->namespaces, source_file); +} + +/* Returns true iff there is a definition available for variable or + function DECL. */ + +static bool +decl_defined_p (tree decl) +{ + if (TREE_CODE (decl) == FUNCTION_DECL) + return (DECL_INITIAL (decl) != NULL_TREE); + else + { + gcc_assert (TREE_CODE (decl) == VAR_DECL); + return !DECL_EXTERNAL (decl); + } +} + +/* Nonzero for a VAR_DECL whose value can be used in a constant expression. + + [expr.const] + + An integral constant-expression can only involve ... const + variables of integral or enumeration types initialized with + constant expressions ... + + C++0x also allows constexpr variables and temporaries initialized + with constant expressions. We handle the former here, but the latter + are just folded away in cxx_eval_constant_expression. + + The standard does not require that the expression be non-volatile. + G++ implements the proposed correction in DR 457. */ + +bool +decl_constant_var_p (tree decl) +{ + bool ret; + tree type = TREE_TYPE (decl); + if (TREE_CODE (decl) != VAR_DECL) + return false; + if (DECL_DECLARED_CONSTEXPR_P (decl) + || (CP_TYPE_CONST_NON_VOLATILE_P (type) + && INTEGRAL_OR_ENUMERATION_TYPE_P (type))) + { + /* We don't know if a template static data member is initialized with + a constant expression until we instantiate its initializer. Even + in the case of a constexpr variable, we can't treat it as a + constant until its initializer is complete in case it's used in + its own initializer. */ + mark_used (decl); + ret = DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl); + } + else + ret = false; + + return ret; +} + +/* Returns true if DECL could be a symbolic constant variable, depending on + its initializer. */ + +bool +decl_maybe_constant_var_p (tree decl) +{ + tree type = TREE_TYPE (decl); + if (TREE_CODE (decl) != VAR_DECL) + return false; + if (DECL_DECLARED_CONSTEXPR_P (decl)) + return true; + return (CP_TYPE_CONST_NON_VOLATILE_P (type) + && INTEGRAL_OR_ENUMERATION_TYPE_P (type)); +} + +/* Complain that DECL uses a type with no linkage but is never defined. */ + +static void +no_linkage_error (tree decl) +{ + tree t = no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false); + if (TYPE_ANONYMOUS_P (t)) + { + permerror (0, "%q+#D, declared using anonymous type, " + "is used but never defined", decl); + if (is_typedef_decl (TYPE_NAME (t))) + permerror (0, "%q+#D does not refer to the unqualified type, " + "so it is not used for linkage", TYPE_NAME (t)); + } + else + permerror (0, "%q+#D, declared using local type %qT, " + "is used but never defined", decl, t); +} + +/* Collect declarations from all namespaces relevant to SOURCE_FILE. */ + +static void +collect_all_refs (const char *source_file) +{ + collect_ada_namespace (global_namespace, source_file); +} + +/* This routine is called at the end of compilation. + 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 +cp_write_global_declarations (void) +{ + tree vars; + bool reconsider; + size_t i; + location_t locus; + unsigned ssdf_count = 0; + int retries = 0; + tree decl; + struct pointer_set_t *candidates; + + locus = input_location; + at_eof = 1; + + /* Bad parse errors. Just forget about it. */ + if (! global_bindings_p () || current_class_type + || !VEC_empty (tree,decl_namespace_list)) + return; + + if (pch_file) + c_common_write_pch (); + + /* Handle -fdump-ada-spec[-slim] */ + if (dump_enabled_p (TDI_ada)) + { + if (get_dump_file_info (TDI_ada)->flags & TDF_SLIM) + collect_source_ref (main_input_filename); + else + collect_source_refs (global_namespace); + + dump_ada_specs (collect_all_refs, cpp_check); + } + + /* FIXME - huh? was input_line -= 1;*/ + + /* We now have to write out all the stuff we put off writing out. + These include: + + o Template specializations that we have not yet instantiated, + but which are needed. + o Initialization and destruction for non-local objects with + static storage duration. (Local objects with static storage + duration are initialized when their scope is first entered, + and are cleaned up via atexit.) + o Virtual function tables. + + All of these may cause others to be needed. For example, + instantiating one function may cause another to be needed, and + generating the initializer for an object may cause templates to be + instantiated, etc., etc. */ + + timevar_push (TV_VARCONST); + + emit_support_tinfos (); + + do + { + tree t; + tree decl; + + reconsider = false; + + /* If there are templates that we've put off instantiating, do + them now. */ + instantiate_pending_templates (retries); + 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. New elements will be + appended, and we remove from the vector those that actually + get emitted. */ + for (i = VEC_length (tree, unemitted_tinfo_decls); + VEC_iterate (tree, unemitted_tinfo_decls, --i, t);) + if (emit_tinfo_decl (t)) + { + reconsider = true; + VEC_unordered_remove (tree, unemitted_tinfo_decls, i); + } + + /* The list of objects with static storage duration is built up + in reverse order. We clear STATIC_AGGREGATES so that any new + aggregates added during the initialization of these will be + initialized in the correct order when we next come around the + loop. */ + vars = prune_vars_needing_no_initialization (&static_aggregates); + + if (vars) + { + /* We need to start a new initialization function each time + through the loop. That's because we need to know which + vtables have been referenced, and TREE_SYMBOL_REFERENCED + isn't computed until a function is finished, and written + 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); + + /* First generate code to do all the initializations. */ + if (vars) + do_static_initialization_or_destruction (vars, /*initp=*/true); + + /* Then, generate code to do all the destructions. Do these + in reverse order so that the most recently constructed + variable is the first destroyed. If we're using + __cxa_atexit, then we don't need to do this; functions + were registered at initialization time to destroy the + local statics. */ + if (!flag_use_cxa_atexit && vars) + { + vars = nreverse (vars); + do_static_initialization_or_destruction (vars, /*initp=*/false); + } + else + vars = NULL_TREE; + + /* 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++; + /* ??? was: locus.line++; */ + } + + /* Go through the set of inline functions whose bodies have not + been emitted yet. If out-of-line copies of these functions + are required, emit them. */ + FOR_EACH_VEC_ELT (tree, deferred_fns, i, decl) + { + /* Does it need synthesizing? */ + if (DECL_DEFAULTED_FN (decl) && ! DECL_INITIAL (decl) + && (! DECL_REALLY_EXTERN (decl) || possibly_inlined_p (decl))) + { + /* Even though we're already at the top-level, we push + there again. That way, when we pop back a few lines + hence, all of our state is restored. Otherwise, + finish_function doesn't clean things up, and we end + up with CURRENT_FUNCTION_DECL set. */ + push_to_top_level (); + /* The decl's location will mark where it was first + needed. Save that so synthesize method can indicate + where it was needed from, in case of error */ + input_location = DECL_SOURCE_LOCATION (decl); + synthesize_method (decl); + pop_from_top_level (); + reconsider = true; + } + + if (!DECL_SAVED_TREE (decl)) + continue; + + /* 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 + stop lying when the functions are referenced, or if they + are not comdat since they need to be put out now. If + DECL_INTERFACE_KNOWN, then we have already set + DECL_EXTERNAL appropriately, so there's no need to check + again, and we do not want to clear DECL_EXTERNAL if a + previous call to import_export_decl set it. + + This is done in a separate for cycle, because if some + deferred function is contained in another deferred + function later in deferred_fns varray, + rest_of_compilation would skip this function and we + really cannot expand the same function twice. */ + import_export_decl (decl); + if (DECL_NOT_REALLY_EXTERN (decl) + && DECL_INITIAL (decl) + && decl_needed_p (decl)) + { + struct cgraph_node *node = cgraph_get_node (decl), *alias, *next; + + DECL_EXTERNAL (decl) = 0; + /* If we mark !DECL_EXTERNAL one of the same body aliases, + we need to mark all of them that way. */ + if (node && node->same_body) + { + DECL_EXTERNAL (node->decl) = 0; + for (alias = node->same_body; alias; alias = alias->next) + DECL_EXTERNAL (alias->decl) = 0; + } + /* If we mark !DECL_EXTERNAL one of the symbols in some comdat + group, we need to mark all symbols in the same comdat group + that way. */ + if (node->same_comdat_group) + for (next = node->same_comdat_group; + next != node; + next = next->same_comdat_group) + { + DECL_EXTERNAL (next->decl) = 0; + if (next->same_body) + { + for (alias = next->same_body; + alias; + alias = alias->next) + DECL_EXTERNAL (alias->decl) = 0; + } + } + } + + /* If we're going to need to write this function out, and + there's already a body for it, create RTL for it now. + (There might be no body if this is a method we haven't + gotten around to synthesizing yet.) */ + if (!DECL_EXTERNAL (decl) + && decl_needed_p (decl) + && !TREE_ASM_WRITTEN (decl) + && !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_EACH_VEC_ELT (tree, pending_statics, i, decl) + { + if (var_finalized_p (decl) || DECL_REALLY_EXTERN (decl) + /* Don't write it out if we haven't seen a definition. */ + || DECL_IN_AGGR_P (decl)) + continue; + import_export_decl (decl); + /* If this static data member is needed, provide it to the + back end. */ + if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl)) + DECL_EXTERNAL (decl) = 0; + } + if (VEC_length (tree, pending_statics) != 0 + && wrapup_global_declarations (VEC_address (tree, pending_statics), + VEC_length (tree, pending_statics))) + reconsider = true; + + retries++; + } + while (reconsider); + + /* All used inline functions must have a definition at this point. */ + FOR_EACH_VEC_ELT (tree, deferred_fns, i, decl) + { + if (/* Check online inline functions that were actually used. */ + DECL_ODR_USED (decl) && DECL_DECLARED_INLINE_P (decl) + /* If the definition actually was available here, then the + fact that the function was not defined merely represents + that for some reason (use of a template repository, + #pragma interface, etc.) we decided not to emit the + definition here. */ + && !DECL_INITIAL (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)) + { + warning (0, "inline function %q+D used but never defined", decl); + /* Avoid a duplicate warning from check_global_declaration_1. */ + TREE_NO_WARNING (decl) = 1; + } + } + + /* So must decls that use a type with no linkage. */ + FOR_EACH_VEC_ELT (tree, no_linkage_decls, i, decl) + if (!decl_defined_p (decl)) + no_linkage_error (decl); + + /* Then, do the Objective-C stuff. This is where all the + Objective-C module stuff gets generated (symtab, + class/protocol/selector lists etc). This must be done after C++ + templates, destructors etc. so that selectors used in C++ + templates are properly allocated. */ + if (c_dialect_objc ()) + objc_write_global_declarations (); + + /* We give C linkage to static constructors and destructors. */ + push_lang_context (lang_name_c); + + /* Generate initialization and destruction functions for all + priorities for which they are required. */ + if (priority_info_map) + splay_tree_foreach (priority_info_map, + generate_ctor_and_dtor_functions_for_priority, + /*data=*/&locus); + else if (c_dialect_objc () && objc_static_init_needed_p ()) + /* If this is obj-c++ and we need a static init, call + generate_ctor_or_dtor_function. */ + generate_ctor_or_dtor_function (/*constructor_p=*/true, + DEFAULT_INIT_PRIORITY, &locus); + + /* We're done with the splay-tree now. */ + if (priority_info_map) + splay_tree_delete (priority_info_map); + + /* Generate any missing aliases. */ + maybe_apply_pending_pragma_weaks (); + + /* We're done with static constructors, so we can go back to "C++" + linkage now. */ + pop_lang_context (); + + /* Collect candidates for Java hidden aliases. */ + candidates = collect_candidates_for_java_method_aliases (); + + cgraph_finalize_compilation_unit (); + + /* Now, issue warnings about static, but not defined, functions, + etc., and emit debugging information. */ + walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider); + if (VEC_length (tree, pending_statics) != 0) + { + check_global_declarations (VEC_address (tree, pending_statics), + VEC_length (tree, pending_statics)); + emit_debug_global_declarations (VEC_address (tree, pending_statics), + VEC_length (tree, pending_statics)); + } + + perform_deferred_noexcept_checks (); + + /* Generate hidden aliases for Java. */ + if (candidates) + { + build_java_method_aliases (candidates); + pointer_set_destroy (candidates); + } + + finish_repo (); + + /* The entire file is now complete. If requested, dump everything + to a file. */ + { + int flags; + FILE *stream = dump_begin (TDI_tu, &flags); + + if (stream) + { + dump_node (global_namespace, flags & ~TDF_SLIM, stream); + dump_end (TDI_tu, stream); + } + } + + timevar_pop (TV_VARCONST); + + if (flag_detailed_statistics) + { + dump_tree_statistics (); + dump_time_statistics (); + } + input_location = locus; + +#ifdef ENABLE_CHECKING + validate_conversion_obstack (); +#endif /* ENABLE_CHECKING */ +} + +/* 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. This may change + ARGS. */ + +tree +build_offset_ref_call_from_tree (tree fn, VEC(tree,gc) **args) +{ + tree orig_fn; + VEC(tree,gc) *orig_args = NULL; + tree expr; + tree object; + + orig_fn = fn; + object = TREE_OPERAND (fn, 0); + + if (processing_template_decl) + { + gcc_assert (TREE_CODE (fn) == DOTSTAR_EXPR + || TREE_CODE (fn) == MEMBER_REF); + if (type_dependent_expression_p (fn) + || any_type_dependent_arguments_p (*args)) + return build_nt_call_vec (fn, *args); + + orig_args = make_tree_vector_copy (*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. */ + make_args_non_dependent (*args); + object = build_non_dependent_expr (object); + if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) + { + if (TREE_CODE (fn) == DOTSTAR_EXPR) + object = cp_build_addr_expr (object, tf_warning_or_error); + VEC_safe_insert (tree, gc, *args, 0, object); + } + /* 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 = cp_build_addr_expr (object, tf_warning_or_error); + fn = TREE_OPERAND (fn, 1); + fn = get_member_function_from_ptrfunc (&object_addr, fn); + VEC_safe_insert (tree, gc, *args, 0, object_addr); + } + + if (CLASS_TYPE_P (TREE_TYPE (fn))) + expr = build_op_call (fn, args, tf_warning_or_error); + else + expr = cp_build_function_call_vec (fn, args, tf_warning_or_error); + if (processing_template_decl && expr != error_mark_node) + expr = build_min_non_dep_call_vec (expr, orig_fn, orig_args); + + if (orig_args != NULL) + release_tree_vector (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) + { + error ("default argument missing for parameter %P of %q+#D", i, x); + TREE_PURPOSE (arg) = error_mark_node; + } + } +} + +/* Return true if function DECL can be inlined. This is used to force + instantiation of methods that might be interesting for inlining. */ +bool +possibly_inlined_p (tree decl) +{ + gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); + if (DECL_UNINLINABLE (decl)) + return false; + if (!optimize || pragma_java_exceptions) + return DECL_DECLARED_INLINE_P (decl); + /* When optimizing, we might inline everything when flatten + attribute or heuristics inlining for size or autoinlining + is used. */ + return true; +} + +/* Mark DECL (either a _DECL or a BASELINK) as "used" in the program. + If DECL is a specialization or implicitly declared class member, + generate the actual definition. */ + +void +mark_used (tree decl) +{ + /* If DECL is a BASELINK for a single function, then treat it just + like the DECL for the function. Otherwise, if the BASELINK is + for an overloaded function, we don't know which function was + actually used until after overload resolution. */ + if (TREE_CODE (decl) == BASELINK) + { + decl = BASELINK_FUNCTIONS (decl); + if (really_overloaded_fn (decl)) + return; + decl = OVL_CURRENT (decl); + } + + /* Set TREE_USED for the benefit of -Wunused. */ + TREE_USED (decl) = 1; + if (DECL_CLONED_FUNCTION_P (decl)) + TREE_USED (DECL_CLONED_FUNCTION (decl)) = 1; + + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DELETED_FN (decl)) + { + if (DECL_ARTIFICIAL (decl)) + { + if (DECL_OVERLOADED_OPERATOR_P (decl) == TYPE_EXPR + && LAMBDA_TYPE_P (DECL_CONTEXT (decl))) + { + /* We mark a lambda conversion op as deleted if we can't + generate it properly; see maybe_add_lambda_conv_op. */ + sorry ("converting lambda which uses %<...%> to " + "function pointer"); + return; + } + } + error ("use of deleted function %qD", decl); + if (!maybe_explain_implicit_delete (decl)) + error_at (DECL_SOURCE_LOCATION (decl), "declared here"); + return; + } + + /* We can only check DECL_ODR_USED on variables or functions with + DECL_LANG_SPECIFIC set, and these are also the only decls that we + might need special handling for. */ + if ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL) + || DECL_LANG_SPECIFIC (decl) == NULL + || DECL_THUNK_P (decl)) + return; + + /* We only want to do this processing once. We don't need to keep trying + to instantiate inline templates, because unit-at-a-time will make sure + we get them compiled before functions that want to inline them. */ + if (DECL_ODR_USED (decl)) + return; + + /* If within finish_function, defer the rest until that function + finishes, otherwise it might recurse. */ + if (defer_mark_used_calls) + { + VEC_safe_push (tree, gc, deferred_mark_used_calls, decl); + return; + } + + /* Normally, we can wait until instantiation-time to synthesize DECL. + However, if DECL is a static data member initialized with a constant + or a constexpr function, we need it right now because a reference to + such a data member or a call to such function is not value-dependent. */ + if ((decl_maybe_constant_var_p (decl) + || (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_CONSTEXPR_P (decl))) + && !DECL_INITIAL (decl) + && DECL_LANG_SPECIFIC (decl) + && DECL_TEMPLATE_INSTANTIATION (decl)) + { + /* Instantiating a function will result in garbage collection. We + must treat this situation as if we were within the body of a + function so as to avoid collecting live data only referenced from + the stack (such as overload resolution candidates). */ + ++function_depth; + instantiate_decl (decl, /*defer_ok=*/false, + /*expl_inst_class_mem_p=*/false); + --function_depth; + } + + /* If we don't need a value, then we don't need to synthesize DECL. */ + if (cp_unevaluated_operand != 0) + return; + + if (processing_template_decl) + return; + + /* Check this too in case we're within fold_non_dependent_expr. */ + if (DECL_TEMPLATE_INFO (decl) + && uses_template_parms (DECL_TI_ARGS (decl))) + return; + + DECL_ODR_USED (decl) = 1; + if (DECL_CLONED_FUNCTION_P (decl)) + DECL_ODR_USED (DECL_CLONED_FUNCTION (decl)) = 1; + + /* DR 757: A type without linkage shall not be used as the type of a + variable or function with linkage, unless + o the variable or function has extern "C" linkage (7.5 [dcl.link]), or + o the variable or function is not used (3.2 [basic.def.odr]) or is + defined in the same translation unit. */ + if (cxx_dialect > cxx98 + && decl_linkage (decl) != lk_none + && !DECL_EXTERN_C_P (decl) + && !DECL_ARTIFICIAL (decl) + && !decl_defined_p (decl) + && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)) + { + if (is_local_extern (decl)) + /* There's no way to define a local extern, and adding it to + the vector interferes with GC, so give an error now. */ + no_linkage_error (decl); + else + VEC_safe_push (tree, gc, no_linkage_decls, decl); + } + + if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl) + && !DECL_INITIAL (decl) && !DECL_ARTIFICIAL (decl)) + /* Remember it, so we can check it was defined. */ + note_vague_linkage_fn (decl); + + /* Is it a synthesized method that needs to be synthesized? */ + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) + && DECL_DEFAULTED_FN (decl) + /* A function defaulted outside the class is synthesized either by + cp_finish_decl or instantiate_decl. */ + && !DECL_DEFAULTED_OUTSIDE_CLASS_P (decl) + && ! DECL_INITIAL (decl)) + { + /* Remember the current location for a function we will end up + synthesizing. Then we can inform the user where it was + required in the case of error. */ + DECL_SOURCE_LOCATION (decl) = input_location; + + /* Synthesizing an implicitly defined member function will result in + garbage collection. We must treat this situation as if we were + within the body of a function so as to avoid collecting live data + on the stack (such as overload resolution candidates). + + We could just let cp_write_global_declarations handle synthesizing + this function, since we just added it to deferred_fns, but doing + it at the use site produces better error messages. */ + ++function_depth; + synthesize_method (decl); + --function_depth; + /* If this is a synthesized method we don't need to + do the instantiation test below. */ + } + else if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL) + && DECL_TEMPLATE_INFO (decl) + && (!DECL_EXPLICIT_INSTANTIATION (decl) + || always_instantiate_p (decl))) + /* If this is a function or variable that is an instance of some + template, we now know that we will need to actually do the + instantiation. We check that DECL is not an explicit + instantiation because that is not checked in instantiate_decl. + + We put off instantiating functions in order to improve compile + times. Maintaining a stack of active functions is expensive, + and the inliner knows to instantiate any functions it might + need. Therefore, we always try to defer instantiation. */ + instantiate_decl (decl, /*defer_ok=*/true, + /*expl_inst_class_mem_p=*/false); +} + +#include "gt-cp-decl2.h" diff --git a/gcc/cp/dump.c b/gcc/cp/dump.c new file mode 100644 index 000000000..d1631fc35 --- /dev/null +++ b/gcc/cp/dump.c @@ -0,0 +1,489 @@ +/* Tree-dumping functionality for intermediate representation. + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010 + 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 3, 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 COPYING3. If not see +. */ + +#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_field (di, "accs", "prot"); + else if (TREE_PRIVATE(t)) + dump_string_field (di, "accs", "priv"); + else + dump_string_field (di, "accs", "pub"); +} + +/* Dump a representation of the specific operator for an overloaded + 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_string (di, "new"); + break; + case VEC_NEW_EXPR: + dump_string (di, "vecnew"); + break; + case DELETE_EXPR: + dump_string (di, "delete"); + break; + case VEC_DELETE_EXPR: + dump_string (di, "vecdelete"); + break; + case UNARY_PLUS_EXPR: + dump_string (di, "pos"); + break; + case NEGATE_EXPR: + dump_string (di, "neg"); + break; + case ADDR_EXPR: + dump_string (di, "addr"); + break; + case INDIRECT_REF: + dump_string(di, "deref"); + break; + case BIT_NOT_EXPR: + dump_string(di, "not"); + break; + case TRUTH_NOT_EXPR: + dump_string(di, "lnot"); + break; + case PREINCREMENT_EXPR: + dump_string(di, "preinc"); + break; + case PREDECREMENT_EXPR: + dump_string(di, "predec"); + break; + case PLUS_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "plusassign"); + else + dump_string(di, "plus"); + break; + case MINUS_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "minusassign"); + else + dump_string(di, "minus"); + break; + case MULT_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "multassign"); + else + dump_string (di, "mult"); + break; + case TRUNC_DIV_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "divassign"); + else + dump_string (di, "div"); + break; + case TRUNC_MOD_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "modassign"); + else + dump_string (di, "mod"); + break; + case BIT_AND_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "andassign"); + else + dump_string (di, "and"); + break; + case BIT_IOR_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "orassign"); + else + dump_string (di, "or"); + break; + case BIT_XOR_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "xorassign"); + else + dump_string (di, "xor"); + break; + case LSHIFT_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "lshiftassign"); + else + dump_string (di, "lshift"); + break; + case RSHIFT_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "rshiftassign"); + else + dump_string (di, "rshift"); + break; + case EQ_EXPR: + dump_string (di, "eq"); + break; + case NE_EXPR: + dump_string (di, "ne"); + break; + case LT_EXPR: + dump_string (di, "lt"); + break; + case GT_EXPR: + dump_string (di, "gt"); + break; + case LE_EXPR: + dump_string (di, "le"); + break; + case GE_EXPR: + dump_string (di, "ge"); + break; + case TRUTH_ANDIF_EXPR: + dump_string (di, "land"); + break; + case TRUTH_ORIF_EXPR: + dump_string (di, "lor"); + break; + case COMPOUND_EXPR: + dump_string (di, "compound"); + break; + case MEMBER_REF: + dump_string (di, "memref"); + break; + case COMPONENT_REF: + dump_string (di, "ref"); + break; + case ARRAY_REF: + dump_string (di, "subs"); + break; + case POSTINCREMENT_EXPR: + dump_string (di, "postinc"); + break; + case POSTDECREMENT_EXPR: + dump_string (di, "postdec"); + break; + case CALL_EXPR: + dump_string (di, "call"); + break; + case NOP_EXPR: + if (DECL_ASSIGNMENT_OPERATOR_P (t)) + dump_string (di, "assign"); + break; + default: + break; + } +} + +bool +cp_dump_tree (void* dump_info, tree t) +{ + enum tree_code code; + dump_info_p di = (dump_info_p) dump_info; + + /* Figure out what kind of node this is. */ + code = TREE_CODE (t); + + if (DECL_P (t)) + { + if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus) + dump_string_field (di, "lang", language_to_string (DECL_LANGUAGE (t))); + } + + switch (code) + { + case IDENTIFIER_NODE: + if (IDENTIFIER_OPNAME_P (t)) + { + dump_string_field (di, "note", "operator"); + return true; + } + else if (IDENTIFIER_TYPENAME_P (t)) + { + dump_child ("tynm", TREE_TYPE (t)); + return true; + } + break; + + case OFFSET_TYPE: + dump_string_field (di, "note", "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_field (di, "note", "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 (! MAYBE_CLASS_TYPE_P (t)) + break; + + dump_child ("vfld", TYPE_VFIELD (t)); + if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t)) + dump_string(di, "spec"); + + if (!dump_flag (di, TDF_SLIM, t) && TYPE_BINFO (t)) + { + int i; + tree binfo; + tree base_binfo; + + for (binfo = TYPE_BINFO (t), i = 0; + BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i) + { + dump_child ("base", BINFO_TYPE (base_binfo)); + if (BINFO_VIRTUAL_P (base_binfo)) + dump_string_field (di, "spec", "virt"); + dump_access (di, base_binfo); + } + } + break; + + case FIELD_DECL: + dump_access (di, t); + if (DECL_MUTABLE_P (t)) + dump_string_field (di, "spec", "mutable"); + break; + + case VAR_DECL: + if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE) + dump_access (di, t); + if (TREE_STATIC (t) && !TREE_PUBLIC (t)) + dump_string_field (di, "link", "static"); + break; + + case FUNCTION_DECL: + if (!DECL_THUNK_P (t)) + { + if (DECL_OVERLOADED_OPERATOR_P (t)) { + dump_string_field (di, "note", "operator"); + dump_op (di, t); + } + if (DECL_FUNCTION_MEMBER_P (t)) + { + dump_string_field (di, "note", "member"); + dump_access (di, t); + } + if (DECL_PURE_VIRTUAL_P (t)) + dump_string_field (di, "spec", "pure"); + if (DECL_VIRTUAL_P (t)) + dump_string_field (di, "spec", "virt"); + if (DECL_CONSTRUCTOR_P (t)) + dump_string_field (di, "note", "constructor"); + if (DECL_DESTRUCTOR_P (t)) + dump_string_field (di, "note", "destructor"); + if (DECL_CONV_FN_P (t)) + dump_string_field (di, "note", "conversion"); + if (DECL_GLOBAL_CTOR_P (t)) + dump_string_field (di, "note", "global init"); + if (DECL_GLOBAL_DTOR_P (t)) + dump_string_field (di, "note", "global fini"); + if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t)) + dump_string_field (di, "note", "pseudo tmpl"); + } + else + { + tree virt = THUNK_VIRTUAL_OFFSET (t); + + dump_string_field (di, "note", "thunk"); + if (DECL_THIS_THUNK_P (t)) + dump_string_field (di, "note", "this adjusting"); + else + { + dump_string_field (di, "note", "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; + + case NAMESPACE_DECL: + if (DECL_NAMESPACE_ALIAS (t)) + dump_child ("alis", DECL_NAMESPACE_ALIAS (t)); + else if (!dump_flag (di, TDF_SLIM, t)) + dump_child ("dcls", cp_namespace_decls (t)); + break; + + case TEMPLATE_DECL: + dump_child ("rslt", DECL_TEMPLATE_RESULT (t)); + dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t)); + dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t)); + dump_child ("prms", DECL_TEMPLATE_PARMS (t)); + break; + + case OVERLOAD: + dump_child ("crnt", OVL_CURRENT (t)); + dump_child ("chan", OVL_CHAIN (t)); + break; + + case TRY_BLOCK: + dump_stmt (di, t); + if (CLEANUP_P (t)) + dump_string_field (di, "note", "cleanup"); + dump_child ("body", TRY_STMTS (t)); + dump_child ("hdlr", TRY_HANDLERS (t)); + break; + + case EH_SPEC_BLOCK: + dump_stmt (di, t); + dump_child ("body", EH_SPEC_STMTS (t)); + dump_child ("raises", EH_SPEC_RAISES (t)); + break; + + case PTRMEM_CST: + dump_child ("clas", PTRMEM_CST_CLASS (t)); + dump_child ("mbr", PTRMEM_CST_MEMBER (t)); + break; + + case THROW_EXPR: + /* These nodes are unary, but do not have code class `1'. */ + dump_child ("op 0", TREE_OPERAND (t, 0)); + break; + + case AGGR_INIT_EXPR: + { + int i = 0; + tree arg; + aggr_init_expr_arg_iterator iter; + dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t)); + dump_child ("fn", AGGR_INIT_EXPR_FN (t)); + FOR_EACH_AGGR_INIT_EXPR_ARG (arg, iter, t) + { + char buffer[32]; + sprintf (buffer, "%u", i); + dump_child (buffer, arg); + i++; + } + dump_child ("decl", AGGR_INIT_EXPR_SLOT (t)); + } + break; + + case HANDLER: + dump_stmt (di, t); + dump_child ("parm", HANDLER_PARMS (t)); + dump_child ("body", HANDLER_BODY (t)); + break; + + case MUST_NOT_THROW_EXPR: + dump_stmt (di, t); + dump_child ("body", TREE_OPERAND (t, 0)); + break; + + case USING_STMT: + dump_stmt (di, t); + dump_child ("nmsp", USING_STMT_NAMESPACE (t)); + break; + + case CLEANUP_STMT: + dump_stmt (di, t); + dump_child ("decl", CLEANUP_DECL (t)); + dump_child ("expr", CLEANUP_EXPR (t)); + dump_child ("body", CLEANUP_BODY (t)); + break; + + case IF_STMT: + dump_stmt (di, t); + dump_child ("cond", IF_COND (t)); + dump_child ("then", THEN_CLAUSE (t)); + dump_child ("else", ELSE_CLAUSE (t)); + break; + + case BREAK_STMT: + case CONTINUE_STMT: + dump_stmt (di, t); + break; + + case DO_STMT: + dump_stmt (di, t); + dump_child ("body", DO_BODY (t)); + dump_child ("cond", DO_COND (t)); + break; + + case FOR_STMT: + dump_stmt (di, t); + dump_child ("init", FOR_INIT_STMT (t)); + dump_child ("cond", FOR_COND (t)); + dump_child ("expr", FOR_EXPR (t)); + dump_child ("body", FOR_BODY (t)); + break; + + case RANGE_FOR_STMT: + dump_stmt (di, t); + dump_child ("decl", RANGE_FOR_DECL (t)); + dump_child ("expr", RANGE_FOR_EXPR (t)); + dump_child ("body", RANGE_FOR_BODY (t)); + break; + + case SWITCH_STMT: + dump_stmt (di, t); + dump_child ("cond", SWITCH_STMT_COND (t)); + dump_child ("body", SWITCH_STMT_BODY (t)); + break; + + case WHILE_STMT: + dump_stmt (di, t); + dump_child ("cond", WHILE_COND (t)); + dump_child ("body", WHILE_BODY (t)); + break; + + case STMT_EXPR: + dump_child ("stmt", STMT_EXPR_STMT (t)); + break; + + case EXPR_STMT: + dump_stmt (di, t); + dump_child ("expr", EXPR_STMT_EXPR (t)); + break; + + default: + break; + } + + return c_dump_tree (di, t); +} diff --git a/gcc/cp/error.c b/gcc/cp/error.c new file mode 100644 index 000000000..8f258a763 --- /dev/null +++ b/gcc/cp/error.c @@ -0,0 +1,3242 @@ +/* Call-backs for C++ error reporting. + This code is non-reentrant. + Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, + 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 3, 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 COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "tree.h" +#include "cp-tree.h" +#include "flags.h" +#include "diagnostic.h" +#include "tree-diagnostic.h" +#include "langhooks-def.h" +#include "intl.h" +#include "cxx-pretty-print.h" +#include "tree-pretty-print.h" +#include "pointer-set.h" +#include "c-family/c-objc.h" + +#define pp_separate_with_comma(PP) pp_cxx_separate_with (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) + +/* Translate if being used for diagnostics, but not for dump files or + __PRETTY_FUNCTION. */ +#define M_(msgid) (pp_translate_identifiers (cxx_pp) ? _(msgid) : (msgid)) + +# define NEXT_CODE(T) (TREE_CODE (TREE_TYPE (T))) + +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 void dump_type_prefix (tree, int); +static void dump_type_suffix (tree, int); +static void dump_function_name (tree, int); +static void dump_call_expr_args (tree, int, bool); +static void dump_aggr_init_expr_args (tree, int, bool); +static void dump_expr_list (tree, int); +static void dump_global_iord (tree); +static void dump_parameters (tree, int); +static void dump_exception_spec (tree, int); +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, VEC(tree,gc) *); +static void dump_scope (tree, int); +static void dump_template_parms (tree, int, int); +static int get_non_default_template_args_count (tree, int); +static const char *function_category (tree); +static void maybe_print_constexpr_context (diagnostic_context *); +static void maybe_print_instantiation_context (diagnostic_context *); +static void print_instantiation_full_context (diagnostic_context *); +static void print_instantiation_partial_context (diagnostic_context *, + struct tinst_level *, + 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 *, const char *, + int, bool, bool, bool); + +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 = flags & (TFF_SCOPE | TFF_CHASE_TYPEDEF); + + if (scope == NULL_TREE) + return; + + if (TREE_CODE (scope) == NAMESPACE_DECL) + { + if (scope != global_namespace) + { + dump_decl (scope, f); + pp_cxx_colon_colon (cxx_pp); + } + } + else if (AGGREGATE_TYPE_P (scope)) + { + dump_type (scope, f); + pp_cxx_colon_colon (cxx_pp); + } + else if ((flags & TFF_SCOPE) && TREE_CODE (scope) == FUNCTION_DECL) + { + dump_function_decl (scope, f); + pp_cxx_colon_colon (cxx_pp); + } +} + +/* Dump the template ARGument under control of FLAGS. */ + +static void +dump_template_argument (tree arg, int flags) +{ + if (ARGUMENT_PACK_P (arg)) + dump_template_argument_list (ARGUMENT_PACK_ARGS (arg), flags); + else if (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL) + dump_type (arg, flags & ~TFF_CLASS_KEY_OR_ENUM); + else + { + if (TREE_CODE (arg) == TREE_LIST) + arg = TREE_VALUE (arg); + + dump_expr (arg, (flags | TFF_EXPR_IN_PARENS) & ~TFF_CLASS_KEY_OR_ENUM); + } +} + +/* Count the number of template arguments ARGS whose value does not + match the (optional) default template parameter in PARAMS */ + +static int +get_non_default_template_args_count (tree args, int flags) +{ + int n = TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (args)); + + if (/* We use this flag when generating debug information. We don't + want to expand templates at this point, for this may generate + new decls, which gets decl counts out of sync, which may in + turn cause codegen differences between compilations with and + without -g. */ + (flags & TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS) != 0 + || !flag_pretty_templates) + return n; + + return GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (INNERMOST_TEMPLATE_ARGS (args)); +} + +/* Dump a template-argument-list ARGS (always a TREE_VEC) under control + of FLAGS. */ + +static void +dump_template_argument_list (tree args, int flags) +{ + int n = get_non_default_template_args_count (args, flags); + int need_comma = 0; + int i; + + for (i = 0; i < n; ++i) + { + tree arg = TREE_VEC_ELT (args, i); + + /* Only print a comma if we know there is an argument coming. In + the case of an empty template argument pack, no actual + argument will be printed. */ + if (need_comma + && (!ARGUMENT_PACK_P (arg) + || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0)) + pp_separate_with_comma (cxx_pp); + + dump_template_argument (arg, flags); + need_comma = 1; + } +} + +/* Dump a template parameter PARM (a TREE_LIST) under control of FLAGS. */ + +static void +dump_template_parameter (tree parm, int flags) +{ + tree p; + tree a; + + if (parm == error_mark_node) + return; + + p = TREE_VALUE (parm); + a = TREE_PURPOSE (parm); + + if (TREE_CODE (p) == TYPE_DECL) + { + if (flags & TFF_DECL_SPECIFIERS) + { + pp_cxx_ws_string (cxx_pp, "class"); + if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (p))) + pp_cxx_ws_string (cxx_pp, "..."); + if (DECL_NAME (p)) + pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p)); + } + else if (DECL_NAME (p)) + pp_cxx_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_cxx_whitespace (cxx_pp); + pp_equal (cxx_pp); + pp_cxx_whitespace (cxx_pp); + if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL) + dump_type (a, flags & ~TFF_CHASE_TYPEDEF); + else + dump_expr (a, flags | TFF_EXPR_IN_PARENS); + } +} + +/* Dump, under control of FLAGS, a template-parameter-list binding. + PARMS is a TREE_LIST of TREE_VEC of TREE_LIST and ARGS is a + TREE_VEC. */ + +static void +dump_template_bindings (tree parms, tree args, VEC(tree,gc)* typenames) +{ + int need_comma = 0; + int i; + tree t; + + while (parms) + { + tree p = TREE_VALUE (parms); + int lvl = TMPL_PARMS_DEPTH (parms); + int arg_idx = 0; + int i; + tree lvl_args = NULL_TREE; + + /* Don't crash if we had an invalid argument list. */ + if (TMPL_ARGS_DEPTH (args) >= lvl) + lvl_args = TMPL_ARGS_LEVEL (args, lvl); + + for (i = 0; i < TREE_VEC_LENGTH (p); ++i) + { + tree arg = NULL_TREE; + + /* Don't crash if we had an invalid argument list. */ + if (lvl_args && NUM_TMPL_ARGS (lvl_args) > arg_idx) + arg = TREE_VEC_ELT (lvl_args, arg_idx); + + if (need_comma) + pp_separate_with_comma (cxx_pp); + dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER); + pp_cxx_whitespace (cxx_pp); + pp_equal (cxx_pp); + pp_cxx_whitespace (cxx_pp); + if (arg) + { + if (ARGUMENT_PACK_P (arg)) + pp_cxx_left_brace (cxx_pp); + dump_template_argument (arg, TFF_PLAIN_IDENTIFIER); + if (ARGUMENT_PACK_P (arg)) + pp_cxx_right_brace (cxx_pp); + } + else + pp_string (cxx_pp, M_("")); + + ++arg_idx; + need_comma = 1; + } + + parms = TREE_CHAIN (parms); + } + + FOR_EACH_VEC_ELT (tree, typenames, i, t) + { + bool dependent = uses_template_parms (args); + if (need_comma) + pp_separate_with_comma (cxx_pp); + dump_type (t, TFF_PLAIN_IDENTIFIER); + pp_cxx_whitespace (cxx_pp); + pp_equal (cxx_pp); + pp_cxx_whitespace (cxx_pp); + push_deferring_access_checks (dk_no_check); + if (dependent) + ++processing_template_decl; + t = tsubst (t, args, tf_none, NULL_TREE); + if (dependent) + --processing_template_decl; + pop_deferring_access_checks (); + /* Strip typedefs. We can't just use TFF_CHASE_TYPEDEF because + pp_simple_type_specifier doesn't know about it. */ + t = strip_typedefs (t); + dump_type (t, TFF_PLAIN_IDENTIFIER); + } +} + +/* Dump a human-readable equivalent of TYPE. FLAGS controls the + format. */ + +static void +dump_type (tree t, int flags) +{ + if (t == NULL_TREE) + return; + + /* Don't print e.g. "struct mytypedef". */ + if (TYPE_P (t) && typedef_variant_p (t)) + { + tree decl = TYPE_NAME (t); + if ((flags & TFF_CHASE_TYPEDEF) + || DECL_SELF_REFERENCE_P (decl) + || (!flag_pretty_templates + && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl))) + t = strip_typedefs (t); + else if (same_type_p (t, TREE_TYPE (decl))) + t = decl; + else + { + pp_cxx_cv_qualifier_seq (cxx_pp, t); + pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); + return; + } + } + + if (TYPE_PTRMEMFUNC_P (t)) + goto offset_type; + + switch (TREE_CODE (t)) + { + case LANG_TYPE: + if (t == init_list_type_node) + pp_string (cxx_pp, M_("")); + else if (t == unknown_type_node) + pp_string (cxx_pp, M_("")); + else + { + pp_cxx_cv_qualifier_seq (cxx_pp, t); + pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); + } + break; + + case TREE_LIST: + /* A list of function parms. */ + dump_parameters (t, flags); + break; + + case IDENTIFIER_NODE: + pp_cxx_tree_identifier (cxx_pp, t); + break; + + case TREE_BINFO: + dump_type (BINFO_TYPE (t), flags); + break; + + case RECORD_TYPE: + case UNION_TYPE: + case ENUMERAL_TYPE: + dump_aggr_type (t, flags); + break; + + case TYPE_DECL: + if (flags & TFF_CHASE_TYPEDEF) + { + dump_type (DECL_ORIGINAL_TYPE (t) + ? 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: + case FIXED_POINT_TYPE: + pp_type_specifier_seq (cxx_pp, t); + break; + + case TEMPLATE_TEMPLATE_PARM: + /* For parameters inside template signature. */ + if (TYPE_IDENTIFIER (t)) + pp_cxx_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_cxx_cv_qualifier_seq (cxx_pp, t); + pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t)); + pp_cxx_begin_template_argument_list (cxx_pp); + dump_template_argument_list (args, flags); + pp_cxx_end_template_argument_list (cxx_pp); + } + break; + + case TEMPLATE_TYPE_PARM: + pp_cxx_cv_qualifier_seq (cxx_pp, t); + if (TYPE_IDENTIFIER (t)) + pp_cxx_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 + reduces code size. */ + case ARRAY_TYPE: + case POINTER_TYPE: + case REFERENCE_TYPE: + case OFFSET_TYPE: + offset_type: + case FUNCTION_TYPE: + case METHOD_TYPE: + { + dump_type_prefix (t, flags); + dump_type_suffix (t, flags); + break; + } + case TYPENAME_TYPE: + if (! (flags & TFF_CHASE_TYPEDEF) + && DECL_ORIGINAL_TYPE (TYPE_NAME (t))) + { + dump_decl (TYPE_NAME (t), TFF_PLAIN_IDENTIFIER); + break; + } + pp_cxx_cv_qualifier_seq (cxx_pp, t); + pp_cxx_ws_string (cxx_pp, + TYPENAME_IS_ENUM_P (t) ? "enum" + : TYPENAME_IS_CLASS_P (t) ? "class" + : "typename"); + dump_typename (t, flags); + break; + + case UNBOUND_CLASS_TEMPLATE: + if (! (flags & TFF_UNQUALIFIED_NAME)) + { + dump_type (TYPE_CONTEXT (t), flags); + pp_cxx_colon_colon (cxx_pp); + } + pp_cxx_ws_string (cxx_pp, "template"); + dump_type (DECL_NAME (TYPE_NAME (t)), flags); + break; + + case TYPEOF_TYPE: + pp_cxx_ws_string (cxx_pp, "__typeof__"); + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_paren (cxx_pp); + dump_expr (TYPEOF_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS); + pp_cxx_right_paren (cxx_pp); + break; + + case TYPE_PACK_EXPANSION: + dump_type (PACK_EXPANSION_PATTERN (t), flags); + pp_cxx_ws_string (cxx_pp, "..."); + break; + + case TYPE_ARGUMENT_PACK: + dump_template_argument (t, flags); + break; + + case DECLTYPE_TYPE: + pp_cxx_ws_string (cxx_pp, "decltype"); + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_paren (cxx_pp); + dump_expr (DECLTYPE_TYPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS); + pp_cxx_right_paren (cxx_pp); + break; + + case NULLPTR_TYPE: + pp_string (cxx_pp, "std::nullptr_t"); + break; + + default: + pp_unsupported_tree (cxx_pp, t); + /* Fall through to error. */ + + case ERROR_MARK: + pp_string (cxx_pp, M_("")); + break; + } +} + +/* Dump a TYPENAME_TYPE. We need to notice when the context is itself + a TYPENAME_TYPE. */ + +static void +dump_typename (tree t, int flags) +{ + tree ctx = TYPE_CONTEXT (t); + + if (TREE_CODE (ctx) == TYPENAME_TYPE) + dump_typename (ctx, flags); + else + dump_type (ctx, flags & ~TFF_CLASS_KEY_OR_ENUM); + pp_cxx_colon_colon (cxx_pp); + dump_decl (TYPENAME_TYPE_FULLNAME (t), flags); +} + +/* Return the name of the supplied aggregate, or enumeral type. */ + +const char * +class_key_or_enum_as_string (tree t) +{ + if (TREE_CODE (t) == ENUMERAL_TYPE) + { + if (SCOPED_ENUM_P (t)) + return "enum class"; + else + return "enum"; + } + else if (TREE_CODE (t) == UNION_TYPE) + return "union"; + else if (TYPE_LANG_SPECIFIC (t) && CLASSTYPE_DECLARED_CLASS (t)) + return "class"; + else + return "struct"; +} + +/* Print out a class declaration T under the control of FLAGS, + in the form `class foo'. */ + +static void +dump_aggr_type (tree t, int flags) +{ + tree name; + const char *variety = class_key_or_enum_as_string (t); + int typdef = 0; + int tmplate = 0; + + pp_cxx_cv_qualifier_seq (cxx_pp, t); + + if (flags & TFF_CLASS_KEY_OR_ENUM) + pp_cxx_ws_string (cxx_pp, variety); + + name = TYPE_NAME (t); + + if (name) + { + typdef = !DECL_ARTIFICIAL (name); + + if ((typdef + && ((flags & TFF_CHASE_TYPEDEF) + || (!flag_pretty_templates && DECL_LANG_SPECIFIC (name) + && DECL_TEMPLATE_INFO (name)))) + || DECL_SELF_REFERENCE_P (name)) + { + t = TYPE_MAIN_VARIANT (t); + name = TYPE_NAME (t); + typdef = 0; + } + + tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE + && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t) + && (TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL + || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t))); + + if (! (flags & TFF_UNQUALIFIED_NAME)) + dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE); + flags &= ~TFF_UNQUALIFIED_NAME; + if (tmplate) + { + /* Because the template names are mangled, we have to locate + the most general template, and use that name. */ + tree tpl = CLASSTYPE_TI_TEMPLATE (t); + + while (DECL_TEMPLATE_INFO (tpl)) + tpl = DECL_TI_TEMPLATE (tpl); + name = tpl; + } + name = DECL_NAME (name); + } + + if (name == 0 || ANON_AGGRNAME_P (name)) + { + if (flags & TFF_CLASS_KEY_OR_ENUM) + pp_string (cxx_pp, M_("")); + else + pp_printf (pp_base (cxx_pp), M_(""), variety); + } + else if (LAMBDANAME_P (name)) + { + /* A lambda's "type" is essentially its signature. */ + pp_string (cxx_pp, M_("'); + } + else + pp_cxx_tree_identifier (cxx_pp, name); + if (tmplate) + dump_template_parms (TYPE_TEMPLATE_INFO (t), + !CLASSTYPE_USE_TEMPLATE (t), + flags & ~TFF_TEMPLATE_HEADER); +} + +/* Dump into the obstack the initial part of the output for a given type. + This is necessary when dealing with things like functions returning + functions. Examples: + + return type of `int (* fee ())()': pointer -> function -> int. Both + pointer (and reference and offset) and function (and member) types must + deal with prefix and suffix. + + Arrays must also do this for DECL nodes, like int a[], and for things like + int *[]&. */ + +static void +dump_type_prefix (tree t, int flags) +{ + if (TYPE_PTRMEMFUNC_P (t)) + { + t = TYPE_PTRMEMFUNC_FN_TYPE (t); + goto offset_type; + } + + switch (TREE_CODE (t)) + { + case POINTER_TYPE: + case REFERENCE_TYPE: + { + tree sub = TREE_TYPE (t); + + dump_type_prefix (sub, flags); + if (TREE_CODE (sub) == ARRAY_TYPE + || TREE_CODE (sub) == FUNCTION_TYPE) + { + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_paren (cxx_pp); + } + if (TREE_CODE (t) == POINTER_TYPE) + pp_character(cxx_pp, '*'); + else if (TREE_CODE (t) == REFERENCE_TYPE) + { + if (TYPE_REF_IS_RVALUE (t)) + pp_string (cxx_pp, "&&"); + else + pp_character (cxx_pp, '&'); + } + pp_base (cxx_pp)->padding = pp_before; + pp_cxx_cv_qualifier_seq (cxx_pp, t); + } + break; + + case OFFSET_TYPE: + offset_type: + dump_type_prefix (TREE_TYPE (t), flags); + if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */ + { + pp_maybe_space (cxx_pp); + if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) + pp_cxx_left_paren (cxx_pp); + dump_type (TYPE_OFFSET_BASETYPE (t), flags); + pp_cxx_colon_colon (cxx_pp); + } + pp_cxx_star (cxx_pp); + pp_cxx_cv_qualifier_seq (cxx_pp, t); + pp_base (cxx_pp)->padding = pp_before; + break; + + /* This can be reached without a pointer when dealing with + templates, e.g. std::is_function. */ + case FUNCTION_TYPE: + dump_type_prefix (TREE_TYPE (t), flags); + break; + + case METHOD_TYPE: + dump_type_prefix (TREE_TYPE (t), flags); + pp_maybe_space (cxx_pp); + pp_cxx_left_paren (cxx_pp); + dump_aggr_type (TYPE_METHOD_BASETYPE (t), flags); + pp_cxx_colon_colon (cxx_pp); + break; + + case ARRAY_TYPE: + dump_type_prefix (TREE_TYPE (t), flags); + break; + + case ENUMERAL_TYPE: + case IDENTIFIER_NODE: + case INTEGER_TYPE: + case BOOLEAN_TYPE: + case REAL_TYPE: + case RECORD_TYPE: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_TEMPLATE_PARM: + case BOUND_TEMPLATE_TEMPLATE_PARM: + case TREE_LIST: + case TYPE_DECL: + case TREE_VEC: + case UNION_TYPE: + case LANG_TYPE: + case VOID_TYPE: + case TYPENAME_TYPE: + case COMPLEX_TYPE: + case VECTOR_TYPE: + case TYPEOF_TYPE: + case DECLTYPE_TYPE: + case TYPE_PACK_EXPANSION: + case FIXED_POINT_TYPE: + case NULLPTR_TYPE: + dump_type (t, flags); + pp_base (cxx_pp)->padding = pp_before; + break; + + default: + pp_unsupported_tree (cxx_pp, t); + /* fall through. */ + case ERROR_MARK: + pp_string (cxx_pp, M_("")); + break; + } +} + +/* Dump the suffix of type T, under control of FLAGS. This is the part + 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); + + switch (TREE_CODE (t)) + { + case POINTER_TYPE: + case REFERENCE_TYPE: + case OFFSET_TYPE: + if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE + || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE) + pp_cxx_right_paren (cxx_pp); + dump_type_suffix (TREE_TYPE (t), flags); + break; + + case FUNCTION_TYPE: + case METHOD_TYPE: + { + tree arg; + if (TREE_CODE (t) == METHOD_TYPE) + /* Can only be reached through a pointer. */ + pp_cxx_right_paren (cxx_pp); + arg = TYPE_ARG_TYPES (t); + if (TREE_CODE (t) == METHOD_TYPE) + arg = TREE_CHAIN (arg); + + /* Function pointers don't have default args. Not in standard C++, + anyway; they may in g++, but we'll just pretend otherwise. */ + dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS); + + if (TREE_CODE (t) == METHOD_TYPE) + pp_cxx_cv_qualifier_seq + (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t)))); + else + pp_cxx_cv_qualifier_seq (cxx_pp, t); + dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags); + dump_type_suffix (TREE_TYPE (t), flags); + break; + } + + case ARRAY_TYPE: + pp_maybe_space (cxx_pp); + pp_cxx_left_bracket (cxx_pp); + if (TYPE_DOMAIN (t)) + { + tree dtype = TYPE_DOMAIN (t); + tree max = TYPE_MAX_VALUE (dtype); + if (host_integerp (max, 0)) + pp_wide_integer (cxx_pp, tree_low_cst (max, 0) + 1); + else if (TREE_CODE (max) == MINUS_EXPR) + dump_expr (TREE_OPERAND (max, 0), + flags & ~TFF_EXPR_IN_PARENS); + else + dump_expr (fold_build2_loc (input_location, + PLUS_EXPR, dtype, max, + build_int_cst (dtype, 1)), + flags & ~TFF_EXPR_IN_PARENS); + } + pp_cxx_right_bracket (cxx_pp); + dump_type_suffix (TREE_TYPE (t), flags); + break; + + case ENUMERAL_TYPE: + case IDENTIFIER_NODE: + case INTEGER_TYPE: + case BOOLEAN_TYPE: + case REAL_TYPE: + case RECORD_TYPE: + case TEMPLATE_TYPE_PARM: + case TEMPLATE_TEMPLATE_PARM: + case BOUND_TEMPLATE_TEMPLATE_PARM: + case TREE_LIST: + case TYPE_DECL: + case TREE_VEC: + case UNION_TYPE: + case LANG_TYPE: + case VOID_TYPE: + case TYPENAME_TYPE: + case COMPLEX_TYPE: + case VECTOR_TYPE: + case TYPEOF_TYPE: + case DECLTYPE_TYPE: + case TYPE_PACK_EXPANSION: + case FIXED_POINT_TYPE: + case NULLPTR_TYPE: + 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. */ + break; + } +} + +static void +dump_global_iord (tree t) +{ + const char *p = NULL; + + if (DECL_GLOBAL_CTOR_P (t)) + p = M_("(static initializers for %s)"); + else if (DECL_GLOBAL_DTOR_P (t)) + p = M_("(static destructors for %s)"); + else + gcc_unreachable (); + + pp_printf (pp_base (cxx_pp), p, input_filename); +} + +static void +dump_simple_decl (tree t, tree type, int flags) +{ + if (flags & TFF_DECL_SPECIFIERS) + { + if (TREE_CODE (t) == VAR_DECL + && DECL_DECLARED_CONSTEXPR_P (t)) + pp_cxx_ws_string (cxx_pp, "constexpr"); + dump_type_prefix (type, flags & ~TFF_UNQUALIFIED_NAME); + pp_maybe_space (cxx_pp); + } + if (! (flags & TFF_UNQUALIFIED_NAME) + && TREE_CODE (t) != PARM_DECL + && (!DECL_INITIAL (t) + || TREE_CODE (DECL_INITIAL (t)) != TEMPLATE_PARM_INDEX)) + dump_scope (CP_DECL_CONTEXT (t), flags); + flags &= ~TFF_UNQUALIFIED_NAME; + if ((flags & TFF_DECL_SPECIFIERS) + && DECL_TEMPLATE_PARM_P (t) + && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t))) + pp_string (cxx_pp, "..."); + if (DECL_NAME (t)) + dump_decl (DECL_NAME (t), flags); + else + pp_string (cxx_pp, M_("")); + if (flags & TFF_DECL_SPECIFIERS) + dump_type_suffix (type, flags); +} + +/* 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; + + /* If doing Objective-C++, give Objective-C a chance to demangle + Objective-C method names. */ + if (c_dialect_objc ()) + { + const char *demangled = objc_maybe_printable_name (t, flags); + if (demangled) + { + pp_string (cxx_pp, demangled); + return; + } + } + + switch (TREE_CODE (t)) + { + case TYPE_DECL: + /* Don't say 'typedef class A' */ + if (DECL_ARTIFICIAL (t) && !DECL_SELF_REFERENCE_P (t)) + { + if ((flags & TFF_DECL_SPECIFIERS) + && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) + { + /* Say `class T' not just `T'. */ + pp_cxx_ws_string (cxx_pp, "class"); + + /* Emit the `...' for a parameter pack. */ + if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t))) + pp_cxx_ws_string (cxx_pp, "..."); + } + + dump_type (TREE_TYPE (t), flags); + break; + } + if ((flags & TFF_DECL_SPECIFIERS) + && !DECL_SELF_REFERENCE_P (t)) + pp_cxx_ws_string (cxx_pp, "typedef"); + dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) + ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), + flags); + break; + + case VAR_DECL: + if (DECL_NAME (t) && VTABLE_NAME_P (DECL_NAME (t))) + { + pp_string (cxx_pp, M_("vtable for ")); + gcc_assert (TYPE_P (DECL_CONTEXT (t))); + 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: + pp_string (cxx_pp, M_(" ")); + dump_simple_decl (t, TREE_TYPE (t), flags); + break; + + case NAMESPACE_DECL: + if (flags & TFF_DECL_SPECIFIERS) + pp_cxx_declaration (cxx_pp, t); + else + { + if (! (flags & TFF_UNQUALIFIED_NAME)) + dump_scope (CP_DECL_CONTEXT (t), flags); + flags &= ~TFF_UNQUALIFIED_NAME; + if (DECL_NAME (t) == NULL_TREE) + pp_cxx_ws_string (cxx_pp, M_("{anonymous}")); + else + pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t)); + } + break; + + case SCOPE_REF: + dump_type (TREE_OPERAND (t, 0), flags); + pp_string (cxx_pp, "::"); + dump_decl (TREE_OPERAND (t, 1), flags|TFF_UNQUALIFIED_NAME); + break; + + case ARRAY_REF: + dump_decl (TREE_OPERAND (t, 0), flags); + pp_cxx_left_bracket (cxx_pp); + dump_decl (TREE_OPERAND (t, 1), flags); + pp_cxx_right_bracket (cxx_pp); + break; + + /* So that we can do dump_decl on an aggr type. */ + case RECORD_TYPE: + case UNION_TYPE: + case ENUMERAL_TYPE: + 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_cxx_complement (cxx_pp); + dump_type (TREE_OPERAND (t, 0), flags); + break; + + case TYPE_EXPR: + gcc_unreachable (); + break; + + /* These special cases are duplicated here so that other functions + can feed identifiers to error and get them demangled properly. */ + case IDENTIFIER_NODE: + if (IDENTIFIER_TYPENAME_P (t)) + { + pp_cxx_ws_string (cxx_pp, "operator"); + /* Not exactly IDENTIFIER_TYPE_VALUE. */ + dump_type (TREE_TYPE (t), flags); + break; + } + else + pp_cxx_tree_identifier (cxx_pp, t); + break; + + case OVERLOAD: + if (OVL_CHAIN (t)) + { + t = OVL_CURRENT (t); + if (DECL_CLASS_SCOPE_P (t)) + { + dump_type (DECL_CONTEXT (t), flags); + pp_cxx_colon_colon (cxx_pp); + } + else if (!DECL_FILE_SCOPE_P (t)) + { + dump_decl (DECL_CONTEXT (t), flags); + pp_cxx_colon_colon (cxx_pp); + } + dump_decl (DECL_NAME (t), flags); + break; + } + + /* If there's only one function, just treat it like an ordinary + FUNCTION_DECL. */ + t = OVL_CURRENT (t); + /* Fall through. */ + + case FUNCTION_DECL: + if (! DECL_LANG_SPECIFIC (t)) + pp_string (cxx_pp, M_("")); + else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t)) + dump_global_iord (t); + else + dump_function_decl (t, flags); + break; + + case TEMPLATE_DECL: + dump_template_decl (t, flags); + break; + + 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_cxx_begin_template_argument_list (cxx_pp); + if (TREE_OPERAND (t, 1)) + dump_template_argument_list (TREE_OPERAND (t, 1), flags); + pp_cxx_end_template_argument_list (cxx_pp); + } + break; + + case LABEL_DECL: + pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t)); + break; + + case CONST_DECL: + if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE) + || (DECL_INITIAL (t) && + TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_PARM_INDEX)) + dump_simple_decl (t, TREE_TYPE (t), flags); + else if (DECL_NAME (t)) + dump_decl (DECL_NAME (t), flags); + else if (DECL_INITIAL (t)) + dump_expr (DECL_INITIAL (t), flags | TFF_EXPR_IN_PARENS); + else + pp_string (cxx_pp, M_("")); + break; + + case USING_DECL: + pp_cxx_ws_string (cxx_pp, "using"); + dump_type (USING_DECL_SCOPE (t), flags); + pp_cxx_colon_colon (cxx_pp); + dump_decl (DECL_NAME (t), flags); + break; + + case STATIC_ASSERT: + pp_cxx_declaration (cxx_pp, t); + break; + + case BASELINK: + 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; + + case UNBOUND_CLASS_TEMPLATE: + case TYPE_PACK_EXPANSION: + case TREE_BINFO: + dump_type (t, flags); + break; + + default: + pp_unsupported_tree (cxx_pp, t); + /* Fall through to error. */ + + case ERROR_MARK: + pp_string (cxx_pp, M_("")); + break; + } +} + +/* Dump a template declaration T under control of FLAGS. This means the + '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; + int i; + + if (flags & TFF_TEMPLATE_HEADER) + { + for (parms = orig_parms = nreverse (orig_parms); + parms; + parms = TREE_CHAIN (parms)) + { + tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms); + int len = TREE_VEC_LENGTH (inner_parms); + + pp_cxx_ws_string (cxx_pp, "template"); + pp_cxx_begin_template_argument_list (cxx_pp); + + /* If we've shown the template prefix, we'd better show the + parameters' and decl's type too. */ + flags |= TFF_DECL_SPECIFIERS; + + 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_cxx_end_template_argument_list (cxx_pp); + pp_cxx_whitespace (cxx_pp); + } + nreverse(orig_parms); + + if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) + { + /* Say `template class TT' not just `template TT'. */ + pp_cxx_ws_string (cxx_pp, "class"); + + /* If this is a parameter pack, print the ellipsis. */ + if (TEMPLATE_TYPE_PARAMETER_PACK (TREE_TYPE (t))) + pp_cxx_ws_string (cxx_pp, "..."); + } + } + + if (DECL_TEMPLATE_RESULT (t) + && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL) + dump_type (TREE_TYPE (t), + ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME + | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0))); + else if (DECL_TEMPLATE_RESULT (t) + && TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL) + dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME); + else + { + gcc_assert (TREE_TYPE (t)); + switch (NEXT_CODE (t)) + { + case METHOD_TYPE: + case FUNCTION_TYPE: + dump_function_decl (t, flags | TFF_TEMPLATE_NAME); + break; + default: + /* This case can occur with some invalid code. */ + dump_type (TREE_TYPE (t), + (flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME + | (flags & TFF_DECL_SPECIFIERS + ? TFF_CLASS_KEY_OR_ENUM : 0)); + } + } +} + +/* find_typenames looks through the type of the function template T + and returns a VEC containing any typedefs, decltypes or TYPENAME_TYPEs + it finds. */ + +struct find_typenames_t +{ + struct pointer_set_t *p_set; + VEC (tree,gc) *typenames; +}; + +static tree +find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data) +{ + struct find_typenames_t *d = (struct find_typenames_t *)data; + tree mv = NULL_TREE; + + if (TYPE_P (*tp) && is_typedef_decl (TYPE_NAME (*tp))) + /* Add the type of the typedef without any additional cv-quals. */ + mv = TREE_TYPE (TYPE_NAME (*tp)); + else if (TREE_CODE (*tp) == TYPENAME_TYPE + || TREE_CODE (*tp) == DECLTYPE_TYPE) + /* Add the typename without any cv-qualifiers. */ + mv = TYPE_MAIN_VARIANT (*tp); + + if (mv && (mv == *tp || !pointer_set_insert (d->p_set, mv))) + VEC_safe_push (tree, gc, d->typenames, mv); + + /* Search into class template arguments, which cp_walk_subtrees + doesn't do. */ + if (CLASS_TYPE_P (*tp) && CLASSTYPE_TEMPLATE_INFO (*tp)) + cp_walk_tree (&CLASSTYPE_TI_ARGS (*tp), find_typenames_r, + data, d->p_set); + + return NULL_TREE; +} + +static VEC(tree,gc) * +find_typenames (tree t) +{ + struct find_typenames_t ft; + ft.p_set = pointer_set_create (); + ft.typenames = NULL; + cp_walk_tree (&TREE_TYPE (DECL_TEMPLATE_RESULT (t)), + find_typenames_r, &ft, ft.p_set); + pointer_set_destroy (ft.p_set); + return ft.typenames; +} + +/* Pretty print a function decl. There are several ways we want to print a + function declaration. The TFF_ bits in FLAGS tells us how to behave. + As error can only apply the '#' flag once to give 0 and 1 for V, there + 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; + tree cname = NULL_TREE; + tree template_args = NULL_TREE; + tree template_parms = NULL_TREE; + int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS; + int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME); + tree exceptions; + VEC(tree,gc) *typenames = NULL; + + if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t)) + { + /* A lambda's signature is essentially its "type", so defer. */ + gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t))); + dump_type (DECL_CONTEXT (t), flags); + return; + } + + flags &= ~TFF_UNQUALIFIED_NAME; + if (TREE_CODE (t) == TEMPLATE_DECL) + t = DECL_TEMPLATE_RESULT (t); + + /* Save the exceptions, in case t is a specialization and we are + emitting an error about incompatible specifications. */ + exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t)); + + /* Pretty print template instantiations only. */ + if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t) + && flag_pretty_templates) + { + tree tmpl; + + template_args = DECL_TI_ARGS (t); + tmpl = most_general_template (t); + if (tmpl && TREE_CODE (tmpl) == TEMPLATE_DECL) + { + template_parms = DECL_TEMPLATE_PARMS (tmpl); + t = tmpl; + typenames = find_typenames (t); + } + } + + fntype = TREE_TYPE (t); + parmtypes = FUNCTION_FIRST_USER_PARMTYPE (t); + + 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) + { + if (DECL_STATIC_FUNCTION_P (t)) + pp_cxx_ws_string (cxx_pp, "static"); + else if (DECL_VIRTUAL_P (t)) + pp_cxx_ws_string (cxx_pp, "virtual"); + + if (DECL_DECLARED_CONSTEXPR_P (STRIP_TEMPLATE (t))) + pp_cxx_ws_string (cxx_pp, "constexpr"); + } + + /* Print the return type? */ + if (show_return) + show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t) + && !DECL_DESTRUCTOR_P (t); + if (show_return) + dump_type_prefix (TREE_TYPE (fntype), flags); + + /* Print the function name. */ + if (!do_outer_scope) + /* Nothing. */; + else if (cname) + { + dump_type (cname, flags); + pp_cxx_colon_colon (cxx_pp); + } + else + dump_scope (CP_DECL_CONTEXT (t), flags); + + dump_function_name (t, flags); + + if (!(flags & TFF_NO_FUNCTION_ARGUMENTS)) + { + dump_parameters (parmtypes, flags); + + if (TREE_CODE (fntype) == METHOD_TYPE) + { + pp_base (cxx_pp)->padding = pp_before; + pp_cxx_cv_qualifier_seq + (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype)))); + } + + if (flags & TFF_EXCEPTION_SPECIFICATION) + { + pp_base (cxx_pp)->padding = pp_before; + dump_exception_spec (exceptions, flags); + } + + if (show_return) + dump_type_suffix (TREE_TYPE (fntype), flags); + } + + /* If T is a template instantiation, dump the parameter binding. */ + if (template_parms != NULL_TREE && template_args != NULL_TREE) + { + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_bracket (cxx_pp); + pp_cxx_ws_string (cxx_pp, M_("with")); + pp_cxx_whitespace (cxx_pp); + dump_template_bindings (template_parms, template_args, typenames); + pp_cxx_right_bracket (cxx_pp); + } +} + +/* Print a parameter list. If this is for a member function, the + member object ptr (and any other hidden args) should have + already been removed. */ + +static void +dump_parameters (tree parmtypes, int flags) +{ + int first = 1; + flags &= ~TFF_SCOPE; + pp_cxx_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_cxx_ws_string (cxx_pp, "..."); + break; + } + + dump_type (TREE_VALUE (parmtypes), flags); + + if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes)) + { + pp_cxx_whitespace (cxx_pp); + pp_equal (cxx_pp); + pp_cxx_whitespace (cxx_pp); + dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS); + } + } + + pp_cxx_right_paren (cxx_pp); +} + +/* Print an exception specification. T is the exception specification. */ + +static void +dump_exception_spec (tree t, int flags) +{ + if (t && TREE_PURPOSE (t)) + { + pp_cxx_ws_string (cxx_pp, "noexcept"); + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_paren (cxx_pp); + dump_expr (TREE_PURPOSE (t), flags); + pp_cxx_right_paren (cxx_pp); + } + else if (t) + { + pp_cxx_ws_string (cxx_pp, "throw"); + pp_cxx_whitespace (cxx_pp); + pp_cxx_left_paren (cxx_pp); + if (TREE_VALUE (t) != NULL_TREE) + while (1) + { + dump_type (TREE_VALUE (t), flags); + t = TREE_CHAIN (t); + if (!t) + break; + pp_separate_with_comma (cxx_pp); + } + pp_cxx_right_paren (cxx_pp); + } +} + +/* Handle the function name for a FUNCTION_DECL node, grokking operators + and destructors properly. */ + +static void +dump_function_name (tree t, int flags) +{ + tree name = DECL_NAME (t); + + /* We can get here with a decl that was synthesized by language- + independent machinery (e.g. coverage.c) in which case it won't + have a lang_specific structure attached and DECL_CONSTRUCTOR_P + will crash. In this case it is safe just to print out the + literal name. */ + if (!DECL_LANG_SPECIFIC (t)) + { + pp_cxx_tree_identifier (cxx_pp, name); + return; + } + + if (TREE_CODE (t) == TEMPLATE_DECL) + t = DECL_TEMPLATE_RESULT (t); + + /* Don't let the user see __comp_ctor et al. */ + if (DECL_CONSTRUCTOR_P (t) + || DECL_DESTRUCTOR_P (t)) + { + if (LAMBDA_TYPE_P (DECL_CONTEXT (t))) + name = get_identifier (""); + else + name = constructor_name (DECL_CONTEXT (t)); + } + + if (DECL_DESTRUCTOR_P (t)) + { + pp_cxx_complement (cxx_pp); + dump_decl (name, TFF_PLAIN_IDENTIFIER); + } + else if (DECL_CONV_FN_P (t)) + { + /* This cannot use the hack that the operator's return + type is stashed off of its name because it may be + used for error reporting. In the case of conflicting + 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_cxx_ws_string (cxx_pp, "operator"); + dump_type (TREE_TYPE (TREE_TYPE (t)), flags); + } + else if (name && IDENTIFIER_OPNAME_P (name)) + pp_cxx_tree_identifier (cxx_pp, name); + else + dump_decl (name, flags); + + if (DECL_TEMPLATE_INFO (t) + && !DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t) + && (TREE_CODE (DECL_TI_TEMPLATE (t)) != TEMPLATE_DECL + || PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (t)))) + dump_template_parms (DECL_TEMPLATE_INFO (t), !DECL_USE_TEMPLATE (t), flags); +} + +/* Dump the template parameters from the template info INFO under control of + FLAGS. PRIMARY indicates whether this is a primary template decl, or + specialization (partial or complete). For partial specializations we show + the specialized parameter values. For a primary template we show no + decoration. */ + +static void +dump_template_parms (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); + pp_cxx_begin_template_argument_list (cxx_pp); + + /* Be careful only to print things when we have them, so as not + to crash producing error messages. */ + if (args && !primary) + { + int len, ix; + len = get_non_default_template_args_count (args, flags); + + args = INNERMOST_TEMPLATE_ARGS (args); + for (ix = 0; ix != len; ix++) + { + tree arg = TREE_VEC_ELT (args, ix); + + /* Only print a comma if we know there is an argument coming. In + the case of an empty template argument pack, no actual + argument will be printed. */ + if (ix + && (!ARGUMENT_PACK_P (arg) + || TREE_VEC_LENGTH (ARGUMENT_PACK_ARGS (arg)) > 0)) + pp_separate_with_comma (cxx_pp); + + if (!arg) + pp_string (cxx_pp, M_("